xhr是否始终在onreadystatechange中作为参数的属性可用?哪一个使用?

时间:2017-09-07 22:48:11

标签: javascript ajax xmlhttprequest

我的目标是让一些XHR onreadystatechange处理程序自包含,这意味着我想在不使用闭包的情况下将XHR对象放入其中(因此我能够堆叠)他们以任何顺序)。这是代码的主要部分:

var xmlhttp;
function receiveOriginal()
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
    {
        ...
    }
}
...
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = receiveOriginal;
xmlhttp.open("GET", url, true);
xmlhttp.send();

现在,我想把它变成

function receiveOriginal()
{
    xmlhttpInside = ... // get it any way without using a closure
    if (xmlhttpInside.readyState == 4 && xmlhttpInside.status == 200)
    {
        ...
    }
}
...
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = receiveOriginal;
xmlhttp.open("GET", url, true);
xmlhttp.send();

我发现这确实有效(至少在Vivaldi和Chrome中):

function receiveOriginal(ev)
{
    xmlhttpInside = ev.currentTarget;
    // or
    xmlhttpInside = ev.srcElement;
    // or
    xmlhttpInside = ev.target;
    // each of these return true: xmlhttp === ev.currentTarget , xmlhttp === ev.srcElement , xmlhttp === ev.target
    if (xmlhttpInside.readyState == 4 && xmlhttpInside.status == 200)
    {
        ...
    }
}
...
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = receiveOriginal;
xmlhttp.open("GET", url, true);
xmlhttp.send();

但问题是,我在教程之后看了一个教程,所有这些,甚至是W3C reference(这是最后一个,对吗?),所有人都没有对论点说什么传递给onreadystatechange处理程序。所以我不知道:

  • 支持的范围有多广?
  • 我应该使用哪一个(ev.currentTargetev.srcElementev.target,如果有的话?它们之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

targetcurrentTargetsrcElement都是原始Event对象(documentation)的所有属性,onreadystatechange收到这些属性(因为它是一个事件处理程序)。有很多方法可以解决这个问题 - 所有这些都非常好。我个人更喜欢使用this进行onreadystatechange回调:

function receiveOriginal() {
    if (this.readyState == 4 && this.status == 200) {
        console.log(this.responseText)
    }
}