#javascript #event-handling #dom-events
#javascript #обработка событий #dom-события
Вопрос:
Я создаю веб-страницу, на которой расположена кнопка. Когда пользователь нажимает кнопку, мой Javascript использует AJAX для вызова моей серверной части, которая запрашивает мою базу данных и получает несколько изображений для вывода на экран. Это что-то вроде этого (псевдокод):
// JS event
button.on('click', function(){
// Here my AJAX calling
$.post(callMyBackend, {
foo: bar // Parameters
}, function (responseText) {
// Here goes more stuff...
});
});
Все работает отлично, но я хочу, чтобы пользователь не злоупотреблял, слишком быстро нажимая на кнопку. Итак, если пользователь нажимает 3 раза очень быстро, я бы хотел, чтобы вызов моего бэкэнда происходил один раз (не 3 раза) и возвращал результаты только для последнего вызова (внимание, последнего, а не первого!).).
Как я мог это решить?
Комментарии:
1. Я вижу ответы, которые решают проблему, если я хотел бы выполнить первый вызов. Я этого не хочу. Я хочу выполнить ПОСЛЕДНИЙ вызов.
Ответ №1:
Вы можете добавить progress
переменную:
// JS event
var progress = false;
button.on('click', function() {
if (progress) {
return;
}
progress = true;
// Here my AJAX calling
$.post(callMyBackend, {
foo: bar // Parameters
}, function(responseText) {
progress = false;
// Here goes more stuff...
});
});
конечно, я рекомендую вам добавить js-код для изменения стиля вашей кнопки, например, «отключено»
Ответ №2:
// JS event
button.on('click', function( this ){
if ( !this.hasAttribute( 'data-noclick' ) ) {
// Here my AJAX calling
this.setAttribute( 'data-noclick', 'true' );
$.post(callMyBackend, {
foo: bar // Parameters
}, function (responseText) {
// Here goes more stuff...
this.removeAttribute( 'data-noclick' );
});
});
Комментарии:
1. Это решает проблему, если я хотел бы выполнить первый вызов. Я этого не хочу. Я хочу выполнить ПОСЛЕДНИЙ вызов.
Ответ №3:
Вы можете отключить кнопку в качестве первого действия. Когда вам нужно или по истечении времени ожидания, вы можете снова включить кнопку:
$('#button').on('click', function(){
this.disabled = true;
setTimeout(function(ele) {
ele.disabled = false;
}, 1000, this)
return; // ......
// Here my AJAX calling
$.post(callMyBackend, {
foo: bar // Parameters
}, function (responseText) {
// Here goes more stuff...
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="button">Click Me</button>
Комментарии:
1. Это решает проблему, если я хотел бы выполнить первый вызов. Я этого не хочу. Я хочу выполнить ПОСЛЕДНИЙ вызов.