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 () {

};