HTML5 agregado en la capacidad de definir mejor la validación del lado del cliente en formularios sin necesidad de usar JavaScript. El concepto ya existía con atributos como "maxlength" y "minlength". Se ha ampliado con atributos como "requerido" y "patrón". Sin embargo, HTML5 también ha definido límites en estos atributos y los navegadores WebKit han implementado estas restricciones (probablemente Firefox y Opera no se quedan atrás).¿Tiene sentido el manejo de controles de formulario ocultos en HTML5?
El restrictions in question tiene que ver con la visibilidad del control de formulario cuando está oculto por CSS/JavaScript usando las reglas de CSS display: none
o visibility: hidden
. Las restricciones se definen como:
4.10.7.1.1 estado oculto
Cuando el tipo de atributo de un elemento de
input
está en el estado oculto [...] El elementoinput
representa un valor que no es destinado a ser examinado o manipulado por el usuario.[Además,]
- El atributo
value
IDL se aplica a este elemento y está en modo por defecto.- Los siguientes atributos de contenido no deben ser especificadas y no se aplican al elemento:
accept
,alt
,autocomplete
,checked
,dirname
,formaction
, ,formmethod
,formnovalidate
,formtarget
,height
,list
,max
,maxlength
,min
,multiple
,pattern
,placeholder
,readonly
,required
,size
,src
,step
ywidth
. atribuye- El siguiente IDL y métodos no se aplican al elemento:
checked
,files
,list
,selectedOption
,selectionStart
,selectionEnd
,selectionDirection
,valueAsDate
, y atributosvalueAsNumber
IDL;select()
,setSelectionRange()
,stepDown()
ystepUp()
métodos.- Los eventos
input
ychange
no se aplican.
A primera vista, tiene sentido decir que la validación no debería necesitar ser realizado en forma de controles que el usuario tiene el control sobre. Y, para los formularios creados con los elementos de control de formulario predeterminados, estos tienen sentido. Pero ahora, ha surgido un problema con la construcción de controles de forma remota.
Ni HTML5 ni CSS3 (ni los principales navegadores) han simplificado mucho el estilo de los controles de formulario. Los elementos <select>
siguen siendo muy restringidos en términos de diseño y los elementos <input>
y <button>
tienen reglas de estilo molestamente diferentes (y para los navegadores que no son IE, la orientación de navegador CSS casi imposible). Como tal, cuando mis diseñadores quieren controles de forma "bonitos", es posible que necesiten reconstruirse usando HTML, CSS y JavaScript. El control simulado controlará de forma remota el control real que está oculto por CSS.Esto se aplica a los elementos <select>
, <input type="checkbox">
y <input type="radio">
, todos los cuales causan un problema en los navegadores WebKit cuando se les da el atributo required
.
Dado que la especificación HTML5 establece que ciertos atributos, como required
, no pueden existir en los controles de formulario ocultos, los exploradores deberán responder a los atributos no válidos. Los navegadores WebKit están respondiendo al no enviar el formulario (y no desencadenar el evento de JavaScript submit
). Me estoy encontrando con el error ahora con un elemento <select>
.
cromo produce este error en la consola:
un control de formulario no válido con el nombre = 'elemento nombre' no es enfocable.
Safari falla al mostrar una barra gris en la parte inferior de la ventana con el mensaje:
favor, seleccione un elemento de la lista
Por lo tanto, mi preocupación es si HTML5 es demasiado restrictivo o me estoy acercando a este problema de forma incorrecta. O bien:
- La especificación de HTML5 es defectuosa y agrega una restricción adicional sin otra solución. HTML5 asume que si un control de formulario no está visible, el usuario no debería poder interactuar con él. Esto evita que los desarrolladores utilicen los atributos de validación de HTML5 para los elementos que controlamos de forma remota, mientras que se deja oculto el control de formulario original. Todavía no tenemos la capacidad de crear nuestros controles personalizados usando solo CSS, lo que requiere que todavía los construyamos nosotros mismos.
- Manejo incorrecto de controles de formulario remotos. como estoy usando una técnica "vieja" para resolver un problema que muy bien puede haber sido redefinido, es posible que mi enfoque sea obsoleto. También es posible que, dado que WebKit sea el único que maneje esta restricción en este momento, WebKit tenga una solución alternativa para esto que aún no haya encontrado.
Las únicas soluciones que se me ocurre en este momento son a
- Retire los atributos restringidas siempre que dinámicamente ocultar un control de formulario con JavaScript, lo que significaría que sacrifico de validación de HTML 5,
- Muestra temporalmente y oculta inmediatamente los controles de formulario infractores, aunque no estoy seguro de cuándo se realizará, ya que el evento
submit
nunca se activa y es posible enviar un formulario sin activar el eventoclick
en el botón de envío, o - Utilice el atributo
novalidate
, aunque aún perdería la validación HTML5.
¿Estoy viendo esto correctamente o me falta algo?
P.S. Perdón por la duración. Todo después del descanso es mi "tl; dr".
No es una respuesta muy útil, pero le sugiero que no acepte implementar diseños de control de formularios que no puede lograr a través de CSS o que no use los atributos de validación de HTML5 en campos ocultos. –
@PaulD Siento que esta es una opción que no debería tener que hacerse. HTML5 tomó tanto tiempo porque tenía que definirse para trabajar con la web en su estado actual. En este caso, nos vemos obligados a deshacernos de nuestros controles de formulario personalizados o volver al manejo de formularios HTML4. De cualquier forma, no estamos avanzando en la web. – Koviko
en realidad no estás obligado a "volver", ¿o sí? Simplemente no puede aprovechar los atributos de validación de HTML5 si usa campos de formulario ocultos. Dado que ya estás recreando los campos de formulario incorporados de HTML a través de JavaScript, esta es otra parte de eso. –