2013-01-19 42 views
0

可能重複:
How to return the response from an AJAX call from a function?javascript函數返回錯誤與Ajax響應

我有這個代碼的問題。

當這個函數返回FALSE時,它工作正常。

但如果它返回TRUE,它不會。

我希望在函數返回TRUE時提交表單。

<form action='register.php' method="post" onsubmit="return validate()" > ... </form> 

這裏的腳本

<script language="JavaScript"> 
function validate() 
{ 
    var toreturn = false; 


     if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } 
     else 
     {// code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     var e = document.getElementById('e').value; 
     var p = document.getElementById('p').value; 
     var r = document.getElementById('r').value; 


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



       if(xmlhttp.responseText != "ok") 
       { 
        document.getElementById("msg").innerHTML = xmlhttp.responseText; 

        $(function() { 
         $("#msg").hide().fadeIn("slow"); 
        }, 3000); 


       } 
       else toreturn = true;  

      } 
     } 

     xmlhttp.open("POST","register_validate.php"); 
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
     xmlhttp.send("e="+e+"&p="+p+"&r="+r); 



     return toreturn; 
} 
</script> 
+0

你不能這樣做......你最好的選擇是,當你再次觸發提交事件 響應。 –

回答

0

通過添加虛假解決的問題

xmlhttp.open("POST","register_validate.php",false); 

感謝在How do I return the response from an asynchronous call?

增加FALSE值使功能同步答案通過@Felix克林

+0

是的,但這會使瀏覽器在請求完成之前無響應。嚴重的是,不要那樣做,去異步並使用回調。 – bfavaretto

+0

@bfavaretto是否可以,如果我現在還在使用,那麼我現在正在等待的響應時間很短? –

+0

問題是,你無法知道所有用戶需要多長時間。 – bfavaretto

1

正如在評論中提到,您有異步代碼的一個問題。從validate函數返回時,您的toreturn變量未被填充。

對於AJAX回調:

xmlhttp.onreadystatechange = function() { 
    // ... 
} 

你可以想像,你把函數內部的代碼將被「放到一邊」,並呼籲後,你目前的功能已經完成(具體後時, AJAX請求的就緒狀態更改)。

你想要做的是讓你的按鈕不是一個提交按鈕。然後,在你的AJAX回調,提交表單,如果你得到一個成功的結果(這將要求給予形式的ID):

xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     if (xmlhttp.responseText != "ok") { 
      document.getElementById("msg").innerHTML = xmlhttp.responseText; 

      $(function() { 
       $("#msg").hide().fadeIn("slow"); 
      }, 3000); 


     } else document.getElementById('your-form-id').submit(); 
    } 
}