nic*_*las 9 html javascript ajax xmlhttprequest
我的背景是传统的编译面向对象语言,如C++和.NET编程,我现在正在尝试一些新项目的JavaScript.我正在涉足AJAX,并且遇到了浏览器如何管理对象的令人困惑的方面.
[编辑#2] - 更改活动内容脚本
我有一个带有三个按钮的练习页面,每个按钮都更新一个<textarea>使用XMLHttpRequest对象:
凡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>
Run Code Online (Sandbox Code Playgroud)
PHP代码(slowtime.php)
<?php
echo date('h:i:s') . "\n";
sleep(5);
echo date('h:i:s') . "\n";
?>
Run Code Online (Sandbox Code Playgroud)
问题[修订]
浏览器如何管理XMLHttpRequest对象?按下按钮2和3表示每次按下都会实例化一个新对象,并且每个按钮都有独立的事件处理程序.如果对象超过了初始函数调用(因为它们的事件处理程序存活),它们何时从内存中清除/被破坏?
如果XMLHttpRequests是单独的对象,那么向同一个URL发送第二个请求会如何影响第一个请求的响应时间?这可能是服务器端问题吗?
除非在对象上显式调用删除,否则 XMLHttpRequest 的上下文永远不会被删除。在本例中:xmlhttp。如果您希望您的应用程序运行精益和干净,您确实应该以某种方式跟踪该变量并清理它。Javascript 最初是为网页设计的,因此它往往会让事情变得疯狂,除非你自己阻止它。
否则,一旦该对象不再可供任何其他函数使用或有任何剩余的回调,浏览器的垃圾收集器可能会消除该对象。
至于您的事件同时发生的问题,我自己无法重现该问题,这确实让我相信您的 php 配置存在问题。您的服务器是否可能不允许同时运行多个脚本?
这是我服务器上的示例,有一些细微的更改: http://www.seijinohki.net/test.php
| 归档时间: |
|
| 查看次数: |
2063 次 |
| 最近记录: |