我的背景是传统的编译型面向对象语言,例如 C++ 和 .NET 编程,现在我正在为一个新项目涉足一些 JavaScript。我正在涉足 AJAX,并遇到了一个令人困惑的方面,即浏览器如何管理对象。
[编辑 #2] - 活动内容脚本的更改
我有一个带有三个按钮的练习页面,每个按钮更新一个<textarea>
使用XMLHttpRequest
对象:
- 按钮 1 使用来自slowtime.php的文本内容更新 TextArea1
- 按钮 2 使用来自slowtime.php的文本内容更新 TextArea2
- 按钮 3 使用来自fasttime.php的文本内容更新 TextArea3
其中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 发送第二个请求如何影响第一个请求的响应时间?这可能是服务器端问题吗?