En mis formularios, me gustaría usar los nuevos tipos de formularios HTML5, por ejemplo <input type="url" />
( más información sobre los tipos aquí ).
El problema es que Chrome quiere ser muy útil y validar estos elementos para mí, excepto que es una mierda. Si falla la validación incorporada, no hay ningún mensaje o indicación que no sea el elemento que se enfoca. Prefiero los elementos URL con "http://"
, por lo que mi propia validación personalizada solo trata esos valores como cadenas vacías, sin embargo, Chrome lo rechaza. Si pudiera cambiar sus reglas de validación, eso también funcionaría.
Sé que podría volver a usar, type="text"
pero quiero las mejoras agradables con estos nuevos tipos de ofertas (por ejemplo: cambia automáticamente a un diseño de teclado personalizado en dispositivos móviles):
Entonces, ¿hay alguna manera de desactivar o personalizar la validación automática?
fuente
inputmode
atributo que, si entiendo lo que leo correctamente, se puede usar para especificar qué tipo de teclado se debe ofrecer al usuario cuando interactúa con el campo, sin implicar ninguna regla de validación. En algún momento en el futuro, usar elinputmode
atributo en lugar deltype
atributo probablemente será la solución correcta a este problema, pero aún no.$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
inputmode
haría. Al hacer las cosas a su manera, aún no puede (por ejemplo) leer valores no numéricos que el usuario escribe en un cuadro de entrada de tiponumber
. Por ejemplo, intente escribir algo no numérico en el cuadro de texto en este violín y haga clic en el botón.<input type='number'>
no acepta valores no numéricos en absoluto?Respuestas:
Si desea deshabilitar la validación del lado del cliente para un formulario en HTML5, agregue un atributo novalidate al elemento del formulario. Ex:
Ver https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-novalidate
fuente
novalidate="novalidate"
y tambiénnovalidate=""
es una sintaxis válida.novalidate="novalidate"
método cuando establezcanovalidate => true
en la$options
matriz deFormHelper::create()
. Gracias bassim por la información adicional :)Leí la especificación e hice algunas pruebas en Chrome, y si detecta el evento "no válido" y devuelve falso, eso parece permitir el envío del formulario.
Estoy usando jquery, con este HTML.
No he probado esto en ningún otro navegador.
fuente
invalid
evento y devolver falso no permite que el formulario se envíe.Solo quería agregar que usar el atributo novalidate en su formulario solo evitará que el navegador envíe el formulario. El navegador aún evalúa los datos y agrega las pseudo clases válidas y no válidas.
Descubrí esto porque las pseudo clases válidas e inválidas son parte de la hoja de estilo HTML5 repetitiva que he estado usando. Acabo de eliminar las entradas en el archivo CSS que se relacionan con las pseudo clases. Si alguien encuentra otra solución, hágamelo saber.
fuente
<form action="" method="" class="" id="" novalidate>
La mejor solución es utilizar una entrada de texto y agregar el atributo inputmode = "url" para proporcionar las funciones del teclado URL. La especificación HTML5 fue pensada para este propósito. Si mantiene type = "url" obtendrá la validación de sintaxis que no es útil en todos los casos (es mejor verificar si devuelve un error 404 en lugar de la sintaxis que es bastante permisiva y no es de gran ayuda).
También tiene la posibilidad de anular el patrón predeterminado con el atributo pattern = "https?: //.+", por ejemplo, para ser más permisivo.
Poner el atributo novalidate en el formulario no es la respuesta correcta a la pregunta formulada porque elimina la validación para todos los campos en el formulario y es posible que desee mantener la validación para los campos de correo electrónico, por ejemplo.
Usar jQuery para deshabilitar la validación también es una mala solución, ya que debería funcionar absolutamente sin JavaScript.
En mi caso, pongo un elemento select con 2 opciones (http: // o https: //) antes de la entrada de URL porque solo necesito sitios web (y no ftp: // u otras cosas). De esta manera, evito escribir este prefijo extraño (el mayor arrepentimiento de Tim Berners-Lee y tal vez la principal fuente de errores de sintaxis de URL) y uso una entrada de texto simple con inputmode = "url" con marcadores de posición (sin HTTP). Uso jQuery y el script del lado del servidor para validar la existencia real del sitio web (no 404) y para eliminar el prefijo HTTP si está insertado (evito usar un patrón como pattern = "^ ((? Http).) * $" para evitar poner el prefijo porque creo que es mejor ser más permisivo)
fuente
En lugar de intentar hacer una ejecución final en torno a la validación del navegador, puede colocar el
http://
texto como marcador de posición. Esto es de la misma página que vinculaste:No sería exactamente lo mismo ya que no proporcionaría ese "punto de partida" para el usuario, pero al menos está a medio camino.
fuente
Encontré una solución para Chrome con CSS en este siguiente selector sin pasar por alto el formulario de verificación nativo que podría ser muy útil.
De esta manera, también puede personalizar su mensaje ...
Obtuve la solución en esta página: http://trac.webkit.org/wiki/Styling%20Form%20Controls
fuente
Simplemente use novalidate en su formulario.
¡¡¡Salud!!!
fuente
Aquí está la función que uso para evitar que Chrome y Opera muestren el diálogo de entrada inválido incluso cuando uso novalidate.
fuente
puede agregar algunos javascript para eliminar esas molestas burbujas de validación y agregar sus propios validadores.
fuente
Si marca un elemento de formulario como
required=""
entoncesnovalidate=""
, no ayuda.Una forma de evitar la
required
validación es deshabilitar el elemento .fuente
Puede instalar una extensión simple de Chrome y simplemente deshabilitar la validación sobre la marcha https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related
de forma predeterminada, todo funcionará de manera predeterminada, pero podrá desactivar la validación html5 con un solo clic en el icono de extensión en la barra de herramientas
fuente