> Как предотвратить двойной заказ при двойном клике на кнопку? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: elirox
Стек: JavaScript
> Пример ответа
Самый простой и надёжный способ - отключить кнопку сразу после первого клика и включить её после завершения операции (успешного или с ошибкой). Пример на JavaScript:
JAVASCRIPTconst button = document.querySelector('#submitBtn');button.addEventListener('click', async function(event) {event.preventDefault();this.disabled = true; // Блокируем кнопкуthis.textContent = 'Отправка...';try {await fetch('/order', { method: 'POST' });// Успех} catch (error) {console.error('Ошибка:', error);} finally {this.disabled = false; // Разблокируемthis.textContent = 'Отправить';}});
Если операция не асинхронная, можно использовать флаг:
JAVASCRIPTlet isProcessing = false;button.addEventListener('click', function() {if (isProcessing) return;isProcessing = true;// ... логика заказа ...isProcessing = false;});
Также можно добавить CSS-стиль для визуальной блокировки:
CSSbutton:disabled {opacity: 0.6;cursor: not-allowed;}
Для React-приложений удобно использовать состояние:
JSXconst [isSubmitting, setIsSubmitting] = useState(false);const handleSubmit = async () => {if (isSubmitting) return;setIsSubmitting(true);await placeOrder();setIsSubmitting(false);};<button disabled={isSubmitting} onClick={handleSubmit}>{isSubmitting ? 'Отправка...' : 'Заказать'}</button>
Главное блокировать кнопку до завершения операции, а не только на время анимации.
> Похожие задачи по frontend
Как вызвать функцию, чтобы this указывал на нужный объект, а не на window в JavaScript
Почему this равен window, а this.name выводит другое значение в JavaScript
Как работает приведение типов в выражениях с операторами сравнения в JavaScript
Как реализовать метод addClass с поддержкой цепочки вызовов
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью