【问题标题】:Can one replace xhr.onreadystatechange with xhr.onload for AJAX calls?可以用 xhr.onload 替换 xhr.onreadystatechange 来进行 AJAX 调用吗?
【发布时间】:2013-02-03 11:21:32
【问题描述】:

我只需要支持主流的现代浏览器(IE10+、FF、Chrome、Safari)

我可以做这个替换,因为我想简化我的代码库:

发件人:

xhr.onreadystatechange = function () {
    if (this.readyState === 4) {
        if (this.status === 200) {
            o.callback(xhr.responseText);
        } else {
            return false;
        }
    } else {
        return false;
    }
};

收件人:

xhr.onload = function (test) {
    o.callback(xhr.responseText);
};

我觉得MDN documentation在这方面不是很清楚。

澄清:

我选择不使用框架。

【问题讨论】:

  • 它们在功能上是等效的,因为如果请求失败,您什么也不做。
  • @elias94xx “试一试”在这种情况下是不可行的。必须在所有主要浏览器的所有版本上试用它,但仍然无法保证支持。此外,一些浏览器实际上可能不支持他们声称支持的规范,因此在这里查找它也可能不合理。
  • 澄清 = +1 m8

标签: javascript ajax xmlhttprequest


【解决方案1】:

您可以通过这样做来清理您的第一个示例

xhr.onreadystatechange = function () {
    if (this.readyState === 4 && this.status === 200) {
        o.callback(xhr.responseText);
    } else {
        return false;
    }
};

注意,如果您正在使用 else 语句做某事,您可能还想使用 this.status === 200 检查 onload。虽然,如果你正在检查错误,还有onerror,你可以写类似

xhr.onerror = function(){
    console.log('Error: Do something else...');
}

【讨论】:

    【解决方案2】:

    由于最初的提问者说“我只需要支持主要的现代浏览器(IE10+、FF、Chrome、Safari)”,显然onloadonerror 等是要走的路。此外,截至今天,onreadystatechange 几乎已经过时,因为您显然不会支持它仅支持 onreadystatechange 的任何旧东西。

    总而言之,忘记onreadystatechange

    【讨论】:

    【解决方案3】:

    在 MDN 文档中,他们声明了以下内容

    活动

    onreadystatechange 作为 xhr 对象上的属性在所有版本中均受支持 浏览器。

    从那时起,许多额外的事件处理程序在 各种浏览器(onload、onerror、onprogress 等)。这些是 在 Firefox 中支持。特别是,请参阅 nsIXMLHttpRequestEventTarget 并使用 XMLHttpRequest。

    更新的浏览器,包括 Firefox,也支持收听 此外通过标准 addEventListener API 的 XMLHttpRequest 事件 将 on* 属性设置为处理函数。

    所以我认为你可以假设 onreadystatechange 是要走的路,而 onload 是一个可以在浏览器支持的情况下使用的附加功能。 @mr.VVoo 答案是正确的,如有疑问请坚持使用 w3c。

    【讨论】:

      【解决方案4】:

      也许你看看this oneW3C: XMLHttpRequest 如果你的浏览器支持xhr.onload 是一样的。需要 XMLHttpRequest 2)

      如果 xhr.onload 不存在,您还可以编写一个模拟 xhr.onload 的包装函数。 (我认为您需要覆盖XMLHttpRequest.prototype.onload = function(args){//calling onreadystatechanges somehow})。如果您只支持使用 xhr.onload 的现代浏览器 - 最好的解决方案是使用 framework(如 提供包装功能。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多