我的背景是传统的编译型面向对象语言,如C++和.NET编程,现在我正在涉猎一些JavaScript用于一个新项目。我正在尝试使用AJAX,并遇到了一个关于浏览器如何管理对象的令人困惑的方面。
[编辑#2] - 活动内容脚本更改
我有一个练习页面,其中包含三个按钮,每个按钮都使用XMLHttpRequest
对象更新<textarea>
:
- 按钮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发送第二个请求会如何影响第一个请求的响应时间?这可能是一个服务器端的问题吗?
xmlhttp
变量在loadXMLDoc
内部是局部作用域。 - Tyiloxmlhttp.send()
之前加上xmlhttp.setRequestHeader("If-Modified-Since", new Date(0));
吗?另外,正如上面所述,任何浏览器都不应该“合并”请求。 - bkconrad