Маленьким, но очень важным моментом еще является обратная активация конпки через разумный промежуток времени (1-2 минуты), если форма «не прошла», надо дать возможность попробовать повторить отправку, а то вы заставляете вбивать все заново
Если требуется валидировать поля на стороне клиента, то элементарно, если слать всю форму AJAXом на сервер, то может и нужна библиотека, но речь идет вообще не о валидации форм, я говорил про изменения атрибута одной кнопки.
А что делать, если форму отправили нажав ввод в одном из полей?
Начнется отправка, а событие onClick не отработает.
И, скажем, если мы это поправим, и повесим проверку на formSubmit,
то потеряем функционал «открытие результата выполнения в новом окне»
по нажатию на Shift+Enter:
результат откроется в новом окне, а форма или кнопка отправки заблокируются.
Тоже не совсем то, что ожидается.
Не так всё просто получается :)
Остается вопрос: зачем деактивировать кнопку отправки?
В каких ситуациях это делается, чем оправдано?
В ответах на эти вопросы и кроются дальнейшие решения.
> зачем деактивировать кнопку отправки?
1. Предотвратить повторную отправку
2. Избавиться от уёбищных сообщений после нажатия кнопки а ля "%s не может быть добавлено. Введите имя". В жизни я бы ответил: «Ну а хули дали нажимать?». Помните что вы делаете вещи для идиотов.
> В каких ситуациях это делается, чем оправдано?
Везде кроме чатов :)
>по нажатию на Shift+Enter
Тут стоит задуматься над вопросом «Зачем?». Зачем оставлять страницу с формой открытой. Лично я этим ниразу в жизни не пользовался.
>Зачем оставлять страницу с формой открытой. Лично я этим ниразу в жизни не пользовался.
И оставляете за бортом аудиторию, которая этим пользуется. Конечно проще сказать, что они идиоты :), но всё-таки юзабилити превыше всего, и над решением стоит подумать.
У меня на работе формы поддерживаемого веб движка работают по описаному в топике принципу. Всё было хорошо, пока не понадобилось открывать результат выполнения формы в новом окне или дополнительном фрейме или отдавать весь запрос ajax-запросщику.
Конкретный пример:
есть форма, в которую вводятся параметры и кнопка отправки (злополучная)
на основе данных формируется Excel отчет и тут же грузится
выводится диалог на сохранение файла
файл сохраняется, нужно сгенерировать другой отчет
изменив только одно поле, а остальные поля оставить прежними
а форма заблокирована
приходится опять грузить эту форму, вбивать данные
неудобно
ладно регистрация почты, пользователь потерпит
а для людей, которые весь день с такими формами работают
такое поведение может быть неприемлемо
«В идеале, кнопка должна становиться активной только после того, как форма будет полностью валидна.»
Это не дружелюбно, так как вы не пишете объяснений почему форма не может быть отправлена («Поле не заполнено»), а кнопку дезактивируете.
И эти объяснение вылезет только когда пользователь потыкает в поля.
Валидатор всё объяснит после того как пользователь потыкается.
А до этого ему никто ничего не скажет, а кнопку дезактивируют.
Можно, конечно, над формой написать сопроводительный текст мол «Заполните все поля»,
но это лишний текст, в том плане что не должно быть служебного текста слишком много.
Кажется, мол а зачем кнопка нужна если форма всё равно не отправится, а затем что
так интерфейс пользователю более понятен, ибо не надо пользователя заставлять лишний раз думать
создавая косвенные связи (сначала заполни правильно, а потом мы тебе кнопку активируем).
Думаю, стоило бы написать, что данный метод отнюдь не является моим изобретением и давно применяется на ресурсах с лучшим юзабилити. Может было бы меньше вопросов :)
Да, и на «этих» ресурсах дополнительно пишут пояснение к элементам ввода, мол «Введите адрес электронной почты» или «Введите символы с картинки». Тогда заблокированная кнопка выглядит логично.
я на Вас посмотрю когда вам надо будет переписывать код без jQuery… есть вещи для которых нужны библиотеке, а есть в которых лучше без них все сделать… или Вам жалко написать лишних пару символов в setAttribute которая стандартизована не в библиотеках а в браузерах
а я вот пользуюсь оперой, и при использовании в опере кнопок «назад» и «вперед» страница не перегружается и состояние этой кнопки остается disabled. Что очень сильно напрягает, когда например пользуешься какой-нибудь формой запроса.
Боже мой, разве стоит вообще создавать «столь полезные посты»?
Тем более, что они учат, как НЕ надо делать. Дизейблить кнопку отправки нужно по событию onsubmit формы. Если же произошли ошибки валидации — расдизейбливаем кнопку.
А если форма отправляется по AJAX, тогда смотрим, не произошло ли ошибок при передаче данных. Если произошли — тогда btn.disabled = false.
Ко всему написанному, соглашусь с первым комментарием. Так тоже не помешает делать.
В идеале, кнопка должна становиться активной только после того, как форма будет полностью валидна.
Натыкался на такие. Вся эта их утописечкая идеология рушилась когда:
— JS программер слажал и яваскрипт выдал ошибку и не сработал, форму отправить нельзя
— Форм заполнилась, отослалась, пришла обратно с ошибкой «капча неверная», все поля заполнены, но нужно каждое прокликать (тут тоже «умный» проггер поработал)
— Форма была заполнена third-party автозаполняльщиком, так что никакое поле не только клика, даже фокуса не получало.
В идеальном идеале, яваскрипт какбэ должен перехватывать и улучшать (когда может), а НЕ являться обязательным звеном цепочки.
Да, это всё верно. И сама идея верна — лучше сделать хорошо что-то маленькое, чем сделать коряво что-то большое, тем более если основная суть не меняется.
вы забыли добавить что серверный программер что-то накосячил и вообще ексепшены полезли а потом еще админ накосячил и сервер упал… вообще имеется ввиду что нормальная форма должна учитывать валидацию и затем давать пользователю волю на сабмит, и это не значит что пользователь обязан вводить все ручками и только после этого открывать кнопки
Кстати, стоит учесть, что если кнопка задисаблится до отправки данных (по клику), то имя этой кнопки и её значение не будут переданы в GET/POST. Во многих скриптах проверка на приход формы именно по имени кнопки сабмита.
Кнопка «отправить». Просто и полезно.