Atributo obligatorio HTML5

81

Dentro de mi aplicación web, estoy usando una validación personalizada para mis campos de formulario. Dentro del mismo formulario tengo dos botones: uno para enviar el formulario y el otro para cancelar / restablecer el formulario.

Principalmente utilizo Safari como mi navegador predeterminado. Ahora Safari 5 está fuera y, de repente, mi botón cancelar / reiniciar ya no funcionaba. Cada vez que presioné el botón de reinicio, el primer campo de mi formulario obtuvo el foco. Sin embargo, este es el mismo comportamiento que la validación de mi formulario personalizado. Al probarlo con otro navegador, todo funcionó bien. Tenía que ser un problema de Safari 5.

Cambié un poco en mi código Javascript y descubrí que la siguiente línea estaba causando el problema:

document.getElementById("somefield").required = true;

Para estar seguro de que ese sería realmente el problema, creé un escenario de prueba:

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
</head>

<body>
    <form id="someform">
        <label>Name:</label>&nbsp;<input type="text" id="name" required="true" /><br/>
        <label>Car:</label>&nbsp;<input type="text" id="car" required="true" /><br/>
        <br/>
        <input type="submit" id="btnsubmit" value="Submit!" />
    </form>
</body>
</html>

Lo que esperaba que sucediera sucedió. El primer campo "nombre" obtuvo el foco automáticamente.

¿Alguien más tropezó con esto?

Joop
fuente
2
Ahora no es necesario establecer el atributo requerido en verdadero. Por ejemplo: <input type = "text" id = "name" required = "true" /> y <input type = "text" id = "name" required /> es el mismo
RSK
Es cierto, es un mal hábito mío, cuando estaba acostumbrado a codificar en XHTML ... ¿Pero todos los navegadores modernos admiten esta etiqueta sin = "required"? Creo que Safari no ...
Loic Cara
¿Cuál es el comportamiento real y esperado?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
según blog.grayghostvisuals.com/html/using-html-required-attribute "Si el atributo está presente, su valor debe ser la cadena vacía o un valor que no distinga entre mayúsculas y minúsculas para el nombre canónico del atributo, sin espacios en blanco iniciales o finales ". para los atributos "booleanos", por lo que en lugar de required = "true" debería haber required = "required" o simplemente obligatorio
George Birbilis

Respuestas:

49

Me acabo de encontrar con este problema con Safari 5 y ha sido un problema con Opera 10 durante algún tiempo, pero nunca dediqué tiempo a solucionarlo. Ahora necesito arreglarlo y vi su publicación, pero aún no tengo una solución sobre cómo cancelar el formulario. Después de mucha búsqueda finalmente encontré algo:

http://www.w3.org/TR/html5/forms.html#attr-fs-formnovalidate

<input type=submit formnovalidate name=cancel value="Cancel">

Funciona en Safari 5 y Opera 10.

Darrik Spaude
fuente
8
También puede usar novalidatela etiqueta del formulario para hacer esto para todo el formulario.
Michael Mior
He empaquetado una pequeña extensión de Chrome agregando este atributo a todos los formularios en la pestaña actual, ¡gracias por el consejo! chrome.google.com/webstore/detail/html5-form-validation-rem/…
Damien
Era importante para mi caso, formnovalidatelas obras con el tipo de botón también presentar: <button type="submit" formnovalidate>Submit</button>.
Mayeenul Islam
256

Tenga en cuenta que

<input type="text" id="car" required="true" />

está mal, debería ser uno de

<input type="text" id="car" required />
<input type="text" id="car" required="" />
<input type="text" id="car" required='' />
<input type="text" id="car" required=required />
<input type="text" id="car" required="required" />
<input type="text" id="car" required='required' />

Esto se debe a que el truevalor sugiere que el falsevalor hará que el control de formulario sea opcional, lo cual no es el caso.

Ms2ger
fuente
7
Esta respuesta es cierta, pero creo que ese no es el problema que tenemos aquí.
PhoneixS
¿Es seguro usar esto? ... Quiero decir, ¿debería usar esto o simplemente ceñirme a la validación de JavaScript? por seguro, quiero decir, ¿esta solución produce anomalías en diferentes navegadores / dispositivos ...?
kebyang
8
Me gustaría señalar que el código original no es "incorrecto", solo implica que podría usarlo falsepara hacer que un campo sea opcional (no es obligatorio), lo cual no es el caso. Lo que debe comprender es que la presencia del requiredatributo hace que el campo sea obligatorio. La única forma de hacer que el campo sea opcional es eliminar el atributo. Y LA VALIDACIÓN DEL LADO DEL SERVIDOR ES TODO LO QUE REALMENTE IMPORTA (perdón por gritar).
Ryan Wheale
@RyanWheale Creo que la validación del lado del cliente (aunque insuficiente por sí misma) realmente también importa
jinglesthula
1
@jinglesthula: la validación del lado del cliente no es más que una conveniencia para el usuario (ahorra viajes de ida y vuelta al servidor, lo que resulta en una mejor UX). Me estaba refiriendo a un comentario anterior "¿Es seguro usar esto [en todos los navegadores]?" , Y la respuesta es que realmente no importa siempre que la validación del lado del servidor funcione (por ejemplo, el navegador anterior no reconocerá el formulario HTML5 validación y enviará un campo "obligatorio" con un valor nulo).
Ryan Wheale
19

