Я сделал простую версию этого с javascript, когда работал с ASP.NET AJAX, но он должен работать в любом случае, когда у вашей кнопки есть действительный идентификатор.
Я предпринимаю следующие шаги в событии onclick кнопки:
- Отключить кнопку, которая вызвала событие onclick
- Сохраните идентификатор кнопки в магической переменной
closureId
, к которой я могу обратиться позже через закрытие
- Используйте функцию
setTimeout
для выполнения динамически определенного обратного вызова после указанного количества миллисекунд (5000 мс = 5 секунд)
- В функции обратного вызова я могу сослаться на магию
closureId
и снова включить кнопку после истечения времени ожидания
Ниже приведена простая кнопка HTML, которую вы можете добавить в файл test.html для игры:
Вы все еще должны выполнять проверки на стороне сервера, как предлагали другие, но в моем собственном случае отправка также выполняла проверку бизнес-логики на стороне сервера. Пользователь должен отправить свою форму, а затем ждать, чтобы увидеть, разрешит ли бизнес-логика на стороне сервера эту запись или нет. Это также помогло во время разработки, когда я мог отключить свой сервер и все равно прилично прекратить отправку формы.
Заметьте, я называю эту переменную closureId
«магией», потому что я не совсем понимаю, как она работает.
Я только что понял, что вызов this.id
не работает, потому что this
является ссылкой на функцию тайм-аута, которая выполняет функцию динамического обратного вызова и не имеет какого-либо DOM-идентификатора.
Я не смог найти какой-либо другой способ получить ссылку на исходное событие (this.this.id не работает), но лексическая область видимости как-то позволяет мне по-прежнему обращаться к переменной closureId, как она была определена в то время оригинального нажатия кнопки.
Не стесняйтесь исправлять / комментировать, если вы знаете лучший способ!