XMLHttpRequest的onerror处理程序何时应该触发

时间:2012-05-14 13:31:06

标签: javascript ajax xmlhttprequest

理解XMLHttpRequest的处理程序时遇到一些问题。 The specification says this about the onerror handler

  

error [已调度...]请求失败时。

     

load [已调度...]请求成功完成后。

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

  • 根本无法发出请求(例如,拒绝连接和此类错误)或
  • 以上加服务器返回错误代码(例如404)

此外,我想知道这是否意味着onerroronload永远不会同时开火。

This reference表示onerror处理程序应执行,具体取决于status代码和onload,具体取决于readyState。这表明它们并不是相互排斥的,但我认为这不是权威信息。

我问,因为使用最新的Opera快照,我发现即使在404状态代码上也会触发onload。我知道测试status是一个肯定的赌注,但我想知道这是否是我必须按照规范做的事情,或者只是解决Opera中的错误。

2 个答案:

答案 0 :(得分:63)

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

请注意,拒绝的跨域请求也会触发onerror处理程序。

答案 1 :(得分:2)

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