Javascript XMLHttpRequest对象上缺少onreadystatechange()
为什么Javascript XMLHttpRequest对象上缺少onreadystatechange(),javascript,ajax,xmlhttprequest,Javascript,Ajax,Xmlhttprequest,为什么this.onreadystatechangenull?根据它应该存在并且类型为function您应该自己设置它,当状态更改时将调用此函数。它就像其他事件处理程序一样,比如document.onload,yourelement.onclick,等等 传统上你是这样做的 (function (send) { XMLHttpRequest.prototype.send = function () { console.log(this.onreadystatech
this.onreadystatechange
null?根据它应该存在并且类型为function
您应该自己设置它,当状态更改时将调用此函数。它就像其他事件处理程序一样,比如document.onload
,yourelement.onclick
,等等
传统上你是这样做的
(function (send) {
XMLHttpRequest.prototype.send = function () {
console.log(this.onreadystatechange); //null
send.apply(this, arguments);
};
})(XMLHttpRequest.prototype.send);
onreadystatechange
是否存在这就是为什么它是null
。如果它不存在,它将是未定义的。这完全取决于它是否已经设置好了。它显然已经是一个属性,因为它是null
…如果不是,它将是未定义的…或者至少“onreadystatechange”在这个中是false
下面是一个例子:
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function() {
if (httpRequest.readyState === 4) {
if (httpRequest.status === 200) {
// use httpRequest.responseText
}
}
};
httpRequest.open('GET', url);
httpRequest.send();
您的控制台将记录一个功能
如果你有:
var a = new XMLHttpRequest();
a.onreadystatechange = function () {
};
a.send();
您的控制台将记录null
下面是这一事件的演示:
(显然,我没有考虑发送AJAX请求的其他步骤,这只是为了解释)
我并不是想暗示null
和undefined
之间存在关系-我只是说,在创建新的XMLHttpRequest
时,onreadystatechange
将在内部设置为null
。是否将其设置为函数取决于您
更新:
创建/发送XHR的正常方式如下:
var b = new XMLHttpRequest();
b.send();
我总是被告知/显示要创建新的XMLHttpRequest
,然后无论设置onreadystatechange
和调用open
的顺序如何,但只有在这两个步骤都完成后,我才应该调用send
因此,如果始终这样做,onreadystatechange
(如果实际设置)将不会是null
,而是一个函数
因为您提到您正在使用jQuery,所以我决定按照您的意愿覆盖send
方法,并进行jQuery$.ajax
调用(而不是手动发送XMLHttpRequest
)。这是我的测试-
为什么onreadystatechange
会是null
,这是没有意义的,因为jQuery必须绑定到该事件才能知道请求何时完成及其状态。所以我决定看看jQuery源代码。我发现他们称之为事物的顺序是:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () { // This and `open` could be flip-flopped
// whatever
};
xhr.open("POST", url, true);
xhr.send("data=data");
这意味着当您重写send
方法时,onreadystatechange
为null
,因为jQuery在调用send
之前没有设置它。我不知道他们这样做的理由…可能是为了阻止你这样做…但我从来没有听说过或看到这个惯例被使用
因此,将其值设置为null
的原因是jQuery在调用send
之后设置onreadystatechange
。这意味着,当您重写send
并尝试访问onreadystatechange
属性时,该属性尚未设置
希望这是一个可以帮助您理解的示例:它是null
而不是未定义的(或引发未定义的异常)这一事实应该解释一下-它只是还没有被设置。该函数只是用一些日志来包装send
方法。当调用send
时,我们无法解释为什么函数为null
,因为您没有向我们展示使用它的代码。我正在尝试使用此函数拦截jquery ajax调用。不明白为什么它会是空的(因为jQuery显然正在使用它)@johanwoah,我想我明白你的意思了。是的,为什么要将其设置为null
,这是没有意义的。以下是我测试的内容,我应该在这个问题上更加清楚:/但是我不知道如何解决它。感谢您对此进行深入研究:)我需要一个全局ajax侦听器,用于非我生成的ajax代码(本例中为GWT)。但是要到周一才能使用GWT,所以我才尝试使用jQuery。明白了。非常感谢您详细介绍Ian.Random问题-您知道为什么每个人(是的,包括我)都在回调中使用httpRequest
?为什么没有人使用这个
?这并不重要,但我只是想知道。我想我从未见过有人使用这个
,但我会在普通事件处理程序中看到它。我有时使用这个,但我发现使用您声明的变量是正常的:您知道它是什么,而要使用它,您必须知道特定回调的上下文。图像的加载也是如此,这是真的。我想我只是在考虑设置对函数(不是匿名函数)的引用,比如xhr.onreadystatechange=stateChange
,您不能在函数中使用xhr
。您必须使用此
。所以对我来说,总是使用这个
,因为它应该总是引用特定的请求。不管怎样,我想这不太重要,我只是想听听你的意见。谢谢:)
xhr.open()
xhr.send()
xhr.onreadystatechange = function () {
};