> Как предотвратить двойной заказ при двойном клике на кнопку? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: sferaplatform.ru
Стек: JavaScript
> Пример ответа
Самый простой и надёжный способ - отключить кнопку сразу после первого клика. На чистом JavaScript это делается так:
JAVASCRIPTconst button = document.getElementById('submitBtn');button.addEventListener('click', function(event) {// Отключаем кнопку, чтобы предотвратить повторный кликthis.disabled = true;// Выполняем основное действие (например, отправка запроса)submitOrder().then(() => {// После успешного завершения можно снова включить кнопку (если нужно)this.disabled = false;}).catch(error => {// В случае ошибки тоже разблокируем кнопкуthis.disabled = false;console.error('Ошибка:', error);});});
Альтернативные подходы:
-
Флаг-блокировка - если кнопку нельзя отключать по дизайну:
JAVASCRIPTlet isProcessing = false;button.addEventListener('click', function() {if (isProcessing) return;isProcessing = true;// ... логика}); -
Debounce - для случаев, когда двойной клик происходит очень быстро (менее 300 мс):
JAVASCRIPTfunction debounce(fn, delay = 300) {let timer;return function(...args) {clearTimeout(timer);timer = setTimeout(() => fn.apply(this, args), delay);};}button.addEventListener('click', debounce(handleClick, 300)); -
Отмена события - предотвращение всплытия (менее надёжно, так как не защищает от программных вызовов):
JAVASCRIPTbutton.addEventListener('click', function(e) {e.preventDefault();// ... логика});
Рекомендация: Для большинства сценариев (отправка формы, создание заказа) используйте первый вариант с disabled. Он интуитивно понятен пользователю и гарантирует защиту от повторных вызовов, даже если запрос ещё не завершён.
> Похожие задачи по frontend
Какие инструменты и подходы CI/CD вы применяли
Что такое Dependency Injection (DI)
Как реализуется инкапсуляция в JavaScript
Что такое call, apply и bind в JavaScript и в чем их разница
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью