簡體   English   中英

為什么 is.innerHTML 在 xmlhttp.open() 和 .send() 之前改變了?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM