第二次加载时XMLHttpRequest状态为0

XMLHttpRequest status 0 on second load

本文关键字:状态 XMLHttpRequest 加载 第二次      更新时间:2023-09-26

当我尝试使用XMLHttpRequest从同一域加载。txt格式的一些数据时,我遇到了一个有趣的问题。我正在尝试加载数据,解析它然后将其存储在localStorage

var xmlhttp;
// code for IE7+, Firefox, Chrome, Opera, Safari
if (window.XMLHttpRequest){
    xmlhttp=new XMLHttpRequest();
}else{
    // code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
var temp;
xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
        temp = xmlhttp.responseText;
    }else{
        alert("readyState: " + xmlhttp.readyState + "status: " + xmlhttp.status);
    }
}
xmlhttp.open("GET","data/somedata.txt", false);
xmlhttp.send();

这段代码只有在清理历史和缓存时才有效;然而,在第二次点击相同的链接时,由于某种原因,我会收到"Readystate: 4, status 0"。

这是否与localStorage有关?

if (!localStorage.somedata || localStorage.somedata.count(':') !== somedata.count(':')) {
  localStorage.somedata = temp;
}
window.somedata = JSON.parse(localStorage.somedata);

状态码为零有两种原因

  1. 从文件协议发起呼叫。
  2. 当请求发出时,页面正在刷新/导航。

在你的情况下,我认为是#2。如果您正在使用按钮或链接来进行Ajax调用,请确保使用preventDefaultreturn false取消单击操作。

听起来像是缓存问题。尝试切换到POST方法,或者向GET请求查询字符串添加时间戳,看看是否会阻止缓存。

xmlhttp.open("POST", "data/somedata.txt", false); 

或:

xmlhttp.open("GET", "data/somedata.txt?" + new Date().valueOf(), false);

Edit:如果这些不起作用,请修改您的服务器配置,为该文件或类型发送适当的响应头,以不缓存响应。Ie: Cache-Control: no-cache

在打开新请求之前尝试xmlhttp.abort()