這是今天在工作中遇到的一個問題。由於業務需要在原來表單提交時增加一段新的校驗邏輯。
原來的邏輯如下(代碼都做了簡化):
在表單提交時,使用check方法校驗
<
form
onsubmit
=
"return check();">
方法代碼:
function
check(){
if
(...){
alert("xxx");
return
false
;
}
}
因為新增了一段邏輯,所以我新增了一個方法,調整了代碼的結構:
<
form
onsubmit
=
"return newCheck();">
方法代碼:
function
newCheck(){
if
(!check()){
return
false
;
}
if
(!myCheck(){
return
false
;
}
return
true
;
}
function
myCheck(){
if
(...){
alert("xxx");
return
false
;
}
}
但是當我測試的時候,提示出現了兩次。
經過確認,方法執行了兩次(這里花了一些功夫確認及了解原因,又去網上找了些相關的資料,但都無效,解決問題都是類似,從未知探索各種可能)。
后來想到頁面使用了jquery validate組件做校驗,是否和這個有關系呢,當時也是懷疑。
搜索相關內容找到
jQuery.validate 中文API,其中有這樣兩個字段:
問題的原因:onsubmit Boolean 默認:true 是否提交時驗證。好吧,就是它導致的。
(剛剛我自己從新看了一遍,我覺得這個方法應該是在提交表單的時候,調用validate,而不是調用validate時執行onsubmit的方法。不管怎樣,我覺得query validate還是調用了onsubmit)
解決辦法:submitHandler:通過驗證后運行的函數,里面要加上表單提交的函數,否則表單不會提交。(api后面都有類似如下附加代碼片段)
$(
".selector"
).validate({
submitHandler:
function
(form) {
$(form).ajaxSubmit();
}
})
好吧,copy過來用。
好吧,表單不提交了(因為上面的代碼有問題,及時可以執行,也可能出現下面死循環的問題)。。。繼續查找submitHandler的用法。
找到了:
jquery validate submitHandler 提交導致死循環。寫的真不錯。正好拿過來用。
刪除form表單中的onsubmit,然后在jquery validate相關代碼內加:
submitHandler:
function
(form){
if
(newCheck()){
form.submit();
}
}
問題解決。
這是一個遇到未知問題的解決過程,從各個可能的角度去探試。
開始我懷疑是哪里寫重復了?
然后懷疑頁面頂和底的兩個保存按鈕的原因?
又去運行線上代碼復測這個問題,而且奇怪的是時好時壞,有時執行一次,有時兩次。
到此仍然奇怪為什么返回false的時候,我寫的代碼會執行兩次,而原代碼執行一次,這里只是多了一層調用。按照順序的想法代碼在第一次false的時候就阻斷了。
收獲2點:
jquery validate 默認會調用onsubmit的方法,導致此方法調用兩次,而且在方法返回false時,由於返回了,所以只有一次執行,很難發現校驗通過時是執行兩次。
jquery方式的表單提交會觸發validate執行,所以在validate其內如果再用jquery的表單提交會死循環(驗證了),此時應使用dom的提交方式。
