一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

document.onreadystatechange事件的用法分析

這兩天,正在給部門的一個項目做優化,其中一項是將web應用中的所有alert用div方式實現,Javascript的相關方法都寫好了,方法名為showDialog,前臺頁面調用showDialog方法一點也沒有問題,可是頁面一旦提交,從后臺輸出腳本,調用showDialog方法,就會時不時的出現問題了,報一個無法打開InterNET站點的錯誤,在腳本中下斷點調試,依然找不到問題的根源,最后到網上一查,這個問題有可能是頁面沒有完全加載造成的,于是乎,修改后臺輸出腳本的代碼,將其改為
document.onreadystatechange=function() { if(document.readyState == 'complete'){ showDialog('來自網頁的消息','用戶名或密碼錯誤,請重新輸入!','warning'); } };
問題解決,一切OK!
復制代碼 代碼如下:
document.onreadystatechange = subSomething;//當頁面加載狀態改變的時候執行這個方法.
function subSomething()
{
if(document.readyState == "complete"){ //當頁面加載狀態為完全結束時進入
//你要做的操作。
}
}

說明 :onreadystatechange 事件能辨識readyState 屬性的改變。

關于onreadystatechange屬性的一點疑問
在編寫Ajax方法的時候,我們經常會寫上類似于這樣的代碼:
復制代碼 代碼如下:
<script type="text/Javascript">
var xmlHttp;
//創建一個XmlHttpRequeset對象
function createXMLHttpRequest()...{
if(window.ActiveXObject)...{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)...{
xmlHttp = new XMLHttpRequest();
}
}
//開始一個請求
function startRequest()...{

createXMLHttpRequest();
xmlHttp.onreadystatechange = handlestatechange;
xmlHttp.open("GET", "SimpleRespose.xml", true);
xmlHttp.Send(null);
}

function handlestatechange()...{
if(xmlHttp.readyState == 4)...{//描述一種"已加載"狀態;此時,響應已經被完全接收。
if(xmlHttp.status == 200)...{//200表示成功收到
alert("The Server Replied with:" + xmlHttp.responseText)
}
}
}
</script>

第一次閱讀這段代碼的時候,我就感到了一點點不對勁,但是說不出來什么地方不對勁。隨著對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運行。以此類推。

瀏覽器因為不能真正地像面向對象那么編程,所以找了個折衷的辦法,但是這個辦法看起來不倫不類,想了半天,再跟一個同學一起討論,才得出這樣的一個結果。

JavaScript技術document.onreadystatechange事件的用法分析,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美日韩一区妖精视频yjsp | 亚洲人成综合在线播放 | 99国产高清久久久久久网站 | 国产亚洲欧洲国产综合一区 | 精品久久久久久久久久久久久久久 | 黄色小视频在线免费看 | 男人操女人免费视频 | 国产91观看 | 欧美日韩一区妖精视频yjsp | 国产白白视频在线观看2 | 婷婷色综合网 | 亚洲精品女同中文字幕在线 | 国产欧美激情一区二区三区 | 激情视频图片小说 | 女人被爽到呻吟娇喘的视频动态图 | 亚洲小视频在线播放 | 精品在线小视频 | 国产成人午夜精品5599 | 久久网综合 | 国产成人精品免费视频大全可播放的 | 久久精品成人国产午夜 | 欧美特黄a级高清免费大片 欧美特黄a级高清免费看片 | 久久久久久久久久综合情日本 | 国产精品亚欧美一区二区三区 | 精品国产免费一区二区 | 欧美特黄高清免费观看的 | 精品视频免费看 | 国产1区2区3区在线观看 | 国产欧美精品一区二区三区四区 | 男女免费爽爽爽在线视频 | 国产秒拍 | 亚洲综合色一区二区三区另类 | 性欧美激情在线观看 | 国产极品嫩模在线观看91精品 | 天天干天天色天天干 | 黑人专区 | 美女又爽又黄免费 | 久久99国产精品久久99软件 | 国产福利萌白酱喷水视频铁牛 | 成人永久免费视频 | 日韩激情影院 |