116 votes

Comment définir l'attribut obligatoire HTML5 en Javascript ?

J'essaie de marquer un text la boîte de saisie comme requis en Javascript.

<input id="edName" type="text" id="name">

Si le champ est initialement marqué comme required :

<form>
    <input id="edName" type="text" id="name" required><br>
    <input type="submit" value="Search">
</form>

lorsque l'utilisateur essaie d'envoyer le formulaire, il reçoit une erreur de validation :

enter image description here

Mais maintenant, je veux définir le required attribut à "runtime" par le biais de Javascript :

<form>
    <input id="edName" type="text" id="name"><br>
    <input type="submit" value="Search">
</form>

avec le script correspondant :

//recommended W3C HTML5 syntax for boolean attributes
document.getElementById("edName").attributes["required"] = "";         

Sauf que lorsque je soumets maintenant, il n'y a pas de contrôle de validation, pas de blocage.

Quel est le correct manière d'établir un Attribut booléen de validation HTML5 ?

jsFiddle

Quelle est la valeur de cet attribut, demandez-vous ?

La validation HTML5 required est documenté en tant que Boolean :

4.10.7.3.4 Les required attribut

Le site required est un attribut attribut booléen . Lorsqu'il est spécifié, l'élément est obligatoire.

On s'interroge beaucoup sur la manière de définir une boolean attribut. La spécification HTML5 note :

La présence d'un attribut booléen sur un élément représente la valeur vraie, et l'absence de l'attribut représente la valeur fausse.

Si l'attribut est présent, sa valeur doit être soit la chaîne vide, soit une valeur qui correspond au nom canonique de l'attribut sans tenir compte de la casse, sans espace avant ou après.

Cela signifie que vous pouvez spécifier un required boolean attribut de deux manières différentes :

edName.attributes.required = ""; //the empty string
edName.attributes.required = "required"; //the attribute's canonical name

Mais quelle est la valeur de l'attribut vraiment ?

Quand vous regardez mon jsFiddle de ce problème vous remarquerez que si le required est défini dans le balisage :

<input id="edName" type="text" id="name" required>

La valeur de l'attribut est alors no la chaîne vide, ni le nom canonique de l'attribut :

edName.attributes.required = [object Attr]

Cela pourrait conduire à une solution.

151voto

T.J. Crowder Points 285826

required est un propriété réfléchie (comme id , name , type et autres), donc :

element.required = true;

...où element est l'effectif input Élément DOM, par exemple :

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

(Juste pour être complet.)

Re :

Alors la valeur de l'attribut n'est pas la chaîne vide, ni le nom canonique de l'attribut :

edName.attributes.required = [object Attr]

C'est parce que required dans ce code est un objet attributaire et non une chaîne ; attributes est un NamedNodeMap dont les valeurs sont Attr objets . Pour obtenir la valeur de l'un d'entre eux, on regarde son value propriété. Mais pour un attribut booléen, la valeur n'est pas pertinente ; l'attribut est soit présent dans la carte (true), soit absent (false).

Donc si required n'étaient pas reflétée, vous la définissez en ajoutant l'attribut :

element.setAttribute("required", "");

...qui est l'équivalent de element.required = true . Vous le nettoyez en l'enlevant complètement :

element.removeAttribute("required");

...qui est l'équivalent de element.required = false .

Mais nous n'avons pas à faire ça avec required puisque c'est réfléchi.

142voto

Ian Boyd Points 50743

Version courte

element.setAttribute("required", "");    //turns required on
element.required = true;                 //turns required on through reflected attribute
jQuery(element).attr('required', '');    //turns required on
$("#elementId").attr('required', '');    //turns required on

element.removeAttribute("required");     //turns required off
element.required = false;                //turns required off through reflected attribute
jQuery(element).removeAttr('required');  //turns required off
$("#elementId").removeAttr('required');  //turns required off

if (edName.hasAttribute("required")) { }  //check if required
if (edName.required) { }                 //check if required using reflected attribute

Version longue

Une fois que T.J. Crowder a réussi à faire remarquer propriétés réfléchies j'ai appris que la syntaxe suivante est mauvais :

element.attributes["name"] = value; //bad! Overwrites the HtmlAttribute object
element.attributes.name = value;    //bad! Overwrites the HtmlAttribute object
value = element.attributes.name;    //bad! Returns the HtmlAttribute object, not its value
value = element.attributes["name"]; //bad! Returns the HtmlAttribute object, not its value

Vous doit passer à travers element.getAttribute y element.setAttribute :

element.getAttribute("foo");         //correct
element.setAttribute("foo", "test"); //correct

Cela est dû au fait que l'attribut contient en fait un caractère spécial HtmlAttribut objet :

element.attributes["foo"];           //returns HtmlAttribute object, not the value of the attribute
element.attributes.foo;              //returns HtmlAttribute object, not the value of the attribute

En attribuant la valeur "true" à un attribut, vous lui attribuez par erreur une valeur de Chaîne de caractères plutôt que l'objet HtmlAttribut l'objet dont il a besoin :

element.attributes["foo"] = "true";  //error because "true" is not a HtmlAttribute object
element.setAttribute("foo", "true"); //error because "true" is not an HtmlAttribute object

