我的目标是使几个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)?它们之间有什么区别?

最佳答案

targetcurrentTargetsrcElement都是本机Event对象(documentation)的所有属性,onreadystatechange会接收该对象(因为它是一个事件处理程序)。有很多方法可以解决此问题-所有这些都很好。我个人更喜欢将this用于onreadystatechange回调:

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

关于javascript - xhr是否始终在onreadystatechange内部作为参数的属性可用?使用哪一个?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46106194/

10-11 01:15