2010-11-17 66 views
4

浏览器是Firefox 3.0.10。我正在使用Ajax请求一个页面。响应正在进行中可能处于readyState小于4.同时我正在尝试重新加载页面。请求结束,给出一个空的答复。当Ajax请求正在进行时,重新加载页面会将空响应和状态设置为零

我用警报找到了什么字符串作为响应文本。我假设到此时就绪状态4已到达。为什么它是一个空字符串?

当我提醒xmlhttpobject.status当我提醒发生异常xmlhttpobject.statusText,指出“不可用”它显示为0。

当我在文件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 as,0但仍然浏览器没有重新加载页面,直到30秒。为什么?

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

发生了什么事?

我面对这样的一些事情的原因如下。

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

如果用户在任何请求完成之前重新加载页面,我会得到一个空的响应,在我的计算中存在服务器错误。所以我正在调试Ajax响应,以滤除由于用户按下重新加载而导致连接中断的情况。所以这次我不想显示“无法处理这个请求”,当用户在请求完成之前重新加载页面时。

哦......长话短说。这是一个很长的描述,所以我可以让专家了解我的怀疑。

所以我想要形成上述。

任何类型的答案都会清除我的想法。或者我想说所有类型的答案。

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

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

+0

你正在使用什么浏览器? – 2010-11-17 06:36:33

+0

我的第一行... firefox 3.0.10 – 2010-11-19 12:18:44

+0

尝试降低睡眠时间到10秒也许请求超时30 – Pablo 2010-12-23 16:11:57

回答

1

你在那里使用一个漂亮的旧版本的Firefox。 3.0.10在一年半前就出来了。从那时起,许多变化。有一些旧的Mozilla和Firefox的bug。它们已关闭,Firefox 3处于测试阶段时它们似乎已关闭,但您永远不知道,可能是回归。这是一种可能性:https://bugzilla.mozilla.org/show_bug.cgi?id=511383

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

我建议你(和你的用户)在可能的情况下升级你的Firefox。如果这是不可能的,你必须以某种方式解决这个问题。测试状态== 0并阻止警报开火将是一个开始的地方。您也可以在窗口的onBeforeUnload事件中设置一个标志。

+0

IE相同。 FF和IE之间没有区别。今天,因为互联网连接在我的办公室很慢,我不能使用ajax和php进行跨站点脚本,并且由于未决请求我无法重新加载页面...所以我不得不关闭并打开浏览器。无论如何,今天我要检查其他浏览器。除了我所有的项目中都使用了ajax。获得回应并不是我已经对您的建议进行了处理的问题,但页面剂量导航直到返回完整的回复。 – 2010-12-24 04:20:42

+0

从IE获得相同的行为并不令人惊讶。 Firefox的确模拟了一些关于IE的行为,我记得读到这是IE浏览器处理FF错误帖子的方式之一。无论如何,我似乎并不完全明白这个问题。我想我会等待第19 ... – Hemlock 2010-12-24 12:21:02

+0

我会创建一个演示程序,我会在这里发布链接,这样我可以让你明白我面临的是什么。今天是29.dec.2010。 – 2010-12-29 12:05:08

6

这与浏览器版本无关。

当浏览器检测到页面发生变化(例如重新加载)时,它会中止所有XHR调用。每个浏览器都这样做。这是一件体面的事情。

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

我的解决办法是:跟踪所有的Ajax请求,并放弃他们“手动”(是的,你可以这样做:https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#abort()当你离开的页面(onunloadonbeforeunload

0

我也有同样的问题,让我跟你分享我所做的工作 在构造ajax请求时我给出了参数global:false因此,即使我们导航到任何其他页面,通过ajax请求,它会根据需要启动页面

1

我有同样的问题,它原来是PHP会话的问题 如果会话已打开,则来自同一会话的所有其他请求必须等待。

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

这可能是一个问题,如果你使用一些框架,它会自动启动会话。在这种情况下,只需在您所有的长轮询服务器端脚本的开头添加这行:

session_write_close(); 
-1

我碰到了同样的问题来了(在Chrome),对我好像当我打刷新浏览器在xhr请求的中间将其视为错误。因此,如果我们在$.ajax调用中指定了一个错误块,浏览器将弹出此错误。

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

+1

不错,但这可以作为评论而不是答案 – 2017-09-17 23:55:52

相关问题