Управление отправкой формы на стороне клиента может быть выполнено довольно элегантно, если обработчик onsubmit скрывает кнопку отправки и заменяет ее загрузочной анимацией. Таким образом, пользователь получает немедленную визуальную обратную связь в том же месте, где произошло его действие (щелчок). В то же время вы запрещаете отправку формы в другой раз.
Если вы отправляете форму через XHR, имейте в виду, что вы также должны обрабатывать ошибки отправки, например, тайм-аут. Вам нужно будет снова отобразить кнопку отправки, потому что пользователь должен повторно отправить форму.
С другой стороны, llimllib приводит очень верное замечание. Все проверки формы должны происходить на стороне сервера. Это включает в себя несколько проверок представления. Никогда не доверяйте клиенту! Это не только тот случай, если javascript отключен. Вы должны помнить, что весь код на стороне клиента может быть изменен. Это сложно представить, но html / javascript, общающийся с вашим сервером, не обязательно является написанным вами html / javascript.
Как предполагает llimllib, сгенерируйте форму с уникальным для этой формы идентификатором и поместите ее в скрытое поле ввода. Сохраните этот идентификатор. При получении данных формы обрабатывайте их только при совпадении идентификатора. (Также свяжите идентификатор с сеансом пользователя и сопоставьте его также для дополнительной безопасности.) После обработки данных удалите идентификатор.
Конечно, время от времени вам нужно очищать идентификаторы, для которых никогда не было отправлено никаких данных формы. Но, скорее всего, ваш сайт уже использует какой-то механизм «сборки мусора».