我想我发现了一个问题,即 28.0.1500.72 版本更新后 ajax 开放功能在 google chrome 中无法正常运行。这个问题最初是使用嵌入式网络服务器作为服务器发现的,但我也能够在 apache 网络服务器上重现它。
当我调用 ajaxObject.open("GET","URL",true) 时会出现问题。这通常有效,但是有时运行 javascript 的客户端 pc 不会发出对 url 的 GET 请求(这已使用wireshark 确认)。此时 ajaxObject.readyState 从 1 变为 2 再变为 4 就好像它正确发送了请求并收到了响应一样。这个问题以前在 chrome 上没有出现,在 IE 或 firefox 上也不是问题。有趣的是,在成功调用时,ajaxObject.readyState 从 1 变为 2、3 和 4。
我们在嵌入式网络服务器上对标头进行了硬编码,以不缓存通过 ajax 获取的请求页面,因为我们需要一遍又一遍地请求页面并刷新其内容。为了在 apache 上复制这个功能,我添加了:
<FilesMatch ".(shtml|html|js|css)$">
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
</FilesMatch>
到 httdp-conf 文件。
以下是我能够重现该问题的 html 页面。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<script type="text/javascript">
function newAjaxObject() {
var xmlHttp;
try { // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
} catch (e) { // Internet Explorer
try {
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("Your browser does not support Javascript/AJAX! Please upgrade your browser.");
return null;
}
}
}
return xmlHttp;
}
function getStatus() {
var ajaxStatus = newAjaxObject();
ajaxStatus.onreadystatechange=function() {
if(ajaxStatus.readyState==4) {
eval('var tester =' + ajaxStatus.responseText);
queueStatusUpdate();
}
}
ajaxStatus.open("GET","status.shtml",true);
ajaxStatus.send(null);
}
// Wait 'timeDelay' milliseconds before requesting an update
var timeDelay = 100;
function queueStatusUpdate() {
setTimeout('getStatus()',timeDelay);
}
</script>
</head>
<body onload="queueStatusUpdate();">
</body>
</html>
这是应该在 status.shtml 页面中的响应文本:
{"status":"Valid Data"}
使用 chrome 调试器中的网络选项卡,导航到页面并点击刷新,直到您看到它停止请求 status.shtml 并引发错误。
我相信这是 Chrome 的一个问题,但我想我会在将其作为错误提交给他们之前将其发布在这里,以防万一我遗漏了一些简单的东西。
此外,从异步请求更改为同步请求可以解决问题,但这不是我想要采取的路线。
谢谢 !