为什么赢了';这个ajax调用在这个简单的javascript对象文本ajax框架中不起作用

为什么赢了';这个ajax调用在这个简单的javascript对象文本ajax框架中不起作用,javascript,Javascript,大多数函数都引用xml变量,该变量的作用域很差。也就是说,当您调用ajax.xmlHTTPopen时,没有任何迹象表明xml变量在所述函数中有任何值 提供更好范围的最简单方法是将xml变量定义为ajax对象的属性;下面是一个代码更改最少的示例: var ajax = { xmlHTTP: function() { xml = new XMLHttpRequest(); return xml; }, xmlHTTPfunction: function() { if (xml

大多数函数都引用
xml
变量,该变量的作用域很差。也就是说,当您调用
ajax.xmlHTTPopen
时,没有任何迹象表明xml变量在所述函数中有任何值

提供更好范围的最简单方法是将xml变量定义为ajax对象的属性;下面是一个代码更改最少的示例:

var ajax = {
xmlHTTP: function() {
    xml = new XMLHttpRequest();
    return xml;
},
xmlHTTPfunction: function() {
    if (xml.readyState == 4 && xml.status == 200)  {
        document.getElementById("te").innerHTML = xml.responseText; 
         alert(xml.status);
         alert(xml.responseText);
     }

},
xmlHTTPopen: function(url) {
    xml.open("POST", url, true);
},
xmlHTTPheader: function() {
    ajax.xmlHTTP().setRequestHeader("Content-type","application/x-www-form-urlencoded");
},
xmlHTTPsend: function(string) {
    xml.send(string);
},
ajaxCall: function() {
    ajax.xmlHTTP();
    ajax.xmlHTTPopen('testx.php');
    ajax.xmlHTTPsend('test');
    return 1;
}
}
   if(ajax.ajaxCall() == 1) {
document.getElementById("te").innerHTML = xml.responseText; 

}
请注意,正如您编写的那样,
ajax.ajaxCall
是非阻塞的,因此它总是会立即返回1,即使在响应到达(或必须发送)之前——为此,您必须为XMLHtpRequest对象的onreadystatechange事件分配回调函数,来处理最终返回的响应

如果将
xml.open
的第三个参数更改为
false
,则xml.send调用将一直阻塞,直到响应到达,在这种情况下,您不需要分配回调。替代实现可能如下所示:

var ajax = {
    xmlHTTP: function() {
        this.xml = new XMLHttpRequest();
        this.xml.onreadystatechange = this.xmlHTTPfunction();
    },
    xmlHTTPfunction: function() {
        if (this.xml.readyState == 4 && this.xml.status == 200)  {
            document.getElementById("te").innerHTML = this.xml.responseText; 
             alert(this.xml.status);
             alert(this.xml.responseText);
         }
    },
    xmlHTTPopen: function(url) {
        this.xml.open("POST", url, true);
    },
    xmlHTTPheader: function() {
        this.xml.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    },
    xmlHTTPsend: function(string) {
        this.xml.send(string);
    },
    ajaxCall: function() {
        ajax.xmlHTTP();
        ajax.xmlHTTPopen('testx.php');
        ajax.xmlHTTPsend('test');
        return 1;
    }
}
然而,根据我的经验,这几乎从未在现实世界中使用过

另外:您的代码从不调用xmlHTTPheader函数,尽管这没有什么害处


考虑到您当前的代码,我想不出更好的方案;您看过jQuery及其ajax实现了吗?

大多数函数都引用了
xml
变量,该变量的作用域很差。也就是说,当您调用
ajax.xmlHTTPopen
时,没有任何迹象表明xml变量在所述函数中有任何值

提供更好范围的最简单方法是将xml变量定义为ajax对象的属性;下面是一个代码更改最少的示例:

