理解XMLHttpRequest
的处理程序时遇到一些问题。 The specification says this about the onerror
handler:
error
[已调度...]请求失败时。
load
[已调度...]请求成功完成后。
问题是,“请求失败了”是什么意思。那可能是
此外,我想知道这是否意味着onerror
和onload
永远不会同时开火。
This reference表示onerror
处理程序应执行,具体取决于status
代码和onload
,具体取决于readyState
。这表明它们并不是相互排斥的,但我认为这不是权威信息。
我问,因为使用最新的Opera快照,我发现即使在404状态代码上也会触发onload
。我知道测试status
是一个肯定的赌注,但我想知道这是否是我必须按照规范做的事情,或者只是解决Opera中的错误。
答案 0 :(得分:63)
如评论中所述,当{em>网络级别出现故障时,onerror
会触发。如果错误仅存在于应用程序级别,例如,发送HTTP错误代码,则onload
仍然会触发。您需要在onreadystatechange
处理程序中明确地测试返回的状态代码。
请注意,拒绝的跨域请求也会触发onerror
处理程序。
答案 1 :(得分:2)
除了apsillers的回答之外,请注意XMLHttpRequest会在后台自动处理重定向,因此您无需在onload
事件中检查此回复代码(此事件仅会被调用一次 - 在最后的电话)。另请注意,如果您使用POST方法发送有效内容数据,并且请求被重定向,则XMLHttpRequest会将方法从POST
更改为GET
,并出于安全原因丢弃所有有效内容数据。仍会调用onload
事件,但您需要再次手动将请求重新发送到新目的地。