国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

document.onreadystatechange事件的用法分析

2024-05-06 16:13:42
字體:
來源:轉載
供稿:網友
這兩天,正在給部門的一個項目做優(yōu)化,其中一項是將web應用中的所有alert用div方式實現,javascript的相關方法都寫好了,方法名為showDialog,前臺頁面調用showDialog方法一點也沒有問題,可是頁面一旦提交,從后臺輸出腳本,調用showDialog方法,就會時不時的出現問題了,報一個無法打開Internet站點的錯誤,在腳本中下斷點調試,依然找不到問題的根源,最后到網上一查,這個問題有可能是頁面沒有完全加載造成的,于是乎,修改后臺輸出腳本的代碼,將其改為 
document.onreadystatechange=function() { if(document.readyState == 'complete'){ showDialog('來自網頁的消息','用戶名或密碼錯誤,請重新輸入!','warning'); } }; 
問題解決,一切OK! 
復制代碼代碼如下:

document.onreadystatechange = subSomething;//當頁面加載狀態(tài)改變的時候執(zhí)行這個方法. 
function subSomething() 

if(document.readyState == "complete"){ //當頁面加載狀態(tài)為完全結束時進入 
//你要做的操作。 


說明 :onreadystatechange 事件能辨識readyState 屬性的改變。 
關于onreadystatechange屬性的一點疑問 
在編寫Ajax方法的時候,我們經常會寫上類似于這樣的代碼: 
復制代碼代碼如下:

<script type="text/javascript"> 
var xmlHttp; 
//創(chuàng)建一個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)...{//描述一種"已加載"狀態(tài);此時,響應已經被完全接收。 
if(xmlHttp.status == 200)...{//200表示成功收到 
alert("The Server Replied with:" + xmlHttp.responseText) 



</script> 

第一次閱讀這段代碼的時候,我就感到了一點點不對勁,但是說不出來什么地方不對勁。隨著對Ajax代碼的進一步了解,這種感覺時刻伴隨著我。 
后來,我知道了這種感覺來自于什么地方。 
看看startRequest函數。我們發(fā)現xmlHttp.onreadystatechange指向了一個函數,這個函數是在xmlHttpRequest.readyState發(fā)生改變的時候觸發(fā)。我們再來看startRequest函數,想象一下整個請求發(fā)送的步驟。現在我們點擊一個按鈕,觸發(fā)了一個startRequest函數。函數往下走,第一步是createXmlHttpRequest(),它的作用是創(chuàng)建一個xmlHttpRequest對象,當它完畢的時候,xmlHttpRequest.readyState的值是0(window.alert跟蹤得到的),程序繼續(xù)往下走,xmlHttp.onreadystatechange = handlestatechange,因為狀態(tài)沒有改變(xmlHttpRequest.readyState的值是0),所以不觸發(fā)函數,緊接著是Open()和Send(),那么,整個函數從頭到尾都應該沒有觸發(fā)handlestatechange函數啊,但是為什么出來的結果是正確的呢? 
后來我用window.alert跟蹤xmlHttp.readystate的變化,發(fā)現于原來它運行的機制是這樣的。首先創(chuàng)建一個xmlHttpRequest的對象之后xmlHttp.readyState的值是0了,然后xmlHttp.onreadystatechange = handlestatechange沒有運行。緊接著是open(),這個函數發(fā)生了之后xmlHttp.readyState的值是1了,那么就會有一個斷點在Open()函數處斷開,保留現場,緊接著又返回到xmlHttp.onreadystatechange = handlestatechange運行,然后再執(zhí)行Send()函數,這個函數發(fā)生了之后xmlHttp.readyState的值是2了,接著又返回到xmlHttp.onreadystatechange = handlestatechange運行。以此類推。 
瀏覽器因為不能真正地像面向對象那么編程,所以找了個折衷的辦法,但是這個辦法看起來不倫不類,想了半天,再跟一個同學一起討論,才得出這樣的一個結果。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 和林格尔县| 海宁市| 巨鹿县| 察雅县| 建平县| 大冶市| 莱阳市| 榆树市| 泰和县| 绥阳县| 湾仔区| 临颍县| 酒泉市| 贡嘎县| 蒙山县| 衡山县| 荃湾区| 巧家县| 永定县| 西乌珠穆沁旗| 阿克| 无极县| 砚山县| 县级市| 兴仁县| 虹口区| 岳池县| 宜兰县| 买车| 多伦县| 新野县| 定南县| 大丰市| 遂昌县| 克东县| 当雄县| 东丰县| 浏阳市| 钦州市| 汉川市| 新泰市|