Ответ 1
Я нашел это решение простым и сработало для меня:
<form ...>
<input ...>
<button ... onclick="this.disabled=true;this.value='Submitting...'; this.form.submit();">
</form>
Это решение было найдено в: Исходное решение
У меня есть следующий код jQuery для предотвращения двойного нажатия кнопки. Он работает нормально. Я использую Page_ClientValidate()
, чтобы гарантировать двойное нажатие, только если страница действительна. [Если есть ошибки проверки, флаг не должен быть установлен, так как нет возврата к серверу]
Есть ли лучший способ предотвратить второй щелчок на кнопке до загрузки страницы?
Можно ли установить флаг isOperationInProgress = yesIndicator
, только если страница вызывает обратную передачу на сервер? Есть ли подходящий event
для него, который будет вызываться до того, как пользователь может нажать кнопку второй раз?
Примечание. Я ищу решение, для которого не требуется никакого нового API
Примечание. Этот вопрос не является дубликатом. Здесь я стараюсь избегать использования Page_ClientValidate()
. Также я ищу event
, где я могу перемещать код так, чтобы мне не нужно было использовать Page_ClientValidate()
Примечание. В моем сценарии нет ajax. Форма ASP.Net
будет отправлена на сервер синхронно. Событие нажатия кнопки в javascript предназначено только для предотвращения двойного щелчка. Представление формы синхронно с использованием ASP.Net.
Существующий код
$(document).ready(function () {
var noIndicator = 'No';
var yesIndicator = 'Yes';
var isOperationInProgress = 'No';
$('.applicationButton').click(function (e) {
// Prevent button from double click
var isPageValid = Page_ClientValidate();
if (isPageValid) {
if (isOperationInProgress == noIndicator) {
isOperationInProgress = yesIndicator;
} else {
e.preventDefault();
}
}
});
});
Ссылки
Примечание @Peter Ivan в приведенных выше ссылках:
вызов page_ClientValidate() может привести к слишком навязчивой странице (несколько предупреждений и т.д.).
Я нашел это решение простым и сработало для меня:
<form ...>
<input ...>
<button ... onclick="this.disabled=true;this.value='Submitting...'; this.form.submit();">
</form>
Это решение было найдено в: Исходное решение
отключить кнопку при нажатии, включить ее после завершения операции
$(document).ready(function () {
$("#btn").on("click", function() {
$(this).attr("disabled", "disabled");
doWork(); //this method contains your logic
});
});
function doWork() {
alert("doing work");
//actually this function will do something and when processing is done the button is enabled by removing the 'disabled' attribute
//I use setTimeout so you can see the button can only be clicked once, and can't be clicked again while work is being done
setTimeout('$("#btn").removeAttr("disabled")', 1500);
}
JS обеспечивает простое решение с использованием свойств события:
$('selector').click(function(event) {
if(!event.detail || event.detail == 1){//activate on first click only to avoid hiding again on multiple clicks
// code here. // It will execute only once on multiple clicks
}
});
с использованием count,
clickcount++;
if (clickcount == 1) {}
После повторного набора кликов, установленного на ноль.
Один из способов сделать это - установить счетчик, и если число превышает определенное число, верните false. легко, как это.
var mybutton_counter=0;
$("#mybutton").on('click', function(e){
if (mybutton_counter>0){return false;} //you can set the number to any
//your call
mybutton_counter++; //incremental
});
убедитесь, что оператор находится поверх вашего вызова.
Это должно сработать для вас:
$(document).ready(function () {
$('.applicationButton').click(function (e) {
var btn = $(this),
isPageValid = Page_ClientValidate(); // cache state of page validation
if (!isPageValid) {
// page isn't valid, block form submission
e.preventDefault();
}
// disable the button only if the page is valid.
// when the postback returns, the button will be re-enabled by default
btn.prop('disabled', isPageValid);
return isPageValid;
});
});
Обратите внимание, что вы также должны предпринять шаги на стороне сервера для предотвращения двойных сообщений, так как не каждый посетитель вашего сайта будет достаточно вежлив, чтобы посетить его с помощью браузера (не говоря уже обозревателя с поддержкой JavaScript).
Отключить события указателя в первой строке вашего обратного вызова, а затем возобновить их в последней строке.
element.on('click', function() {
element.css('pointer-events', 'none');
//do all of your stuff
element.css('pointer-events', 'auto');
};
Возможно, это поможет и даст желаемую функциональность:
$('#disable').on('click', function(){
$('#disable').attr("disabled", true);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="disable">Disable Me!</button>
<p>Hello</p>
Мы можем использовать и отключать клики для предотвращения множественных кликов. я попробовал это для своего приложения и работал как ожидалось.
$(document).ready(function () {
$("#disable").on('click', function () {
$(this).off('click');
// enter code here
});
})
Если вы делаете полную обратную связь в оба конца, вы можете просто заставить кнопку исчезнуть. Если есть ошибки проверки, кнопка снова будет видна после перезагрузки страницы.
Первый набор добавляет стиль к вашей кнопке:
<h:commandButton id="SaveBtn" value="Save"
styleClass="hideOnClick"
actionListener="#{someBean.saveAction()}"/>
Затем заставьте его скрыть при нажатии.
$(document).ready(function() {
$(".hideOnClick").click(function(e) {
$(e.toElement).hide();
});
});
После нескольких часов поиска я исправил его следующим образом:
old_timestamp == null;
$('#productivity_table').on('click', function(event) {
// code executed at first load
// not working if you press too many clicks, it waits 1 second
if(old_timestamp == null || old_timestamp + 1000 < event.timeStamp)
{
// write the code / slide / fade / whatever
old_timestamp = event.timeStamp;
}
});
Просто скопируйте этот код в свой script и отредактируйте # button1 с идентификатором вашей кнопки, и он решит вашу проблему.
<script type="text/javascript">
$(document).ready(function(){
$("#button1").submit(function() {
$(this).submit(function() {
return false;
});
return true;
});
});
</script
Я изменил решение byKalyani, и до сих пор он работал красиво!
$('selector').click(function(event) {
if(!event.detail || event.detail == 1){ return true; }
else { return false; }
});