【问题标题】:XMLHttpRequest status 0 on second load第二次加载时 XMLHttpRequest 状态为 0
【发布时间】:2011-09-28 07:19:30
【问题描述】:

当我尝试使用 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);

【问题讨论】:

  • 我假设浏览器缓存了文件,所以你只有第一次得到“200 OK”状态。重复请求应导致“304 Not Modified”。我不确定你为什么会得到 0...
  • @ŠimeVidas 也许如果根本没有发出请求,并且页面只是从缓存中提供的?
  • @lonesomeday 是的,我想就是这样......

标签: javascript html xmlhttprequest


【解决方案1】:

状态码为零的原因有两个。

  1. 从文件协议进行调用。
  2. 在发出请求时页面正在刷新/导航离开。

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

【讨论】:

  • 虽然您的回答可能对这个问题有最有价值的信息,但我相信您的假设是错误的。提到了刷新,但在任何请求期间都没有。
  • @epascarello 虽然它不是一个按钮。每次加载应用程序时都会调用它。我试图放入一个函数并返回;如果没有互联网连接。但是,这也不能解决问题。有 javascript 在本地服务器上的 ruby​​ 上运行。这和问题有关系吗?
  • 代码是如何被调用的?如果没有使页面刷新的按钮/链接,是否有其他事件改变了页面?
  • @epascarello 每次页面加载时都会直接调用此代码,因为 .txt 文件一直在更新。我觉得这段代码受 .erb 文件其他部分的影响。
【解决方案2】:

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

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

或:

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

编辑:如果这些不起作用,请修改您的服务器配置以发送该文件的适当响应标头或键入不缓存响应。即:Cache-Control: no-cache

【讨论】:

  • 我之前尝试过 POST。我得到了状态= 404 ...我只是尝试将时间戳添加到GET,仍然得到状态0
  • 您可能必须修改您的服务器设置,以将不缓存的文件或文件类型的标头发回。
  • @user959974 检查 Chrome 开发工具中的网络选项卡。每次都发出 HTTP 请求吗?
  • 状态零与缓存无关。
  • @epascarello 你怎么知道的?
【解决方案3】:

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

这是一个漫长的尝试,但值得一试。

【讨论】:

  • 你可以同时打开多个请求,abort在这里什么都不做。
  • 这取决于使用它的范围和上下文。鉴于以上信息,无法判断。因此,这将是一个漫长的过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2016-04-30
相关资源
最近更新 更多