我想通过双击提交按钮或按两次Enter键来阻止用户导致多个表单提交。我喜欢这个解决方案,因为它不需要隐藏表单域或隐藏提交按钮。
两个关键点是:
返回真/被点击了假的而不是使用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;
}
可以使用http://jsfiddle.net您创建的代码的演示和分享?这将会更有帮助! – UID 2014-09-03 18:28:19
只是出于好奇,为什么你需要知道哪个**提交**按钮被首先点击?通常,每个表单只有一个提交按钮。例如,你有多个_actions_采用相同的参数,并且不想设置几个相同的表单? – Kiruse 2014-09-03 18:46:50
我通常至少有两个按钮:“确定”和“取消”。有时候,我可能还会有类似于“
2014-09-03 18:52:06