Conceptuellement, l'idée correcte (exprimée dans un langage typé) est la suivante :

HtmlAttribute attribute = new HtmlAttribute();
attribute.value = "";
element.attributes["required"] = attribute;

Voilà pourquoi :

  • getAttribute(name)
  • setAttribute(name, value)

exister. Ils se chargent d'attribuer la valeur à l'objet HtmlAttribute qu'ils contiennent.

En plus de cela, certains attributs sont réfléchi . Cela signifie que vous pouvez y accéder plus facilement à partir de Javascript :

//Set the required attribute
//element.setAttribute("required", ""); 
element.required = true;

//Check the attribute
//if (element.getAttribute("required")) {...}
if (element.required) {...}

//Remove the required attribute
//element.removeAttribute("required");
element.required = false;

Ce que vous Ne le fais pas. veut faire est d'utiliser par erreur le .attributes collection :

element.attributes.required = true;     //WRONG!
if (element.attributes.required) {...}  //WRONG!
element.attributes.required = false;    //WRONG!

Cas de test

Cela a conduit à des essais autour de l'utilisation d'un required en comparant les valeurs renvoyées par l'attribut et la propriété réfléchie.

document.getElementById("name").required;
document.getElementById("name").getAttribute("required");

avec des résultats :

HTML                         .required        .getAttribute("required")
==========================   ===============  =========================
<input>                      false (Boolean)  null (Object)
<input required>             true  (Boolean)  "" (String)
<input required="">          true  (Boolean)  "" (String)
<input required="required">  true  (Boolean)  "required" (String)
<input required="true">      true  (Boolean)  "true" (String)
<input required="false">     true  (Boolean)  "false" (String)
<input required="0">         true  (Boolean)  "0" (String)

Essayer d'accéder au .attributes La collecte directe est une erreur. Il retourne l'objet qui représente l'attribut DOM :

edName.attributes["required"] => [object Attr]
edName.attributes.required    => [object Attr]

Cela explique pourquoi vous ne devriez jamais parler au .attributes collecter directement. Vous ne manipulez pas le valeurs des attributs, mais les objets qui représentent les attributs eux-mêmes.

Comment fixer les exigences ?

Quelle est la façon correcte de régler required sur un attribut ? Vous avez deux choix, soit la méthode réfléchie propriété ou en définissant correctement l'attribut :

element.setAttribute("required", "");         //Correct
edName.required = true;                       //Correct

À proprement parler, toute autre valeur "définira" l'attribut. Mais la définition de Boolean Les attributs dictent qu'il ne doit être défini que par la chaîne vide. "" d'indiquer vrai . Les méthodes suivantes fonctionnent toutes pour set el required Booléen attribut,

mais ne pas utiliser les :

element.setAttribute("required", "required"); //valid, but not preferred
element.setAttribute("required", "foo");      //works, but silly
element.setAttribute("required", "true");     //Works, but don't do it, because:
element.setAttribute("required", "false");    //also sets required boolean to true
element.setAttribute("required", false);      //also sets required boolean to true
element.setAttribute("required", 0);          //also sets required boolean to true

Nous avons déjà appris qu'essayer de définir l'attribut directement est une erreur :

edName.attributes["required"] = true;       //wrong
edName.attributes["required"] = "";         //wrong
edName.attributes["required"] = "required"; //wrong
edName.attributes.required = true;          //wrong
edName.attributes.required = "";            //wrong
edName.attributes.required = "required";    //wrong

Comment clair nécessaire ?

L'astuce pour essayer de supprimer el required l'attribut est qu'il est facile de l'allumer accidentellement :

edName.removeAttribute("required");     //Correct
edName.required = false;                //Correct

Avec les moyens non valables :

edName.setAttribute("required", null);    //WRONG! Actually turns required on!
edName.setAttribute("required", "");      //WRONG! Actually turns required on!
edName.setAttribute("required", "false"); //WRONG! Actually turns required on!
edName.setAttribute("required", false);   //WRONG! Actually turns required on!
edName.setAttribute("required", 0);       //WRONG! Actually turns required on!

Lors de l'utilisation de la réflexion .required vous pouvez également utiliser n'importe quelle propriété "faux" pour le désactiver, et des valeurs véridiques pour l'activer. Mais il suffit de s'en tenir à vrai et faux pour plus de clarté.

Comment vérifier pour required ?

Vérifier la présence de l'attribut par l'intermédiaire de la fonction .hasAttribute("required") méthode :

if (edName.hasAttribute("required"))
{
}

Vous pouvez également le vérifier par le biais du Booléen réfléchi .required propriété :

if (edName.required)
{
}

14voto

dystroy Points 145126

Ce qui compte, ce n'est pas l'attribut mais le propriété et sa valeur est un booléen.

Vous pouvez le définir en utilisant

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

10voto

vladCovaliov Points 701

Et la version jquery :

$('input').attr('required', true)
$('input').attr('required', false)

Je sais que c'est au-delà de la question, mais peut-être que quelqu'un trouvera cela utile :)

3voto

Kyle Pennell Points 194
let formelems = document.querySelectorAll('input,textarea,select');
formelems.forEach((formelem) => {
  formelem.required = true;

});

Si vous souhaitez que tous les éléments de saisie, de zone de texte et de sélection soient obligatoires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X