0

我正在尝试设置变量result,但它仍未定义。

        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
            {
                if(xmlhttp.responseText)
                {
                    result = true
                    alert(xmlhttp.responseText+" here1")
                }
                else
                {
                    document.getElementById("report").innerHTML = "wrong password/username"
                    alert(xmlhttp.responseText+" here2")
                    result = false
                }
            }
        }
        xmlhttp.open("POST", "process.php", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send("name="+encodeURIComponent(name.value));
        alert("final value: "+result)
        return result//always undefined

如何让对象影响它所在函数之外的变量?这个问题比我说的要复杂一些。当用户尝试提交表单时调用此函数。如果返回 true,则应提交表单,如果返回 false,则不应提交表单。我现在有了代码(感谢甜淀粉酶)

   var result
   var checkResult = function(result) {
         alert("final value: " + result);
         return result
   };

    xmlhttp.onreadystatechange=function()
    {
        var result = null;
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            if(xmlhttp.responseText)
            {
                result = true
                alert(xmlhttp.responseText+" here1")
            }
            else
            {
                document.getElementById("report").innerHTML = "wrong password/username"
                alert(xmlhttp.responseText+" here2")
                result = false
            }
            checkResult(result);     // pass result to another function
        }
    }
    xmlhttp.open("POST", "process.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send("name="+encodeURIComponent(name.value));

但是表单总是被提交,甚至在“最终值...”显示之前。如果我在代码末尾添加 return false 则永远不会提交表单。

4

3 回答 3

2

AJAX 是异步的,所以你需要修改你的onreadystatechange()函数,你可以传递result给另一个函数来处理你的逻辑:

   var checkResult = function(result) {
         alert("final value: " + result);
         /* handle your result here */
   };
   ...

    xmlhttp.onreadystatechange=function()
    {
        var result = null;
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            if(xmlhttp.responseText)
            {
                result = true
                alert(xmlhttp.responseText+" here1")
            }
            else
            {
                document.getElementById("report").innerHTML = "wrong password/username"
                alert(xmlhttp.responseText+" here2")
                result = false
            }
            checkResult(result);     // pass result to another function
        }
    }
    xmlhttp.open("POST", "process.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send("name="+encodeURIComponent(name.value));
于 2013-04-04T19:22:40.977 回答
0

“onreadystatechange”函数是异步的,这就是为什么你设置一个回调函数在事件触发时执行。你正在做的是对javascript说:“当你改变你的就绪状态时,这样做。”。然后你的代码继续运行 e 返回结果的值(这是未定义的,因为就绪状态还没有改变)..

因此,如果您需要使用 result 的值,您应该在回调函数中执行此操作。

希望能帮助到你..

于 2013-04-04T19:21:38.197 回答
0

利用callback

    function callServer(callback){
         if (window.XMLHttpRequest)
                ------------------- code ------------
            xmlhttp.open("POST", "process.php", true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send("name="+encodeURIComponent(name.value));
             xmlhttp.onreadystatechange = function(){
                 if (xmlhttp.readyState==4 && xmlhttp.status==200)
                 {
                 callback(xmlhttp.responseText);
                 }
             }
         }   
  }
于 2013-04-04T19:20:37.167 回答