HTML5 добавил возможность лучше определять проверку на стороне клиента в формах без необходимости использования JavaScript. Концепция уже существовала с такими атрибутами, как "maxlength" и "minlength". Он был расширен такими атрибутами, как "required" и "pattern". Тем не менее, HTML5 также определил ограничения для этих атрибутов, и браузеры WebKit внедрили эти ограничения (вероятно, с Firefox и Opera не сильно отстали).
Рассматриваемые ограничения связаны с видимостью элемента управления формы при скрытии с помощью CSS/JavaScript с использованием display: none или visibility: hidden правила CSS. Ограничения определены как:
4.10.7.1.1 Скрытое состояние
Когда
inputатрибут типа элемента находится в скрытом состоянии [...]inputэлемент представляет собой значение, которое не предназначено, чтобы быть рассмотрено или манипулировать пользователем.[Также,]
- Атрибут
valueIDL применяется к этому элементу и находится в режиме по умолчанию.- Следующие атрибуты содержимого не должны быть указаны и не применяются к элементу:
accept,alt,autocomplete,checked,dirname,formaction,formenctype,formmethod,formnovalidate,formtarget,height,list,max,maxlength,min,multiple,pattern,placeholder,readonlyдляrequiredsizesrcstepwidthreadonly,required,size,src,stepиwidth.- Следующие атрибуты и методы IDL не применяются к элементу:
checked,files,list,selectedOption,selectionStart,selectionEnd,selectionDirection,valueAsDateиvalueAsNumberIDL атрибуты;setSelectionRange()select(),setSelectionRange(),stepDown()иstepUp().- События
inputиchangeне применяются.
На первый взгляд имеет смысл сказать, что проверка не должна выполняться для элементов управления формы, над которыми пользователь не имеет никакого контроля. И для формы, построенной с использованием элементов управления формой по умолчанию, они имеют смысл. Но теперь возникла проблема с созданием удаленных элементов управления формой.
Ни HTML5, ни CSS3 (ни основные браузеры) не сделали так, чтобы стилизовать элементы управления формы намного проще. Элементы <select> по-прежнему сильно ограничены с точки зрения стиля, и оба элемента <input> и <button> имеют досадно разные правила стиля (и для браузеров, не относящихся к IE, почти невозможна ориентация на браузер CSS). Поэтому, когда мои дизайнеры хотят иметь "красивые" элементы управления формой, их, возможно, придется перестраивать с использованием HTML, CSS и JavaScript. Имитированное управление будет дистанционно управлять реальным управлением, скрытым CSS. Это относится к элементам <select>, <input type="checkbox"> и <input type="radio"> для меня, которые вызывают проблему в браузерах WebKit, когда задан required атрибут.
Поскольку в спецификации HTML5 указано, что определенные атрибуты, такие как required, не могут существовать в скрытых элементах управления формой, браузеры должны будут реагировать на недопустимые атрибуты. Браузеры WebKit отвечают, не отправляя форму вообще (и не вызывая событие submit JavaScript). Я сталкиваюсь с ошибкой прямо сейчас с элементом <select>.
Chrome терпит неудачу с этой ошибкой к консоли:
Недопустимый элемент управления формы с name = 'element-name' не может быть сфокусирован.
Safari терпит неудачу, показывая серую полосу в нижней части окна с сообщением:
Пожалуйста, выберите элемент в списке
Итак, меня беспокоит, слишком ли HTML5 ограничивает или я неправильно подхожу к этому вопросу. Или:
- Спецификация HTML5 имеет недостатки и добавляет дополнительные ограничения без другого решения. HTML5 предполагает, что если элемент управления формы не виден, пользователь не должен иметь возможность взаимодействовать с ним. Это не позволяет разработчикам использовать атрибуты проверки HTML5 для элементов, которыми мы управляем удаленно, оставляя скрытым исходный элемент управления формы. У нас до сих пор нет возможности создавать наши собственные элементы управления, используя только CSS, что требует, чтобы мы все равно строили их сами.
- Я неправильно обрабатываю удаленные элементы управления. поскольку я использую "старую" технику для решения проблемы, которая вполне могла быть переопределена, возможно, мой подход устарел. Также возможно, что поскольку WebKit является единственным, который в настоящее время обрабатывает это ограничение, у WebKit есть обходной путь, которого я пока не нашел.
Единственные обходные пути, которые я могу придумать на данный момент, это
- Удалять ограниченные атрибуты всякий раз, когда я динамически скрываю элемент управления формы с помощью JavaScript, что означало бы, что я жертвую проверкой HTML5,
- Временно отобразить и сразу скрыть элементы управления формы, вызывающие оскорбления, хотя я не уверен, когда это будет сделано, поскольку событие
submitникогда не запускается и можно отправить форму, не вызывая событиеclickна кнопке отправки, или - Используйте атрибут
novalidate, хотя я все равно потеряю проверку HTML5.
Так я правильно смотрю на это или я что-то упускаю?