4

我想我发现了一个问题,即 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 并引发错误。

未发送请求 状态为 0 的断点

我相信这是 Chrome 的一个问题,但我想我会在将其作为错误提交给他们之前将其发布在这里,以防万一我遗漏了一些简单的东西。

此外,从异步请求更改为同步请求可以解决问题,但这不是我想要采取的路线。

谢谢 !

4

1 回答 1

2

我遇到了同样的 Chrome 错误,我能够用你的代码确认它。我发现的解决方法是将随机参数附加到 URL(类似于 ?rand=XYZ,以使 URL 唯一),然后使用新 URL 重新尝试原始 AJAX 请求。

根据我的测试,这里有一些可能有用的信息:

  • 我能够在最新的稳定版 Chrome 上重现该错误:28.0.1500.95

  • 我只能在 Windows 版本上重现该错误。我还在 OSX 上测试了相同版本的 Chrome,但我无法在那里重现它。

  • 当 AJAX 请求因离开页面而中断并在该选项卡的整个生命周期内持续存在时,就会出现该错误(这就是为什么刷新测试页面直到出现错误很重要的原因)。一旦请求失败,即使重新加载页面,同一选项卡中对该资源的所有未来请求都将失败。

于 2013-08-06T09:08:12.630 回答