正在进行Ajax请求时重新加载页面会将空响应和状态设置为零

时间:2010-11-17 06:33:18

标签: ajax

浏览器是Firefox 3.0.10。我正在使用Ajax请求页面。响应正在进行中可能处于readyState小于4.同时我正在尝试重新加载页面。请求结束,给出空响应。

我使用alert来查找已作为响应文本提供的字符串。我假设此时达到就绪状态4。为什么它是一个空字符串?

当我提醒xmlhttpobject.status时,它显示为0。

当我提醒xmlhttpobject.statusText发生异常时,声明“NOT AVAILABLE”。

当我阅读文档http://www.devx.com/webdev/Article/33024/0/page/2时,它说3 {4} statusstatusText可用,但是当我测试时,只有状态可用,但不是satausText。

以下是示例代码。

考虑我已经请求了一个页面,我的回调函数如下

function cb(rt)
{
   if(rt.readyState==4)
   {
      alert(rt.status);
      alert(rt.statusText); // which throws an exception
   }
}

我的服务器端脚本如下

sleep(30);
//flushing little drop down code

除此之外,我注意到以下内容。

再次假设我使用Ajax请求上述脚本。 现在将有30秒的空闲时间。 在那30秒之前,我按下刷新。 我得到xmlhttpobject.status为0但是浏览器仍然没有重新加载页面直到那30秒。为什么呢?

当我在Ajax请求完成之前刷新页面时,状态值设置为零,就绪状态设置为4,但页面仍然等待服务器的响应结束。

发生了什么事?

我理解某些事情的原因如下所示。

每当我做一个Ajax请求时,如果进程成功就像插入一些东西或删除一些东西,我弹出一个div表示已成功更新,我将重新加载页面。但如果有任何错误,那么我不会重新加载页面,而只是提醒我无法处理此请求。

如果用户在完成任何这些请求之前重新加载页面,我会得到一个空响应,在我的计算中存在服务器错误。所以我正在调试Ajax响应以过滤掉连接已被中断,因为用户已经按下了重新加载。所以这次当用户在请求完成之前重新加载页面时,我不想显示“无法处理此请求”。

哦......长话故事。这是一个很长的描述,因此我可以让专家了解我的怀疑。

所以我想要的就是上面的内容。

任何类型的答案都会让我清醒。或者我想说出所有类型的答案。

编辑:19月12日。 如果我没有得到任何正确的答案,那么我将删除这个问题,并将用例子重写。否则我会在试验后接受。

我将创建一个演示程序,我将在此处发布链接,以便让您了解我所面对的问题。今天是29.dec.2010。

5 个答案:

答案 0 :(得分:6)

这与浏览器版本无关。

当浏览器检测到页面更改(例如重新加载)时,它会中止所有XHR次呼叫。每个浏览器都这样做。这是件好事。

我的问题是:为什么在ajax请求工作时/你正在重新加载页面?

我的解决方案是:跟踪所有ajax请求并“手动”中止它们(是的,你可以这样做:https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#abort()当你离开页面时onunloadonbeforeunload )。

答案 1 :(得分:1)

你在那里使用的是旧版本的Firefox。 3.0.10在一年半前问世。从那以后,很多都发生了变化。关于这一点,有一些旧的Mozilla和Firefox漏洞。它们已关闭,看起来当Firefox 3处于测试阶段时它们已关闭,但你永远不知道,可能已经出现了回归。这是一种可能性:https://bugzilla.mozilla.org/show_bug.cgi?id=511383

所以,这就是我认为正在发生的事情。我怀疑点击重新加载会导致任何打开的http请求被中止。从历史上看,Firefox并没有很好地处理中止 - 我认为他们打算将readyState设置为0,但是在那里它会循环到4。

我建议您(和您的用户)尽可能升级您的Firefox。如果那是不可能的,你将不得不以某种方式解决这个问题。测试状态== 0并防止警报被触发将是一个开始的地方。您还可以在窗口的onBeforeUnload事件中设置一个标志。

答案 2 :(得分:1)

我遇到了同样的问题,结果证明是PHP会话的问题。 如果会话已打开,则同一会话中的所有其他请求必须等待。

要解决此问题,请确保不要在服务器端脚本中启动新会话。

如果您正在使用某个框架并且它会自动启动会话,则可能会出现问题。在这种情况下,只需在所有长轮询服务器端脚本的开头添加此行:

session_write_close();

答案 3 :(得分:0)

我也有同样的问题,让我与你分享我为使其发挥作用所做的一切。 在构建ajax请求时,我已经给出了参数global:false。因此,即使我们使用ajax请求导航到任何其他页面,它也会根据需要启动页面。

答案 4 :(得分:-1)

我遇到了同样的问题(在Chrome中),对我来说,似乎当我在xhr请求的中间点击刷新时,浏览器会将其视为错误。因此,如果我们在$.ajax调用中指定了错误块,则浏览器会将其作为错误弹出。

作为一种解决方法,我只指定了一个成功块,错误消失了。看起来这是一个应该由浏览器本身处理的场景。