Si entiendo correctamente su pregunta, ¿es el hecho de que el requiredatributo parece tener un comportamiento predeterminado en Safari lo que lo confunde? Si es así, consulte: http://w3c.github.io/html/sec-forms.html#the-required-attribute

required no es un atributo personalizado en HTML 5. Está definido en la especificación y se usa precisamente de la forma en que lo está usando actualmente.

EDITAR : Bueno, no precisamente . Como ha señalado ms2ger, el requiredatributo es un atributo booleano , y esto es lo que la especificación HTML 5 tiene que decir al respecto:

Nota: Los valores "verdadero" y "falso" no están permitidos en los atributos booleanos. Para representar un valor falso, el atributo debe omitirse por completo.

Ver: http://w3c.github.io/html/infrastructure.html#sec-boolean-attributes

David Foster
fuente
2
Y es por eso que no deberíamos crear atributos o propiedades personalizados en objetos estándar.
Quentin
¿Alguna idea de cómo desactivar esto para Chrome y Safari para la página en particular?
Restuta
@Restuta vaya a about: flags para deshabilitar esto en Chrome. Firefox, no estoy seguro.
therealklanni
8

Safari 7.0.5 aún no admite la notificación para la validación de los campos de entrada.

Para superarlo, es posible escribir un script alternativo como este: http://codepen.io/ashblue/pen/KyvmA

Para ver qué funciones HTML5 / CSS3 son compatibles con los navegadores, consulte: http://caniuse.com/form-validation

function hasHtml5Validation () {
  //Check if validation supported && not safari
  return (typeof document.createElement('input').checkValidity === 'function') && 
    !(navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0);
}

$('form').submit(function(){
    if(!hasHtml5Validation())
    {
        var isValid = true;
        var $inputs = $(this).find('[required]');
        $inputs.each(function(){
            var $input = $(this);
            $input.removeClass('invalid');
            if(!$.trim($input.val()).length)
            {
                isValid = false;
                $input.addClass('invalid');                 
            }
        });
        if(!isValid)
        {
            return false;
        }
    }
});

SASS / MENOS:

input, select, textarea {
    @include appearance(none);
    border-radius: 0px;

    &.invalid {
        border-color: red !important;
    }
}
Evalds Urtans
fuente
Gracias. Esto me ayudó mucho.
theGreenCabbage
¿Eso es CSS simple o menos?
James A Mohler
Tengo un iPod touch que por mi vida, todavía se enciende cuando las entradas marcadas como requeridas no funcionaron y encontré esta pregunta y respuesta. Esta respuesta fue la única que funcionó para mí. Solo pensé en compartir eso.
Funk Forty Niner
7

Una pequeña nota sobre los atributos personalizados: HTML5 permite todo tipo de atributos personalizados, siempre que tengan el prefijo de la partícula data-, es decir data-my-attribute="true".

Ludder
fuente
1
Y estos funcionan bien en navegadores más antiguos (excepto que necesitará su propio código para acceder a sus valores, en lugar de la nueva API), por lo que son una mejor opción que crear sus propios atributos (ya que no chocarán con ningún atributos oficiales agregados en el futuro).
Paul D. Waite
1
En realidad, los atributos personalizados pueden ser literalmente cualquier cosa. Aquellos con el prefijo "data-" aparecerán en el element.datasetobjeto, sin embargo, así como otras ventajas (por ejemplo, jQuery podrá tomar automáticamente el valor de cualquier atributo personalizado con prefijo "data-" usando el .data()método, es decir, .data("myAttribute")= valor de data-my-attribute). El uso de atributos personalizados más cortos a veces puede ser útil para crear selectores CSS3 personalizados.
therealklanni
3

Bueno. Al mismo tiempo que escribía mi pregunta, uno de mis colegas me hizo saber que en realidad se trata de un comportamiento HTML5. Ver http://dev.w3.org/html5/spec/Overview.html#the-required-attribute

Parece que en HTML5 hay un nuevo atributo "obligatorio". Y Safari 5 ya tiene una implementación para este atributo.

Joop
fuente
¡Maldita sea, respondiste tu propia pregunta segundos después de que yo publicara la misma respuesta!
David Foster
Gracias a uno de mis colegas. Esto puede ser interesante para otros, supongo.
Joop
¡Seguro! Estoy un poco emocionado de ver lo que la especificación HTML5 final tendrá para ofrecer en el frente del formulario.
David Foster
2

Simplemente ponga lo siguiente debajo de su formulario. Asegúrese de que sus campos de entrada sean required.

<script>
    var forms = document.getElementsByTagName('form');
    for (var i = 0; i < forms.length; i++) {
        forms[i].noValidate = true;
        forms[i].addEventListener('submit', function(event) {
            if (!event.target.checkValidity()) {
                event.preventDefault();
                alert("Please complete all fields and accept the terms.");
            }
        }, false);
    }
</script>
emotalidad
fuente