Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XMLHttpRequest的responsetext在Mozilla中为null(空白)_Javascript_Xmlhttprequest_Responsetext - Fatal编程技术网

Javascript XMLHttpRequest的responsetext在Mozilla中为null(空白)

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

当我在IE中运行以下代码时,它运行良好

但在mozilla ff中,layerId的值为空,因为第1行的
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