56

我只需要支持主流的现代浏览器(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 文档在这方面不是很清楚。

澄清:

我选择不使用框架。

4

4 回答 4

19

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

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

于 2013-02-18T22:32:33.613 回答
16

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

活动

所有浏览器都支持将 onreadystatechange 作为 xhr 对象的属性。

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

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

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

于 2013-02-18T22:28:40.657 回答
3

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

总结一下,忘掉onreadystatechange

于 2017-07-20T19:41:10.503 回答
1

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

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

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

xhr.onerror = function(){
    console.log('Error: Do something else...');
}
于 2017-09-03T08:03:15.893 回答