Javascript XMLHttpRequest应该在什么时候启动';s onerror处理程序火灾

Javascript XMLHttpRequest应该在什么时候启动';s onerror处理程序火灾,javascript,ajax,xmlhttprequest,Javascript,Ajax,Xmlhttprequest,我在理解XMLHttpRequest的处理程序时有点问题: 当请求失败时,错误[已调度…] 请求成功完成时加载[已调度…] 问题是,“请求失败”是什么意思。那可能是 根本无法发出请求(例如,连接被拒绝和此类错误),或 上面的错误加上服务器返回的错误代码(例如404) 另外,我想知道这是否意味着onerror和onload不应该同时触发 指示应根据状态执行onerror处理程序,根据readyState执行onload。这表明它们不是相互排斥的,但是,我认为这不是一个权威信息 我这样问是因为使

我在理解
XMLHttpRequest
的处理程序时有点问题:

当请求失败时,
错误
[已调度…]

请求成功完成时加载[已调度…]

问题是,“请求失败”是什么意思。那可能是

  • 根本无法发出请求(例如,连接被拒绝和此类错误),或
  • 上面的错误加上服务器返回的错误代码(例如404)
另外,我想知道这是否意味着
onerror
onload
不应该同时触发

指示应根据
状态执行
onerror
处理程序,根据
readyState
执行
onload
。这表明它们不是相互排斥的,但是,我认为这不是一个权威信息


我这样问是因为使用最新的Opera快照,我发现即使在404状态码上也会触发
onload
。我知道测试
status
是一个确定的赌注,但我想知道这是我必须按照规范做的事情,还是仅仅是Opera中一个bug的解决方法。

如评论中所述,
onerror
在网络级出现故障时触发。如果错误仅存在于应用程序级别,例如,发送HTTP错误代码,则仍会触发
onload
。您需要在
onreadystatechange
处理程序中显式测试返回的状态代码


请注意,被拒绝的跨域请求还将触发
onerror
处理程序。

除了apsillers的应答之外,请注意XMLHttpRequest在后台自动处理重定向,因此您不必在
onload
事件中检查此应答代码(此事件仅在最后一次调用时调用一次)。还要注意,如果使用POST方法发送有效负载数据,并且请求被重定向,XMLHttpRequest会将方法从
POST
更改为
GET
,并出于安全原因丢弃任何有效负载数据。
onload
事件仍将被调用,但您需要再次手动将请求重新发送到新目的地。

I take
已成功完成
表示您收到状态码,无论是200 OK还是404等错误码。即使状态代码是错误状态代码,Chrome也会触发onload。onerror和onload不会同时触发。不是一个就是另一个。然而,onloadend在这两种情况下都会触发,并且是行中的最后一个事件。嗯,奇怪。你(或任何人)能解释一下谷歌服务器的这种行为吗?我做了一个更完整的测试,发现encrypted.google.com没有为该请求发送404——XHR请求的
状态
成员实际上是
0
,其他服务器发送404。显然,当服务器看到一个不存在的页面请求时,它突然假装它根本不存在。奇怪,但这是谷歌的决定。或者。。。这可能是因为点击
https://encrypted.google.com/foobar
重定向到
http://www.google.com/foobar
,浏览器拒绝在Ajax请求期间参与跨域重定向。这就是原因。浏览器向
http://www.google.com/foobar
,发现回复中没有
访问控制允许来源
标题,并拒绝向脚本提供任何信息。如何区分发生的网络级故障?我能想到的几个是:DNS查找失败、连接被拒绝、尝试联系服务器超时、等待回复超时、由于CORS而被拒绝以及连接异常终止。