J'essaie de marquer une zone de text
saisie comme requis dans 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 de soumettre une erreur de validation:
Mais maintenant je veux définir l' required
attribut à "runtime" , via 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 lorsque je soumets maintenant, il n'y a pas de contrôle de validation, pas de blocage.
Quelle est la bonne façon de définir un attribut booléen de validation HTML5 ?
Quelle est la valeur de l'attribut, demandez-vous?
L' required
attribut de validation HTML5 est documenté comme Boolean
:
4.10.7.3.4 L'
required
attributL'
required
attribut est un attribut booléen . Lorsqu'il est spécifié, l'élément est obligatoire.
Il y a beaucoup de discussions sur la manière de définir un 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 la chaîne vide ou une valeur qui correspond à une correspondance ASCII insensible à la casse pour le nom canonique de l'attribut, sans espace de début ou de fin.
Cela signifie que vous pouvez spécifier un attribut required
booléen de deux manières différentes:
edName.attributes.required = ""; //the empty string
edName.attributes.required = "required"; //the attribute's canonical name
Mais quelle est vraiment la valeur de l'attribut ?
Lorsque vous regardez mon jsFiddle de ce problème , vous remarquerez que si l' required
attribut est défini dans le balisage:
<input id="edName" type="text" id="name" required>
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]
Cela pourrait conduire à une solution.
la source
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 ...Réponses:
required
est une propriété réfléchie (commeid
,name
,type
, et autres), de sorte que :... où
element
est l'input
élément DOM réel , par exemple:(Juste pour être complet.)
Ré:
C'est parce
required
que dans ce code se trouve un objet attribut , pas une chaîne;attributes
est unNamedNodeMap
dont les valeurs sont desAttr
objets . Pour obtenir la valeur de l'un d'entre eux, vous regarderiez savalue
propriété. Mais pour un attribut booléen, la valeur n'est pas pertinente; l'attribut est soit présent dans la carte (vrai), soit absent (faux).Donc, si ce
required
n'était pas reflété, vous le définiriez en ajoutant l'attribut:... qui est l'équivalent de
element.required = true
. Vous l'effaceriez en le supprimant entièrement:... qui est l'équivalent de
element.required = false
.Mais nous n'avons pas à faire cela avec
required
, car cela se reflète.la source
Version courte
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 :
Vous devez passer par
element.getAttribute
etelement.setAttribute
:C'est parce que l'attribut contient en fait un objet HtmlAttribute spécial :
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:
Conceptuellement, l'idée correcte (exprimée dans un langage typé) est:
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:
Ce que vous ne voulez pas faire, c'est utiliser la
.attributes
collection par erreur :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éeavec des résultats:
Essayer d'accéder
.attributes
directement à la collection est une erreur. Il renvoie l'objet qui représente l'attribut DOM: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:À 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' attributrequired
booléen ,mais ne les utilisez pas:
Nous avons déjà appris qu'essayer de définir l'attribut directement est une erreur:
Comment effacer requis?
L'astuce lorsque vous essayez de supprimer l'
required
attribut est qu'il est facile de l'activer accidentellement:Avec les moyens invalides:
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:Vous pouvez également le vérifier via la propriété Boolean Reflected
.required
:la source
element
etedName
?edName
(c.-à-d. La zone de saisie du nom) en génériqueelement
.Ce qui compte n'est pas l'attribut mais la propriété , et sa valeur est un booléen.
Vous pouvez le définir en utilisant
la source
Et la version jquery:
Je sais que c'est au-delà de la question, mais peut-être que quelqu'un trouvera cela utile :)
la source
prop()
place deattr()
:)Si vous souhaitez créer toutes les entrées, zones de texte et sélectionner les éléments requis.
la source
essayez ceci ...
la source