apodo
En mis formularios, me gustaría usar los nuevos tipos de formulario HTML, 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 apesta. Si falla la validación integrada, no hay ningún mensaje o indicación que no sea el elemento que recibe el foco. Prelleno los elementos de la 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 usando estos nuevos tipos de ofertas (por ejemplo, cambia automáticamente a un diseño de teclado personalizado en dispositivos móviles):
¿Hay alguna forma de desactivar o personalizar la validación automática?
Jakob S.
Si desea deshabilitar la validación del lado del cliente para un formulario en HTML, agregue el novalidate
atributo al elemento de formulario. Ex:
<form method="post" action="/foo" novalidate>...</form>
Ver https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-novalidate
-
novalidate="novalidate"
ynovalidate=""
también es una sintaxis válida.– bajo
30 de mayo de 2012 a las 13:20
-
@bassim Sintaxis válida pero demasiado detallada: ¿por qué escribir más de lo necesario?
– usuario1569050
16 de enero de 2013 a las 14:17
-
@ user1569050 Cierto, pero a veces no es su decisión y solo desea validarla. Entonces, básicamente, solo por el bien de la integridad.
– bajo
23 de enero de 2013 a las 9:36
-
@user1569050 Por ejemplo, en marcos como CakePHP, usará el
novalidate="novalidate"
método cuando configura elnovalidate => true
en el$options
matriz de losFormHelper::create()
. Gracias bassim por la información extra 🙂– Jelmer
10 de febrero de 2013 a las 20:36
-
Aquí una extensión de Chrome para agregar este atributo: chrome.google.com/webstore/detail/html5-form-validation-err/…
– Damián
30 de abril de 2013 a las 10:56
ben boyle
Leí la especificación e hice algunas pruebas en Chrome, y si detecta el evento “no válido” y devuelve falso, parece permitir el envío de formularios.
Estoy usando jquery, con este HTML.
// suppress "invalid" events on URL inputs
$('input[type="url"]').bind('invalid', function() {
alert('invalid');
return false;
});
document.forms[0].onsubmit = function () {
alert('form submitted');
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
<input type="url" value="http://" />
<button type="submit">Submit</button>
</form>
No he probado esto en ningún otro navegador.
-
FireFox está validando el cambio de entrada. Entonces el evento ‘inválido’ no se dispara. Entonces, no hay solución para mí.
–Niels Steenbeek
12 de noviembre de 2012 a las 14:42
-
no funciona He convertido el código en un fragmento. atrapando el
invalid
evento y devolver falso no permite que el formulario se envíe.– Dan Dascalescu
7 de julio de 2015 a las 7:59
Solo quería agregar que usar el atributo novalidate en su formulario solo evitará que el navegador envíe el formulario. El navegador sigue evaluando los datos y agrega las pseudoclases :valid e :invalid.
Descubrí esto porque las pseudoclases válidas e inválidas son parte de la hoja de estilo repetitiva de HTML5 que he estado usando. Acabo de eliminar las entradas del archivo CSS relacionadas con las pseudoclases. Si alguien encuentra otra solución, por favor hágamelo saber.
-
Te refieres a:
<form action="" method="" class="" id="" novalidate>
😉– Muhammad Shahzad
24 de abril de 2017 a las 11:01
plancton
La mejor solución es usar una entrada de texto y agregar el atributo inputmode=”url” para proporcionar las funciones de teclado de URL. La especificación HTML5 fue pensada para este propósito. Si mantiene type=”url” obtiene la validación de sintaxis que no es útil en todos los casos (es mejor comprobar 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 patrón=”https?://.+” por ejemplo para ser más permisivo.
Poner el atributo novalidate en el formulario no es la respuesta correcta a la pregunta porque elimina la validación de todos los campos del formulario y es posible que desee mantener la validación de los campos de correo electrónico, por ejemplo.
Usar jQuery para deshabilitar la validación también es una mala solución porque debería funcionar absolutamente sin JavaScript.
En mi caso, puse un elemento de selección 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 extraño prefijo (el mayor arrepentimiento de Tim Berners-Lee y quizás 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 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)
Juan Kugelman
En lugar de intentar hacer una ejecución final alrededor de la validación del navegador, podría poner el http://
en como texto de marcador de posición. Esto es de la misma página que vinculaste:
Texto del marcador
La primera mejora que aporta HTML5 a los formularios web es la capacidad de establecer texto de marcador de posición en un campo de entrada. El texto del marcador de posición se muestra dentro del campo de entrada siempre que el campo esté vacío y no enfocado. Tan pronto como haga clic en (o tabule) el campo de entrada, el texto del marcador de posición desaparece.
Probablemente hayas visto texto de marcador de posición antes. Por ejemplo, Mozilla Firefox 3.5 ahora incluye texto de marcador de posición en la barra de ubicación que dice “Buscar marcadores e historial”:
Cuando hace clic en (o tabula) la barra de ubicación, el texto del marcador de posición desaparece:
Irónicamente, Firefox 3.5 no admite agregar texto de marcador de posición a sus propios formularios web. Así es la vida.
Soporte de marcador de posición
IE FIREFOX SAFARI CHROME OPERA IPHONE ANDROID · 3.7+ 4.0+ 4.0+ · · ·
Así es como puede incluir texto de marcador de posición en sus propios formularios web:
<form> <input name="q" placeholder="Search Bookmarks and History"> <input type="submit" value="Search"> </form>
Navegadores que no soportan el
placeholder
El atributo simplemente lo ignorará. Sin daño, sin falta. Vea si su navegador admite texto de marcador de posición.
No sería exactamente lo mismo ya que no proporcionaría ese “punto de partida” para el usuario, pero al menos está a mitad de camino.
-
+1 por el consejo, pero desafortunadamente no será una solución para mí. Todavía no quiero que se haga ninguna validación, principalmente porque la UX es muy pobre.
– nickf
22 de junio de 2010 a las 5:40
Encontré una solución para Chrome con CSS este siguiente selector sin pasar por alto el formulario de verificación nativo que podría ser muy útil.
form input::-webkit-validation-bubble-message,
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
display:none;
}
De esta forma, también puedes personalizar tu mensaje…
Tengo la solución en esta página:
http://trac.webkit.org/wiki/Estilo%20Form%20Controles
-
+1 por el consejo, pero desafortunadamente no será una solución para mí. Todavía no quiero que se haga ninguna validación, principalmente porque la UX es muy pobre.
– nickf
22 de junio de 2010 a las 5:40
blkpingu
puede agregar algo de javascript para suprimir esas molestas burbujas de validación y agregar sus propios validadores.
document.addEventListener('invalid', (function(){
return function(e) {
//prevent the browser from showing default error bubble / hint
e.preventDefault();
// optionally fire off some custom validation handler
// myValidation();
};
})(), true);
El borrador de especificación de HTML 5.1 menciona un
inputmode
atributoque, 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 que implicando también cualquier regla de validación. En algún momento en el futuro, usando elinputmode
atributo en lugar detype
El atributo probablemente sea la solución correcta a este problema, pero todavía no.–Mark Amery
12 de diciembre de 2013 a las 13:55
@MarkAmery Aunque no sería demasiado difícil obtener el futuro ahora:
$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
– Marnen Laibow-Koser
3 de julio de 2014 a las 19:22
@MarnenLaibow-Koser Si bien lo que ha descrito funciona si todo lo que quiere hacer es desactivar la validación (como lo especifica el autor de la pregunta), no logra el mismo resultado que
inputmode
haría. Haciendo las cosas a su manera, todavía 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 haciendo clic en el botón.–Mark Amery
3 de julio de 2014 a las 20:07
@MarkAmery Interesante. ¿Es porque
<input type='number'>
no acepta valores no numéricos en absoluto?– Marnen Laibow-Koser
7 julio 2014 a las 13:24
@ MarnenLaibow-Koser Supongo que sí. La respuesta aceptada sobre esta pregunta sobre el problema incluye un enlace a la especificación que, según afirma el que responde, exige este comportamiento.
–Mark Amery
7 julio 2014 a las 14:21