我有一个网站,我输入用户名/密码并单击登录按钮。登录按钮创建一个 XMLHttpRequest 对象,并触发它。
在 Chrome、Firefox、Opera、Safari、Android 设备、iOS 设备上,这工作正常。 只要我使用 HTTP 地址而不使用 HTTPS,IE9 就可以正常工作。
在 HTTPS 上,IE9 的行为如下:
第一个登录请求永远不会返回任何东西。 F12 屏幕确实在网络选项卡中显示了我的登录请求,并且一切看起来都是正确的。脚本标签永远不会抛出错误。什么也没有发生。
这是疯狂的部分: - 如果我第二次点击登录,它确实有效。 - 如果我在浏览器上单击刷新,然后登录,那也可以!
我提出如下要求:
var x = new XMLHttpRequest();
x.open("POST", "/Relative/URL/Path", true);
x.setRequestHeader("Content-Type", "text/plain");
x.onreadystatechange = function () {
if ((x.readyState == 4) && (x.status == 200)) {
// handle callback
}
}
x.send(my request);
如果失败,调试器将从 x.send() 行转到 onreadystatechange 代码。 readyState 将为 1。这将是我最后一次调试,因为没有其他任何事情发生。
如有任何想法,我们将不胜感激。
[编辑]:我让一个请求去看看会发生什么。 onreadystatechange 事件再次触发,readyState = 4 和 status = 12152。IE9 的 F12 屏幕中的 WebView 显示结果为 Aborted,所用时间为 1589.07s。谷歌搜索显示这意味着服务器上的连接已关闭。
[编辑 2]:根据下面的评论,我重新编写了这段代码以仅使用 jQuery 的 ajax() 方法。我认为这可能有机会消除我的错误代码。没有这样的运气。发生相同的行为。
$.ajax({
"url": sUrl,
"success": function (data, textStatus, x) {
workerCallback(data, id, "");
},
"error": function (x, testStatus, errorThrown) {
workerCallback("nc", id, errorThrown);
},
"contentType": "text/plain",
"data": JSON.stringify(req),
"dataType": "json",
"timeout": 1600000,
"type": "POST"
});
[最终更新:] 我已经更新了代码。如果发生超时,我只需重新发布相同的请求 - 仅一次。相当黑客,但它的工作原理。除非有人找到解决方案,否则我会将赏金分配给人们在下面提出的一些有用的想法。
最佳答案
这似乎是一个奇怪的问题,如果不在 https 站点上查看代码就很难对其进行测试。
如果您想要快速修复,您可以尝试执行初始(虚拟)请求,然后使用较短的 setTimeout 立即中止它并发出第二个(真实)请求。
根据您的描述,它应该可以工作。
关于javascript - 第一个 XMLHttpRequest 失败但仅在 IE9 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12673795/