关于onreadystatechange属性(转)
生活随笔
收集整理的這篇文章主要介紹了
关于onreadystatechange属性(转)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于onreadystatechange屬性(轉)
在編寫Ajax方法的時候,我們經常會寫上類似于這樣的代碼:Javascript代碼
第一次閱讀這段代碼的時候,我就感到了一點點不對勁,但是說不出來什么地方不對勁。隨著對Ajax代碼的進一步了解,這種感覺時刻伴隨著我。
??? 后來,我知道了這種感覺來自于什么地方。
??? 看看startRequest函數。我們發現xmlHttp.onreadystatechange指向了一個函數,這個函數是在xmlHttpRequest.readyState發生改變的時候觸發。我們再來看startRequest函數,想象一下整個請求發送的步驟。現在我們點擊一個按鈕,觸發了一個startRequest函數。函數往下走,第一步是createXmlHttpRequest(),它的作用是創建一個xmlHttpRequest對象,當它完畢的時候,xmlHttpRequest.readyState的值是0(window.alert跟蹤得到的),程序繼續往下走,xmlHttp.onreadystatechange = handlestatechange,因為狀態沒有改變(xmlHttpRequest.readyState的值是0),所以不觸發函數,緊接著是Open()和Send(),那么,整個函數從頭到尾都應該沒有觸發handlestatechange函數啊,但是為什么出來的結果是正確的呢?
??? 后來我用window.alert跟蹤xmlHttp.readystate的變化,發現于原來它運行的機制是這樣的。首先創建一個xmlHttpRequest的對象之后xmlHttp.readyState的值是0了,然后xmlHttp.onreadystatechange = handlestatechange沒有運行。緊接著是open(),這個函數發生了之后xmlHttp.readyState的值是1了,那么就會有一個斷點在Open()函數處斷開,保留現場,緊接著又返回到xmlHttp.onreadystatechange = handlestatechange運行,然后再執行Send()函數,這個函數發生了之后xmlHttp.readyState的值是2了,接著又返回到xmlHttp.onreadystatechange = handlestatechange運行。以此類推。
??? 瀏覽器因為不能真正地像面向對象那么編程,所以找了個折衷的辦法,但是這個辦法看起來不倫不類,想了半天,再跟一個同學一起討論,才得出這樣的一個結果。
總結
以上是生活随笔為你收集整理的关于onreadystatechange属性(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:王楠,博士,就职于郑州商品交易所期
- 下一篇: 作者:周涛,男,博士,教授级高工,就职于