[英]why is .innerHTML changed before xmlhttp.open() and .send()?
我正在學習使用 xmlhttprequest/AJAX。 在 w3schools 的這個示例代碼中,我不明白為什么這一行:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
在此之前:
xmlhttp.open("GET","demo_get.asp",true);
xmlhttp.send();
我的想法是,您應該在有任何 responseText 可以使用之前發送 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>
有問題的行在xmlhttp.onreadystatechange
內部,它是一個 function。注意它是如何使用的:
xmlhttp.onreadystatechange = function ()
{
...
}
在這種情況下,它是一個回調 function - 它在 ajax 請求(又名xmlhttp.send()
)完成時調用。
在深入了解 ajax 之前,您可能需要溫習一下 javascript。
您剛剛發現了 AJAX 字的異步部分:-)
即使稍后調用.send()
方法,也會更早地進行innerHTML
調用。
這怎么行?!
因為 AJAX 調用是異步的。 因此,這不像在 PHP 中進行數據庫調用:您進行調用,等待結果,然后使用它。 沒有。
在 JS 中,對於 AJAX 調用,您定義一個回調function。它是一個 function,一旦響應到達就會被調用。
對於 XMLHttpRequest object,響應返回時觸發的是onreadystatechange
事件。 如果你在這個事件中注冊了一個function,這個function會在response回來的時候被調用。
PS:一旦響應返回, onreadystatechange
中的 function 將不會被觸發,但這是為了解釋。 要了解此事件何時觸發,請查看不同的狀態。
它沒有。 考慮這段代碼:
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
它不執行 function 內部的代碼,它只創建 function 並將其分配給一個屬性。 當 state 發生變化時,function 將由 XMLHTTP object 執行,它會捕獲 state 的變化,這意味着響應已經到達。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.