var ajax = {
xmlHTTP: function() {
    xml = new XMLHttpRequest();
    return xml;
},
xmlHTTPfunction: function() {
    if (xml.readyState == 4 && xml.status == 200)  {
        document.getElementById("te").innerHTML = xml.responseText; 
         alert(xml.status);
         alert(xml.responseText);
     }

},
xmlHTTPopen: function(url) {
    xml.open("POST", url, true);
},
xmlHTTPheader: function() {
    ajax.xmlHTTP().setRequestHeader("Content-type","application/x-www-form-urlencoded");
},
xmlHTTPsend: function(string) {
    xml.send(string);
},
ajaxCall: function() {
    ajax.xmlHTTP();
    ajax.xmlHTTPopen('testx.php');
    ajax.xmlHTTPsend('test');
    return 1;
}
}
   if(ajax.ajaxCall() == 1) {
document.getElementById("te").innerHTML = xml.responseText; 

}
请注意,正如您编写的那样,
ajax.ajaxCall
是非阻塞的,因此它总是会立即返回1,即使在响应到达(或必须发送)之前——为此,您必须为XMLHtpRequest对象的onreadystatechange事件分配回调函数,来处理最终返回的响应

如果将
xml.open
的第三个参数更改为
false
,则xml.send调用将一直阻塞,直到响应到达,在这种情况下,您不需要分配回调。替代实现可能如下所示:

var ajax = {
    xmlHTTP: function() {
        this.xml = new XMLHttpRequest();
        this.xml.onreadystatechange = this.xmlHTTPfunction();
    },
    xmlHTTPfunction: function() {
        if (this.xml.readyState == 4 && this.xml.status == 200)  {
            document.getElementById("te").innerHTML = this.xml.responseText; 
             alert(this.xml.status);
             alert(this.xml.responseText);
         }
    },
    xmlHTTPopen: function(url) {
        this.xml.open("POST", url, true);
    },
    xmlHTTPheader: function() {
        this.xml.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    },
    xmlHTTPsend: function(string) {
        this.xml.send(string);
    },
    ajaxCall: function() {
        ajax.xmlHTTP();
        ajax.xmlHTTPopen('testx.php');
        ajax.xmlHTTPsend('test');
        return 1;
    }
}
然而,根据我的经验,这几乎从未在现实世界中使用过

另外:您的代码从不调用xmlHTTPheader函数,尽管这没有什么害处

考虑到您当前的代码,我想不出更好的方案;您看过jQuery及其ajax实现吗?

一些问题:

  • 您真的不应该依赖全局变量(“xml”)将所有内容联系在一起。如果需要两个重叠的请求,会发生什么情况
  • 您永远不会设置“readyStateChange”处理程序
  • 一些问题:

  • 您真的不应该依赖全局变量(“xml”)将所有内容联系在一起。如果需要两个重叠的请求,会发生什么情况
  • 您永远不会设置“readyStateChange”处理程序

  • 对于我来说,处理xml变量范围的更好方法是什么?我应该使用ajax.xmlHTTP()来代替xml全局变量吗?如果您研究如何使用基于原型的继承创建“类”,我认为这将为您提供一种继续的方法。您可能还想考虑在其他一些库中使用XMLHTTPREQUEST API的方式,就像人们发现有用的东西的例子一样。您认为对于处理XML变量的范围,有什么更好的方法?我应该使用ajax.xmlHTTP()来代替xml全局变量吗?如果您研究如何使用基于原型的继承创建“类”,我认为这将为您提供一种继续的方法。您可能还需要考虑在某些其他库中查看XMLHTTPREQUEST API的方式,就像人们发现有用的例子一样。但出于某种原因,我觉得加载简单的web应用程序需要很多kb。@Matthew您不必将其包含在您的web应用程序中,但如果您下载未压缩版本,您可能会从他们的代码中获得一些灵感。缩小后的jquery 1.6.1是89K,和一张小图片差不多。每个人都告诉我使用jquery。。但出于某种原因,我觉得加载简单的web应用程序需要很多kb。@Matthew您不必将其包含在您的web应用程序中,但如果您下载未压缩版本,您可能会从他们的代码中获得一些灵感。缩小后的jQuery1.6.1是89K,与小图像差不多。