Javascript XMLHttpRequest的responsetext在Mozilla中为null(空白)
当我在IE中运行以下代码时,它运行良好 但在mozilla ff中,layerId的值为空,因为第1行的Javascript XMLHttpRequest的responsetext在Mozilla中为null(空白),javascript,xmlhttprequest,responsetext,Javascript,Xmlhttprequest,Responsetext,当我在IE中运行以下代码时,它运行良好 但在mozilla ff中,layerId的值为空,因为第1行的ReqGetSubNureF22.responseText为空 function ajaxFunctionCallGetSubMenuRef22(url) { if (window.XMLHttpRequest) { // Non-IE browsers and IE>=7 reqGetSubMenuRef22 = new XMLHttpRequest();
ReqGetSubNureF22.responseText
为空
function ajaxFunctionCallGetSubMenuRef22(url)
{
if (window.XMLHttpRequest) { // Non-IE browsers and IE>=7
reqGetSubMenuRef22 = new XMLHttpRequest();
reqGetSubMenuRef22.onreadystatechange = processStateChangeGetSubMenuRef22;
try {
reqGetSubMenuRef22.open("GET", url, true);
(( reqGetSubMenuRef22.setRequestHeader && method == "GET" ) ? reqGetSubMenuRef22.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") : reqGetSubMenuRef22 );
} catch (e) {
alert(e);
}
reqGetSubMenuRef22.send(null);
}
else if (window.ActiveXObject) { // IE
reqGetSubMenuRef22 = new ActiveXObject("Microsoft.XMLHTTP");
if (reqGetSubMenuRef22) {
reqGetSubMenuRef22.onreadystatechange = processStateChangeGetSubMenuRef22;
reqGetSubMenuRef22.open("GET", url, true);
reqGetSubMenuRef22.send();
}
}
}
function processStateChangeGetSubMenuRef22()
{
if (reqGetSubMenuRef22.readyState == 4) { // Complete
if (reqGetSubMenuRef22.status == 200) { // OK response
var textToSplit = reqGetSubMenuRef22.responseText; //line1
if(textToSplit != null && textToSplit != '') {
subMenuRef = textToSplit;
}
else {
subMenuRef='';
}
layerId=subMenuRef;
ProcessStateChangeGetSubNureF22
(不是最好的函数名)是回调。它是在ReqGetSubNureF22
的上下文中调用的,因此,与其使用if(ReqGetSubNureF22.readyState==4)
,不如尝试使用if(this.readyState==4&&this.status==200)
函数被引用为readystatechange
事件的处理程序,变量ReqGetSubNureF22
,因此函数将是ReqGetSubNureF22
的一种方法,逻辑上(在本例中)它与this
一起引用
用一个类比来澄清这一点:你不会把你的起居室称为某个123号大道的起居室,不管是哪个城镇,哪个国家,是吗?当人们走过来,你说这是我的客厅,这是我们的家,这是我住的地方
另外,ReqGetSubNureF22
似乎是代码中的一个全局变量,您需要解决这个问题。阅读更多关于JS在MDN上的this
,如果是ajax调用,进入closures
也会很有用
为什么
ReqGetSubNureF22
不再工作:
function sendRequest(str)
{
var reqGetSubMenuRef22;//<-- local scope, only accessible in function
var i;//local, too but different
//try catch stuff: reqGetSubMenuRef22 is now an ajax object
for (i=0;i<str.length;i++)
{
console.log(i);//just an example, you'll see why
}
reqGetSubMenuRef22.onreadystatechange = readyStateCallback;//reqGetSubMenuRef22 is still local
//setup reqGetSubMenuRef22, then:
reqGetSubMenuRef22.send();
}//end function
函数发送请求(str)
{
var ReqGetSubNureF22;//Thanx表示您的回复。我用此替换了ReqGetSubNureF22。但它仍然不起作用。下面是修改后的代码。if(this.readyState==4){//Complete if(this.status==200){//OK response var textToSplit=ReqGetSubNureF22.responseText;您必须替换所有出现的ReqGetSubNureF22
变量名。还要使用this.responseText
,this
是对ReqGetSubNureF22
对象的引用,因为(我希望)该对象不能使用其名称引用它是一个函数变量,您不再在该函数中。另外,如果您只检查this.readyState==4&&this.status==200
,请不要像您那样嵌套if
语句。如果效果一样好,而且更干净,请使用模板onreadystatechange
function@RakeshK:尝试省去((ReqGetSubNureF22.setRequestHeader&&method==“GET”)?ReqGetSubNureF22.setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”):ReqGetSubNureF22)
这一行也是。而且,请不要像您看起来正在做的那样使用全局变量。这是一种不好的做法,想象一下在使用全局变量时,在第一个请求仍在处理时发送一个请求(对两个请求使用相同的变量),它会导致错误。如果某些东西只在IE中起作用,你应该将其视为一个坏迹象。特别是因为它不再是最大的浏览器,chrome也是:在你的代码中:变量方法
从何而来?\n还有一点需要注意的是:新的XMLHttpRequest()
适用于所有符合W3C标准的浏览器,IE8不适用,您的注释应为IE9>=
function sendRequest(str)
{
var reqGetSubMenuRef22;//<-- local scope, only accessible in function
var i;//local, too but different
//try catch stuff: reqGetSubMenuRef22 is now an ajax object
for (i=0;i<str.length;i++)
{
console.log(i);//just an example, you'll see why
}
reqGetSubMenuRef22.onreadystatechange = readyStateCallback;//reqGetSubMenuRef22 is still local
//setup reqGetSubMenuRef22, then:
reqGetSubMenuRef22.send();
}//end function