2012-04-10 34 views
0

我正在學習使用xmlhttprequest/AJAX。在從W3Schools的這個樣本代碼,我不明白爲什麼這條線:爲什麼.innerHTML在xmlhttp.open()和.send()之前更改?

document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 

此之前:

xmlhttp.open("GET","demo_get.asp",true); 
xmlhttp.send(); 

我想它的樣子,你應該有你先發送GET請求任何迴應文字做任何事情。我的理解錯誤在哪裏?

<html> 
<head> 
<script type="text/javascript"> 
function loadXMLDoc() 
{ 
var xmlhttp; 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 
xmlhttp.open("GET","demo_get.asp",true); 
xmlhttp.send(); 
} 
</script> 
</head> 
<body> 

<h2>AJAX</h2> 
<button type="button" onclick="loadXMLDoc()">Request data</button> 
<div id="myDiv"></div> 

</body> 
</html> 

回答

3

該問題行在xmlhttp.onreadystatechange之內,這是一個函數。注意它是如何使用:

xmlhttp.onreadystatechange = function() 
{ 
    ... 
} 

在這種情況下,它是一個回調函數 - Ajax請求(又名xmlhttp.send())完成時,它被調用。

在潛入ajax之前,您可能想要刷上您的javascript。

+0

我學習,我去了:)鑑於目前對學校和研究的要求,我有很少的選擇。 – Aerovistae 2012-04-10 07:28:05

+0

「ajax請求完成時調用它」 - >不完全是:-)每次狀態更改時它都會被觸發。狀態列表:https://developer.mozilla.org/en/XMLHttpRequest#readyState – 2012-04-10 08:55:17

1

它沒有。考慮以下代碼:

xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 

它不執行函數裏面的代碼,它僅創建功能,並將其分配給一個屬性。當狀態改變時,該函數將由XMLHTTP對象執行,並且它將捕獲狀態改變,這意味着響應已經到達。

1

你剛纔發現了AJAX字的異步部分:-)

即使.send()方法後來被稱爲的innerHTML調用早些時候。

這是怎麼回事?!

因爲AJAX調用是異步。因此,它不像使用PHP進行數據庫調用:您打電話,等待結果並使用它。不。

在JS中,對於AJAX調用,您可以定義一個回調函數。一旦響應到達,該功能將被稱爲

對於XMLHttpRequest對象,它是響應返回時觸發的onreadystatechange事件。如果你在這個事件中註冊了一個函數,當這個函數返回時,這個函數將被稱爲

P.S .: onreadystatechange中的函數在響應返回時不會被正確觸發,但這是爲了解釋。要知道此事件何時開始,請查看different states

相關問題