¿Tiene sentido el manejo de controles de formularios ocultos en HTML5?


HTML5 añadido en la capacidad de definir mejor la validación del lado del cliente en los formularios sin necesidad de utilizar 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 con Firefox y Opera no muy lejos).

Las restricciones en cuestión tienen que ver con la visibilidad de un control de formulario cuando está oculto por CSS / JavaScript usando las reglas CSS display: none o visibility: hidden. Las restricciones se definen como:

4.10.7.1.1 estado Oculto

Cuando el atributo type de un elemento input está en el estado oculto [...] El elemento input representa un valor que no está destinado a ser examinado o manipulado por el usuario.

[También,]

  • El atributo IDL value se aplica a este elemento y está en modo predeterminado.
  • Los siguientes atributos de contenido no debe ser especificado y no se aplican al elemento: accept, alt, autocomplete, checked, dirname, formaction, formenctype, formmethod, formnovalidate, formtarget, height, list, max, maxlength, min, multiple, pattern, placeholder, readonly, required, size, src, step, y width.
  • El siguiente IDL atributos y métodos no se aplican al elemento: checked, files, list, selectedOption, selectionStart, selectionEnd, selectionDirection, valueAsDate, y valueAsNumber IDL atributos; select(), setSelectionRange(), stepDown(), y stepUp() métodos.
  • Los eventos input y change no se aplican.

A primera vista, tiene sentido decir que la validación no debería tener que realizarse en controles de formularios sobre los que el usuario tiene control. Y, para los formularios construidos usando elementos de control de formularios predeterminados, estos tienen sentido. Pero ahora, ha surgido un problema con la construcción de controles de formularios remotos.

Ni HTML5 ni CSS3 (ni los principales navegadores) han hecho que sea mucho más fácil diseñar formularios controles. <select> los elementos todavía están muy restringidos en términos de estilo y ambos elementos <input> y <button> tienen reglas de estilo molestamente diferentes (y para navegadores que no son IE, casi imposible segmentación por navegador CSS). Como tal, cuando mis diseñadores quieren controles de formulario "bonitos", pueden necesitar ser reconstruidos usando HTML, CSS y JavaScript. El control simulado controlará remotamente el control real que está oculto por CSS. Esto se aplica a <select>, <input type="checkbox"> y <input type="radio"> elementos para mí, todos los cuales causan un problema en los navegadores WebKit cuando se le da el atributo required.

Dado que la especificación HTML5 establece que ciertos atributos, como required, no pueden existir en controles de formularios ocultos, se requerirá que los navegadores respondan a atributos no válidos. Los navegadores WebKit responden no enviando el formulario en absoluto (y no activando el evento submit de JavaScript). Me estoy topando con el error ahora mismo con un elemento <select>.

Chrome falla con este error en la consola:

An el control de formulario no válido con name = 'element-name ' no es enfocable.

Safari falla al mostrar una barra gris en la parte inferior de la ventana con el mensaje:

Por favor, seleccione un elemento en la lista


Entonces, mi preocupación es si HTML5 es demasiado restrictivo o si estoy abordando este problema incorrectamente. O bien:

  1. 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 es 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, dejando oculto el control del formulario original. Todavía no tenemos la capacidad de crear nuestros controles personalizados utilizando solo CSS, lo que requiere que aún los construyamos nosotros mismos.
  2. Estoy manejando los controles de formulario remotos incorrectamente. como estoy usando una técnica" vieja " para resolver un problema que muy bueno, puede haber sido redefinido, es posible que mi enfoque esté desactualizado. También es posible que, ya que WebKit es el único que maneja esta restricción en este momento, WebKit tiene una solución para esto que aún no he encontrado.

Las únicas soluciones que se me ocurren en este momento son{[58]]}

  • Elimine los atributos restringidos cada vez que oculte dinámicamente un control de formulario con JavaScript, lo que significaría que sacrifico HTML5 validación,
  • Muestra temporalmente y oculta inmediatamente los controles del formulario ofensivo, aunque no estoy seguro de cuándo se haría esto ya que el evento submit nunca se dispara y es posible enviar un formulario sin disparar el evento click en el botón de envío, o
  • Use el atributo novalidate, aunque aún perdería la validación HTML5.

Entonces, ¿estoy viendo esto correctamente o me estoy perdiendo algo?

P.d. Perdón por la longitud. Todo después de la break es mi "tl; dr".

Author: Koviko, 2011-08-04

1 answers

Primero se mezclan dos cosas. Si la especificación HTML5 dice estado oculto, la especificación solo significa un elemento de entrada con un atributo de tipo establecido en el valor "oculto". En este caso, la entrada no se valida, lo que significa que la entrada no puede ser inválida. Y el navegador no aborta el envío del formulario.

Tu problema es otro. Tiene un elemento true invalid, que solo se oculta visualmente (usando display: none) y se reemplaza por otro elemento (o por un conjunto de otros elementos). En su caso el problema es el siguiente: Por especificaciones en caso de validación de formulario interactivo el navegador tiene que enfocar el primer elemento no válido y mostrar al menos para este elemento un mensaje de validación. El problema es que un navegador no puede enfocar un elemento oculto ni mostrar un mensaje de validación debajo de este elemento. Lo que significa que el navegador detiene el envío de formularios, pero tiene una interfaz de usuario extraña para mostrar los problemas de validación.

Ahora a su: ¿Esto tiene sentido? Sí, sí! Si cambia la interfaz de usuario de un formulario elemento que tiene que implementar también la interfaz de usuario para el mensaje de validación. (Si quieres personalizar algo, tienes que personalizar todo lo que quieras usar). HTML5 le da una API para lograr exactamente esto.

Debe enlazar el evento no válido de su elemento select, luego evitar la acción predeterminada (si es el primer evento no válido del formulario) y colocar su propia información de validación en el elemento select con estilo.

En mi formulario HTML5 polyfill (webshims lib), ya estoy usando código para enlazar un elemento nativo (con API) con otro elemento + generando simplemente información sobre herramientas de validación.

He creado un simple jsfiddle, que imita un select-replacement y muestra cómo lograr la validación de formularios HTML5 con controles de formularios personalizados. Puede encontrar el ejemplo aquí.

 20
Author: alexander farkas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 19:09:32