0

我在使用下面的jQuery代碼,如果按下回車鍵提交表單:如何防止用戶在窗體上按住Enter鍵以使用請求砰擊我的站點?

$('body').on('keypress', 'input', function(event) { 
    if (event.which === 13) { 
     event.preventDefault(); 
     $(this).closest('form').submit(); 
    } 
}); 

另外,我有我的登錄頁面設置爲.focus()上的頁面加載的用戶名字段。

所以,如果用戶只是在'輸入'鍵上,它會提交,失敗,返回,重點,提交,重複。

我可以把keypress事件只在密碼字段中觸發,但我寧願找到一種方法來檢測長按鍵或某些東西來防止這種情況。

+0

這難道不是在形式'input'元素的默認行爲?另外,如果input元素的值是'''',爲什麼不阻止表單提交呢? – Blender

+0

[This thread](http://stackoverflow.com/q/926816/645270)有一些答案(向下滾動一下) – keyser

回答

2

限制事件的發生,所以它每秒只能發生一次。

var timer; 
$('body').on('keypress', 'input', function(event) { 
    var self = this; 
    if (event.which === 13) { 
     event.preventDefault(); 
     clearTimeout(timer); 
     timer = setTimeout(function(){ 
      $(self).closest('form').submit();     
     },1000) 
    } 
}); 
+0

這個超時是否在請求中持續存在?它不是ajax,所以每個'進入'按下POST,處理並返回,並重置 – chrickso

+0

如果您沒有提交事件執行ajax請求,則它不會持續存在。 –

0

像攪拌機稱,爲廣大的瀏覽器,這是一個默認行爲,在表單的輸入,提交表單,當你按下回車鍵(它就像點擊輸入用提交類型)。

你的拳頭代碼似乎有點無用,因爲它阻止了默認行爲(提交表單),但最終提交了表單。

超時解決方案並不差,但對於這樣的問題我的觀點太複雜了。

您的網頁是一個登錄頁面,您可以在登錄和密碼填寫時嘗試登錄。此外,您不希望在短時間內多次提交相同的頁面。

你可以寫一段類似的代碼:

// Listening on submit event of the form 
$("#FORM_ID").submit(function(submitEvent) { 

    // Check if the login and password are not empty 
    if (($.trim($("#LOGIN_INPUT_ID").val())).length == 0 || 
     ($.trim($("#PASSWORD_INPUT_ID").val())).length == 0) 
    { 
     // login or password is empty -> cancel the submit 
     submitEvent.preventDefault(); 

     // TODO : warn user with a message 
     // like "Please, fill login and password first !" 

     return false; 
    } 

    // Avoid multiple submit at the same time 
    // (for stupid guy clicking 10 times in 1 s) 
    if ($(this).hasData('alreadySubmitted')) 
    { 
     // The form is currently already submit -> cancel the submit 
     submitEvent.preventDefault(); 
     return false; 
    } 

    // Set the form "submitted" 
    $(this).data('alreadySubmitted', true); 

    // Let the submit do his job... 
    return true; 
}); 
+0

謝謝。如果你的表單包含一個,那麼'enter'只會提交一個表單,而我的表單不包含這個表單。我有一個jQuery的a.submit $(this).closest('form')。submit();.如果沒有我的代碼,輸入什麼也不做。 – chrickso

+0

也,上面的代碼不起作用。你有1太多)在每個val()在if語句中。所以不會讓我編輯,除非它是6個字符 – chrickso

+0

Oups,對於「)」感到抱歉,現在它已經被修正了。也許你應該在你的表單中寫一個輸入類型提交,原因有兩個:1)我的代碼在聽取提交事件時會運行良好。 2)如果JS未啓用,您仍然可以登錄。使用你的代碼,你不能,它不是不顯眼的。 – MatRt

相關問題