2016-09-14 91 views
3

我有一個快速的問題,在我的javascript代碼我有這樣的:JQuery - 表單提交 - 多次?

\t $('form').submit(function (e) { 
 
\t \t var form = $(this); 
 
\t \t console.log('submit attempt'); 
 
\t \t $('input, select, textarea').each(function() { 
 
\t \t \t var attr = $(this).attr('required'); 
 
\t \t \t if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) { 
 
\t \t \t \t if($(this).hasClass('numeric')) { 
 
\t \t \t \t \t if(isNumber($(this).val())) { 
 
\t \t \t \t \t \t $(form).submit(); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t \t else { 
 
\t \t \t \t \t $(form).submit(); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t else { 
 
\t \t \t \t e.preventDefault(); 
 
\t \t \t \t $(this).css('border','1px solid red'); 
 
\t \t \t } 
 
\t \t }); 
 
\t });

而且在控制檯日誌中我得到了超過1300個的消息「提交的嘗試」,那麼一個錯誤:

Uncaught RangeError: Maximum call stack size exceeded

你們有什麼想法,爲什麼發生這種情況,以及如何解決它?也許關於submit()的一些棘手的事情我忘了?

如果需要更多信息,請告訴我。

謝謝!

+1

您應該從循環中刪除'$(form).submit();',因爲它會導致多個表單遞歸遞交。 –

+1

問題是你遞交遞交遞交表單遞歸調用遞歸 –

+0

哦,對了!你知道我怎麼能提交表單,當我在if條件沒有成爲一個循環? 我的意思是:如果條件是真的發送表單,否則preventDefault ....沒有條件寫什麼就夠了? – Praem

回答

0

如果沒有錯誤,表單將隨每個輸入或textarea一起提交。

因此,首先循環字段,定義是否有失敗。如果沒有,發送它:

$('form').submit(function(e) { 
    var form = $(this); 
    var failure = false; 
    console.log('submit attempt'); 
    $('input, select, textarea').each(function() { 
    var attr = $(this).attr('required'); 
    if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) { 
     failure = true; 
     $(this).css('border', '1px solid red'); 
    } 
    if ($(this).hasClass('numeric') && !isNumber($(this).val())) { 
     failure = true; 
     $(this).css('border', '1px solid red'); 
    } 
    }); 
    if (failure) { 
    e.preventDefault(); 
    } 
}); 
+0

這仍然會在'.submit()'中調用'.submit()',同樣的問題(只是更少)。根本不需要最後的'.submit()'並讓事件完成而不被阻止。 –

+0

@ freedomn-m,你的權利......最後一個'else {}'可以被刪除,我已經編輯了我的答案。 – LinkinTED

+0

謝謝你們的幫助!我喜歡你說:「如果你的.submit()事件處理程序在沒有e.preventDefault()的情況下結束,那麼表單將提交。」 – Praem

1

問題是,您在提交遞歸調用遞歸內再次提交表單。這是你應該怎麼做的。如果驗證失敗,isValid包含false並停止提交表單;

$('form').submit(function(e){ 
var isValid = true; 
    $('input, select, textarea').each(function() { 
      var attr = $(this).attr('required'); 
      if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) { 
       if($(this).hasClass('numeric')) { 
        if(!isNumber($(this).val())) { 
         isValid = false; 
      return isValid; 
        } else { 
          e.preventDefault(); 
          $(this).css('border','1px solid red'); 
        } 
       } 

      } 
      else { 
     e.preventDefault(); 
       $(this).css('border','1px solid red'); 
     isValid = false; 
     return isValid; 
      } 
     }); 
    return isValid; 

});