HTML5 добавил возможность лучше определять проверку на стороне клиента в формах без необходимости использования JavaScript. Концепция уже существовала с такими атрибутами, как "maxlength" и "minlength". Он был расширен такими атрибутами, как "required" и "pattern". Тем не менее, HTML5 также определил ограничения для этих атрибутов, и браузеры WebKit внедрили эти ограничения (вероятно, с Firefox и Opera не сильно отстали).
Рассматриваемые ограничения связаны с видимостью элемента управления формы при скрытии с помощью CSS/JavaScript с использованием display: none
или visibility: hidden
правила CSS. Ограничения определены как:
4.10.7.1.1 Скрытое состояние
Когда
input
атрибут типа элемента находится в скрытом состоянии [...]input
элемент представляет собой значение, которое не предназначено, чтобы быть рассмотрено или манипулировать пользователем.[Также,]
- Атрибут
value
IDL применяется к этому элементу и находится в режиме по умолчанию.- Следующие атрибуты содержимого не должны быть указаны и не применяются к элементу:
accept
,alt
,autocomplete
,checked
,dirname
,formaction
,formenctype
,formmethod
,formnovalidate
,formtarget
,height
,list
,max
,maxlength
,min
,multiple
,pattern
,placeholder
,readonly
дляrequired
size
src
step
width
readonly
,required
,size
,src
,step
иwidth
.- Следующие атрибуты и методы IDL не применяются к элементу:
checked
,files
,list
,selectedOption
,selectionStart
,selectionEnd
,selectionDirection
,valueAsDate
иvalueAsNumber
IDL атрибуты;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.
Так я правильно смотрю на это или я что-то упускаю?