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 TJ Crowder a réussi à signaler les propriétés reflétées , j'ai appris que la syntaxe suivante est incorrecte :
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 devez passer par element.getAttribute
et element.setAttribute
:
element.getAttribute("foo"); //correct
element.setAttribute("foo", "test"); //correct
C'est parce que l'attribut contient en fait un objet HtmlAttribute spécial :
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 définissant une valeur d'attribut sur "true", vous la définissez par erreur sur un objet String , plutôt que sur l' objet HtmlAttribute 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:
HtmlAttribute attribute = new HtmlAttribute();
attribute.value = "";
element.attributes["required"] = attribute;
C'est pourquoi:
getAttribute(name)
setAttribute(name, value)
exister. Ils font le travail sur l'attribution de la valeur à l'objet HtmlAttribute à l'intérieur.
En plus de cela, certains attributs sont reflétés . 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 voulez pas faire, c'est utiliser la .attributes
collection par erreur :
element.attributes.required = true; //WRONG!
if (element.attributes.required) {...} //WRONG!
element.attributes.required = false; //WRONG!
Cas de test
Cela a conduit à des tests autour de l'utilisation d'un required
attribut, en comparant les valeurs renvoyées par l'attribut et la propriété reflétée
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 .attributes
directement à la collection est une erreur. Il renvoie 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 .attributes
directement à la collecte. Vous ne manipulez pas les valeurs des attributs, mais les objets qui représentent les attributs eux-mêmes.
Comment définir requis?
Quelle est la bonne façon de définir required
un attribut? Vous avez deux choix, soit la propriété reflétée , soit en définissant correctement l'attribut:
element.setAttribute("required", ""); //Correct
edName.required = true; //Correct
À proprement parler, toute autre valeur "définit" l'attribut. Mais la définition des Boolean
attributs dicte qu'il ne doit être défini que sur la chaîne vide ""
pour indiquer true . Les méthodes suivantes fonctionnent toutes pour définir l' attribut required
booléen ,
mais ne les utilisez pas:
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 effacer requis?
L'astuce lorsque vous essayez de supprimer l' required
attribut est qu'il est facile de l'activer accidentellement:
edName.removeAttribute("required"); //Correct
edName.required = false; //Correct
Avec les moyens invalides:
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!
Lorsque vous utilisez la .required
propriété reflétée , vous pouvez également utiliser des valeurs «falsey» pour la désactiver et des valeurs de vérité pour l'activer. Mais tenez-vous-en au vrai et au faux pour plus de clarté.
Comment vérifier pour required
?
Vérifiez la présence de l'attribut via la .hasAttribute("required")
méthode:
if (edName.hasAttribute("required"))
{
}
Vous pouvez également le vérifier via la propriété Boolean Reflected .required
:
if (edName.required)
{
}
required="false"
, ont-ils déjà écrit un modèle avant d'écrire la norme? Les attributs conditionnels sont généralement pénibles, il est beaucoup plus facile de simplement mettre ce booléen dans la valeur d'attribut ...