gpt4 book ai didi

javascript - 谷歌浏览器 28.0.1500.72 及更高版本中 Ajax 打开功能的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:38 24 4
gpt4 key购买 nike

我想我发现了一个问题,在版本 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。

我们在嵌入式网络服务器上对 header 进行了硬编码,以不缓存通过 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>

到 http-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"}

working breakpoint working request

使用 chrome 调试器中的网络选项卡,导航到页面并点击刷新,直到您看到它停止请求 status.shtml 并抛出错误。

no request sent breakpoint with status 0

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

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

谢谢!

最佳答案

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

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

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

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

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

关于javascript - 谷歌浏览器 28.0.1500.72 及更高版本中 Ajax 打开功能的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17981441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com