我的目标是使几个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
)?它们之间有什么区别? 最佳答案
target
,currentTarget
和srcElement
都是本机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/