我的目标是让一些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.currentTarget
,ev.srcElement
或ev.target
,如果有的话?它们之间的区别是什么?答案 0 :(得分:1)
target
,currentTarget
和srcElement
都是原始Event
对象(documentation)的所有属性,onreadystatechange
收到这些属性(因为它是一个事件处理程序)。有很多方法可以解决这个问题 - 所有这些都非常好。我个人更喜欢使用this
进行onreadystatechange
回调:
function receiveOriginal() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText)
}
}