我的背景是傳統編譯的面嚮對象語言,例如C++和.NET編程,現在我正在爲一個新項目引入一些JavaScript。我涉足AJAX,並對瀏覽器管理對象的方式感到困惑。xmlhttprequest對象如何在Javascript中創建,合併和銷燬
[編輯#2] - 改變在活動內容的腳本
我有每個更新一個<textarea>
使用XMLHttpRequest
對象三個按鈕的做法頁:
- 按鈕更新1個TextArea1文本內容來自slowtime.php
- 按鈕2更新TextArea2的文本內容從slowtime.php
- 按鈕3更新TextArea3從fasttime.php
文本內容在哪裏slowtime.php和fasttime.php都與兩個時間戳返回文本/ HTML頁面的簡單腳本:一個時頁面加載,一段時間過後。
每次單擊一個按鈕時,每個按鈕都能正常工作。如果我在第一個請求完成之前單擊按鈕2,然後單擊按鈕3,則更新仍然按預期工作。
如果在第一個請求完成之前單擊按鈕1然後按鈕2,則TextArea1和TextArea2會接收到正確的值;然而,onreadystatechange
事件調用同時發生,即第一次響應遲到,並且僅在第二次響應到達時才處理。
示例代碼
網站
<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(url,target)
{
var xmlhttp;
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById(target).value=xmlhttp.responseText;
}
}
xmlhttp.open("POST",url,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<input type="button" value="Button 1" onClick="loadXMLDoc('slowtime.php','TextArea1')"/>
<input type="button" value="Button 2" onClick="loadXMLDoc('slowtime.php','TextArea2')"/>
<input type="button" value="Button 3" onClick="loadXMLDoc('fasttime.php','TextArea3')"/>
<div><textarea id="TextArea1"></textarea></div>
<div><textarea id="TextArea2"></textarea></div>
<div><textarea id="TextArea3"></textarea></div>
</form>
</body>
</html>
PHP代碼(slowtime.php)
<?php
echo date('h:i:s') . "\n";
sleep(5);
echo date('h:i:s') . "\n";
?>
問題[修正]
瀏覽器如何管理XMLHttpRequest
對象?按下按鈕2和3表示每次按下都會實例化一個新對象,並且每個按鈕都有獨立的事件處理程序。如果對象活過了初始函數調用(因爲它們的事件處理程序存活),它們何時從內存中清除/被破壞?
如果XMLHttpRequests
是單獨的對象,那麼如何向同一個URL發送第二個請求會影響第一個請求的響應時間?可能這是一個服務器端問題?
在你的'xmlhttp.onreadystatechange'函數中,你應該使用'this.responseText'而不是'xmlhttp.responseText'嗎? –
@ JoshuaD.Boyd由於'xmlhttp'變量位於'loadXMLDoc'內的本地範圍內,所以不應該做任何事情。 – Tyilo
在'onreadystatechange'函數中將'xmlhttp'所有對'this'的引用都改變了,並且也產生了相同的行爲 – nicholas