J'essaie de marquer la text
zone de saisie comme obligatoire en Javascript.
<input id="edName" type="text" id="name">
Si le champ était initialement coché required
:
<form> <input id="edName" type="text" id="name" required><br> <input type="submit" value="Search"> </form>
Lorsque les utilisateurs tentent de soumettre, ils reçoivent une erreur de validation :
Mais maintenant, je veux définir la propriété required
au "runtime" via Javascript :
<form> <input id="edName" type="text" id="name"><br> <input type="submit" value="Search"> </form>
Utilisez le script correspondant :
//recommended W3C HTML5 syntax for boolean attributes document.getElementById("edName").attributes["required"] = "";
Aucun contrôle de validation, aucun blocage sauf si je soumets maintenant.
Quelle est la manière correcte de configurer les attributs booléens de validation HTML5 ?
jsFiddle
Validation HTML5 required
属性记录为 Boolean
Attributs documentés comme Booléen
:
4.10.7.3.4
La propriétérequired
Propriétés
required
est une propriété booléenne. Lorsqu'il est spécifié, cet élément est obligatoire.
Il y a beaucoup de choses ennuyeuses sur la façon de définir les boolean
propriétés. Commentaires sur la spécification HTML5 :
La présence d'un attribut booléen sur l'élémentreprésente une vraie valeur, et l'absence de cet attribut représente une fausse valeur.
Si l'attribut est présent, sa valeur doit être une chaîne vide ou une valeur ASCII insensible à la casse qui correspond au nom canonique de l'attribut et ne comporte aucun espace de début ou de fin.
Cela signifie que vous pouvez spécifier les propriétés required
booléennes de deux manières différentes :
edName.attributes.required = ""; //the empty string edName.attributes.required = "required"; //the attribute's canonical name
Quand vous regardez mon jsFiddle pour cette question, vous remarquerez que si l'attribut required
est défini dans le balisage :
<input id="edName" type="text" id="name" required>
Alors la valeur de l'attribut n'est pas une chaîne vide, ni le nom canonique de l'attribut :
edName.attributes.required = [object Attr]
Cela pourrait conduire à une solution.
required
是一个反射属性 (例如id
、name
、type
etc.), donc :...où
element
是实际的input
éléments DOM, par exemple :(Juste pour être complet.)
Réponse :
C'est à cause de l'attribut
required
是一个属性对象,而不是字符串;属性
是NamedNodeMap 其值为Attr代码>对象
。要获取其中之一的值,您需要查看其value
dans ce code. Mais pour les propriétés booléennes, la valeur n'a pas d'importance ; la propriété est soit présente dans la carte (vrai), soit non (faux).Donc, si
required
n'est pas reflété, vous pouvez le définir en ajoutant une propriété :...équivalent à
element.required = true
. Vous pouvez l'effacer en le supprimant complètement :...équivalent à
element.required = false
.Mais nous n’avons pas besoin de faire ça pour
required
car cela se reflète déjà.Version courte
Version longue
Une fois que T.J. Crowder a réussi à signaler la propriété réfléchie, j'ai appris la syntaxe erreur suivante :
Vous devez réussir
element.getAttribute
和element.setAttribute
:En effet, l'attribut contient en fait un objet HtmlAttribute spécial :
En définissant la valeur de l'attribut sur "true", vous la définissez par erreur sur un objet String au lieu de l'objet HtmlAttribute dont il a besoin :
Conceptuellement, l'idée correcte (exprimée en langage typographique) est :
Voici pourquoi :
getAttribute(名称)
setAttribute(名称, 值)
Existence. Ils sont responsables de l'attribution de valeurs aux objets internes HtmlAttribute.
De plus, cela reflète également certains attributs. Cela signifie que vous y avez un meilleur accès via Javascript :
Ce que vous ne voulez pas faire, c'est utiliser la
.attributes
collection de manière incorrecte :Cas de test
Cela conduit à des tests autour de l'utilisation de l'attribut
required
, en comparant la valeur renvoyée via cet attribut à l'attribut réfléchiRésultat :
Tenter d'accéder directement à la collection
.attributes
est une erreur. Il renvoie un objet représentant une propriété DOM :Cela explique pourquoi il ne faut jamais parler directement à une
.attributes
collection. Vous ne manipulez pas la valeur de la propriété, mais l'objet qui représente la propriété elle-même.Comment définir les champs obligatoires ?
Quelle est la bonne façon de placer
required
sur une propriété ? Vous avez deux options, soit en reflétant les propriétés, soit en définissant correctement les propriétés :À proprement parler, toute autre valeur « définit » la propriété. Cependant, la définition de l'attribut
Boolean
indique qu'il ne peut être défini que sur la chaîne vide""
pour indiquerBoolean
属性的定义规定,只能将其设置为空字符串""
来指示 true。以下方法都可以设置required
true. Les méthodes suivantes peuvent définirBooleanattributs,
Mais
ne les utilisez pas:
Nous avons appris qu'essayer de définir directement les propriétés est une erreur :Comment effacer les champs obligatoires ?
L'astuce lorsque l'on essaie derequired
supprimer
une propriété est qu'il est facile de l'ouvrir accidentellement :
Méthode invalide :.required
必需
vérifier
?.hasAttribute("required")
s'il y aVérifiez si le bien existe via la méthode :
Vous pouvez également vérifier via 🎜Boolean🎜 les propriétés 🎜 réfléchies : 🎜.required