Преимущества
- Работает из коробки для всех кнопок
- Даже кнопки, которые не инициировали отправку, будут отключены.
- LinkButtons также будут отключены.
- Работает с UpdatePanels (т. Е. Частичные и асинхронные обратные передачи)
- Работает для полных обратных передач
- Не отключать кнопки, когда проверка предотвращает обратную передачу
- Нажатие кнопки, нажатие клавиши ввода и события AutoPostBack приведут к отключению кнопок
Ограничения
† Большинство других решений, которые я видел, имеют те же ограничения
- Полагается на jQuery
- † Работает только для форм ASP
- † Если пользователь нажимает кнопку отмены браузера после отправки, пользователь не сможет повторить отправку и может запутаться.
- † Есть и другие способы, которыми пользователь мог инициировать обратную передачу:
- Отправить с помощью клавиши ввода
- События автоответчика
Код
Просто поместите этот фрагмент внизу вашего HTML-кода перед закрывающим тегом </body>
.
<script type="text/javascript">
jQuery(function ($) {
/*
* Prevent Double Submit
* ---------------------
* Disables submit buttons during form submission and asp async postbacks
*/
// class name assigned to disabled :submit elements
var disabledClass = 'asp-postback-disable';
// selector for buttons and other elements that may cause a postback
var submittableSelector = [
'a[href^="javascript:__doPostBack"]',
':submit'
].join(",");
// returns false; used to prevent event bubbling
function returnFalse() { return false; }
// logs errors
function error(ex) {
if (typeof console === 'object' && console.error != null) {
console.error('Prevent Double Submit Error:', ex);
}
}
// disables :submit elements
function disableSubmit() {
try {
$(submittableSelector, 'form')
.addClass(disabledClass)
.on('click.asp-postback-disable', returnFalse);
}
catch (ex) { error(ex); }
}
// enables :submit elements
function enableSubmit() {
try {
$('.asp-postback-disable,' + submittableSelector, 'form')
.removeClass(disabledClass)
.off('click.asp-postback-disable', returnFalse);
}
catch (ex) { error(ex); }
}
// Handle async postbacks
if (typeof Sys === 'object') {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(function (s, e) { disableSubmit(); });
prm.add_endRequest(function (s, e) { enableSubmit(); });
}
else {
error('Sys is undefined.');
}
// Handle navigation (eg, Full postback)
$(window).bind('beforeunload', function (e) {
disableSubmit();
});
});
</script>
<style type="text/css">
.asp-postback-disable { opacity: 0.25; }
</style>