我想通过双击提交按钮或按两次回车键来阻止用户提交多个表单。我喜欢这个解决方案,因为它不需要隐藏表单字段或隐藏提交按钮。
两个关键点是:
返回 true/false 而不是使用 e.preventDefault() 和 form.submit(),因为 form.submit() 不知道点击了哪个按钮,因此无法传递按钮名称/价值。
使用 pointer-events: none; 而不是 disabled="disabled" 禁用按钮,因为 disabled 属性不会发送按钮名称/值。我相信 Internet Explorer 10 或更低版本不支持pointer-events: none;。
javascript/jquery 代码:
var form_selector = 'form',
button_selector = 'button, input[type=submit], input[type=button], input[type=reset]',
deactivated_classname = 'state-submitting',
deactivated_class = '.'+'state-submitting';
// Capture the submit event so it will handle both the
// enter key and clicking the submit button.
$(document).on('submit', form_selector, function(e) {
var form = e.target,
buttons = $( form ).find( button_selector );
// Returns, because the form is already being submitted by a previous attempt.
if( $( form ).find( deactivated_class ).length > 0 ) return false;
disableButtons( buttons );
// Safari (version 11) bugfix: Safari needs a timeout or it won't
// show the deactivated styles.
setTimeout(function() {
// Must use return true, because using form.submit(), won't pass the button value.
return true;
}, 50 );
});
function disableButtons( buttons ) {
// Disables all buttons in the form.
$( buttons ).each(function( index, elem ) {
$( elem ).addClass( deactivated_classname );
});
}
对于 AJAX 表单,您需要在返回响应后重新启用按钮。
$( document ).on( 'ajax:complete', form_selector, function(e) {
var form = e.target,
buttons = $( form ).find( button_selector );
enableButtons( buttons );
});
function enableButtons( buttons ) {
$( buttons ).each(function( index, elem ) {
$( elem ).removeClass( deactivated_classname );
});
}
CSS:
// The button is disabled while it is submitting.
.state-submitting {
// Turns off hover and click events. Not supported in IE 10 and below.
pointer-events: none;
opacity: 0.5;
}