对于AJAX调用,可以用xhr.onload替换xhr.onreadystatechange吗?

时间:2013-02-18 22:14:37

标签: javascript ajax xmlhttprequest

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

澄清:

我选择不使用框架。

4 个答案:

答案 0 :(得分:17)

如果您的浏览器支持xhr.onload,也许您可​​以查看this one并查看W3C: XMLHttpRequest它是一样的。需要XMLHttpRequest 2)

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

答案 1 :(得分:14)

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

  

活动

     总共支持onreadystatechange作为xhr对象的属性   浏览器。

     

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

     

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

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

答案 2 :(得分:1)

由于最初的提问者说'我需要支持主要的现代浏览器(IE10 +,FF,Chrome,Safari)"很明显,onloadonerror等是可行的方法。此外,截至今天,onreadystatechange已经过时,因为您显然不会支持仅支持onreadystatechange的任何旧版本。

总结一下,忘掉onreadystatechange

答案 3 :(得分: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...');
}