为什么赢了';这个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变量范围的更好方法是什么?我应该使用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,与小图像差不多。