-2

我的 JavaScript 函数

function B_modeWindow (id,cords) {  
    loading();

    var xmlhttp;

    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    } else {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {

            var cords = document.getElementById(cords)
            cords.innerHTML=xmlhttp.responseText;
            var xy = cords.split("x");          
            hideloading();
        }
    }

    xmlhttp.open("GET","processMapEdit.php?id="+id+"&x="+xy[0]+"&y="+xy[1],true);
    xmlhttp.send();
}

返回:

Uncaught ReferenceError: xy is not defined 

在:

xmlhttp.open("GET","processMapEdit.php?id="+id+"&x="+xy[0]+"&y="+xy[1],true);

似乎 xy 不存在,但它在上面仅定义了 5 行!这里有什么问题?

4

4 回答 4

1

您需要在函数xy之外定义变量,onreadystatechange以便在您使用它的地方可用。

这应该有效:

function B_modeWindow (id,cords) {  
    var xy = null; // defined xy here

    loading();

    var xmlhttp;

    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    } else {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {

            var cords = document.getElementById(cords)
            cords.innerHTML=xmlhttp.responseText;
            xy = cords.split("x");          // removed var keyword here
            hideloading();
        }
    }

    xmlhttp.open("GET","processMapEdit.php?id="+id+"&x="+xy[0]+"&y="+xy[1],true);
    xmlhttp.send();
}

请注意,ajax 调用默认是异步的,因此即使范围是固定的,xy变量也可能没有您要查找的内容。在这种情况下,您将不得不以某种方式在 ajax 请求中使用回调来捕获实际值

于 2012-09-09T20:49:03.713 回答
0

xy只定义在匿名函数的范围内xmlhttp.onreadystatechange = function () { // valid scope of xy }。因此,在此匿名函数之外无法访问它。请改用以下内容:

function B_modeWindow (id,cords) {  
    loading();

    var xmlhttp;

    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    } else {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    var xy = cords.split("x"); 

    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var cordsElement = document.getElementById(cords);
            cordsElement.innerHTML=xmlhttp.responseText;      
            hideloading();
        }
    }

    xmlhttp.open("GET","processMapEdit.php?id="+id+"&x="+xy[0]+"&y="+xy[1],true);
    xmlhttp.send();
}

这样,作用域xy是函数B_modeWindow而不是匿名函数。

另外,请注意,即使可以xy在匿名函数之外访问(您不能),xy也不会被定义,因为您仅在 AJAX 请求完成时才定义它,并且您需要实际使用它进行 AJAX 调用。

另一个建议是为cords. 您首先使用它来分割其内容x,然后定义另一个cords变量来分配一个 DOM 元素。虽然这可行,但它可能会令人困惑。

于 2012-09-09T20:50:51.373 回答
0

您将声明放在错误的函数中。此外,您需要cords在回调中给回调一个不同的名称,否则事情会中断。

function B_modeWindow (id,cords) {
    var xy = cords.split("x");

    loading();

    var xmlhttp;

    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var cordsElement = document.getElementById(cords);
            cordsElement.innerHTML = xmlhttp.responseText;
            hideloading();
        }
    };

    xmlhttp.open("GET", "processMapEdit.php?id=" + id + "&x=" + xy[0] + "&y=" + xy[1], true);
    xmlhttp.send();
}
于 2012-09-09T20:50:54.320 回答
0

是的,xy 已定义,但它是在花括号中定义的——它超出了范围,或者在您到达问题行时停止退出。*编辑:见下面的评论。我的这个陈述完全是错误的*

要修复它,只需在线上方定义 xy 即可xmlhttp.onreadystatechange=function()。或者更好的是,在函数的顶部。

于 2012-09-09T20:51:02.417 回答