【问题标题】:When should XMLHttpRequest's onerror handler fireXMLHttpRequest 的 onerror 处理程序应该何时触发
【发布时间】:2012-05-14 13:31:05
【问题描述】:

我在理解XMLHttpRequest 的处理程序时有点问题。 The specification says this about the onerror handler:

error [Dispatched ... ] 当请求失败时。

load [Dispatched ... ] 当请求成功完成时。

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

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

另外,我想知道这是否意味着 onerroronload 不应该同时触发。

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

我问是因为使用最新的 Opera 快照,我发现 onload 即使在 404 状态码上也会被触发。我知道测试status 是肯定的选择,但我想知道这是我必须按照规范执行的操作,还是只是针对 Opera 中的错误的一种解决方法。

【问题讨论】:

  • 我认为has completed successfully 表示您收到状态代码,无论是 200 OK 还是错误代码(例如 404)。即使状态代码是错误状态代码,Chrome 也会触发 onload。
  • onerror 和 onload 不会同时触发。它是一个或另一个。但是 onloadend 在这两种情况下都会触发,并且是该行中的最后一个事件。

标签: javascript ajax xmlhttprequest


【解决方案1】:

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

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

【讨论】:

  • 嗯,奇怪。你(或任何人)能解释一下谷歌服务器的行为吗?
  • 我做了一个更完整的测试,发现 encrypted.google.com 并没有为那个请求发送 404 —— XHR 请求的status 成员实际上是0,其他服务器在那里发送 404。显然,当服务器看到对不存在的页面的请求时,它突然假装它根本不存在。很奇怪,但这是 Google 的决定。
  • 或者...可能是因为点击https://encrypted.google.com/foobar会重定向到http://www.google.com/foobar,并且浏览器在Ajax请求期间拒绝参与跨域重定向。
  • 就是这样。浏览器向http://www.google.com/foobar 发送请求,看到回复中没有Access-Control-Allow-Origin 标头并拒绝向脚本提供任何内容。
  • 如何区分发生了什么网络级故障?我能想到的几个是:DNS查找失败,连接被拒绝,尝试联系服务器超时,等待回复超时,由于CORS而被拒绝,连接异常终止。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多