我想實現的功能是這樣的,利用ajax的異步請求在提交表單之前實現對一個輸入框中數據的驗證,期待實現的效果是點擊提交按鈕,如果輸入數據符合要求,就提交表單。但是現在實現的效果是點擊提交按鈕,在校驗輸入數據符合要求後,還需要再點擊一次才能提交表單。
代碼如下:
jsp:
< form action="formaction.action" method="post" onsubmit="return formsubmit()">
< input type="submit" value="提交表單">< /form>
js:
function formsubmit(){
var xmlhttp;
xmlhttp=ajaxfun();
var datavalue=document.getElementById("data").value;
var url="datacheckaction?data="+datavalue+"&time="+(new Date().getTime());
xmlhttp.open("post",url,true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send(null);
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("spandata").innerHTML=xmlhttp.responseText;
}
}
}
if(document.getElementById("spandata").innerHTML==""){
return true;
}else{
return false;
}
}
這個xmlhttp.responseText測試了沒問題,數據校驗通過是個"",校驗不通過是個"wrong"。。。
用span和alert測試了幾次,也有一些想法但是很快就都否定了,不知道問題在哪裡。。。
忘記補充一點,有一個想法是這樣的。。spandata這個地方在jsp頁面上的初始值有,是"此項不可為空",我覺得最有可能的問題是formsubmit()這個函數的最後幾行,判斷spandata是否為空是在得到異步請求結果之前,應該是這樣。。。但是不知道怎麼解決
這個就是異步傳輸需要考慮的,因為異步傳輸需要較多時間,結果返回之前,主程序還是運行的,即if(document.getElementById("spandata").innerHTML==""){
return true;
}else{
return false;
}
會繼續運行,結果返回之後,這個程序已經先運行完了,所以會出現這樣的結果
解決方法可以是,直接在裡面對返回的結果在函數裡面進行判斷,然後直接跳轉頁面,例如window.location="地址",這種方式進行跳轉