问与答 javascript-可以将xhr.onreadystatechange替换为AJAX调用的xhr.onload吗?

wheeler · 2020-02-20 22:39:24 · 热度: 58

我只需要支持主要的现代浏览器(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 条回复
adolph #1 · 2020-02-20 22:39:24

也许您看一看,然后看一下W3C:XMLHttpRequest,如果您的浏览器支持xhr.onload,也是如此。 需要XMLHttpRequest 2)

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

adolph #2 · 2020-02-20 22:39:25

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

大事记

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

从那时起,在   各种浏览器(onload,onerror,onprogress等)。 这些是   在Firefox中受支持。 特别是,请参见nsIXMLHttpRequestEventTarget   和使用XMLHttpRequest。

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

因此,我认为您可以假设onreadystatechange是可行的方式,而onload是可以在浏览器支持的情况下使用的附加功能。 @ mr.VVoo答案是正确的,如有疑问,请坚持使用w3c。

adolph #3 · 2020-02-20 22:39:26

由于最初的询问者说“我只需要支持主要的现代浏览器(IE10 +,FF,Chrome,Safari)”,因此显然可以选择onreadystatechangeonerror等。 另外,截至今天,onreadystatechange已经过时了,因为您显然不会支持仅支持onreadystatechange的任何旧版本。

概括起来,请忽略onreadystatechange

adolph #4 · 2020-02-20 22:39:27

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

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...');
}
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册