Puis-je marquer un champ invalide à partir de JavaScript?

94

En lisant cet article, j'ai trouvé qu'il existe des pseudo-classes pour les valeurs d'entrée «valides» et «invalides» introduites dans HTML5.

Existe-t-il un moyen de marquer un champ de saisie comme invalide / valide à partir de JavaScript? Ou bien, puis-je remplacer la méthode de validation utilisée?

Svish
la source
Vous pouvez toujours doubler avec une classe "invalide", mais ce serait vraiment intéressant d'apprendre qu'il existe une meilleure façon.
Pointy
1
Ouais, bien sûr, mais ce serait ennuyeux;)
Svish
1
Svish, pouvez-vous réévaluer les réponses ci-dessous? Il semble que dajavax a fourni une réponse qui fait exactement ce que vous vouliez. Il peut être utile aux autres visiteurs si vous avez marqué la réponse de dajavax comme acceptée.
Kodos Johnson du
@KodosJohnson Certainement, merci pour la mise au point 🙂
Svish

Réponses:

160

Vous pouvez utiliser la fonction customValidity à cette fin.

Si vous ajoutez un message customValidity au champ, il devient invalide. Lorsque vous définissez le message comme une chaîne vide, il redevient valide (à moins qu'il ne soit invalide pour d'autres raisons).

field.setCustomValidity("Invalid field."); rendra le champ invalide.

field.setCustomValidity(""); rendra le champ valide sauf s'il échoue à une contrainte HTML5.

Dajavax
la source
1
Impressionnant. Merci. Ajouté à codepen.io/kevinSuttle/post/the-current-state-of-web-forms
Kevin Suttle
4
De plus, si vous voulez que le message de validité du navigateur apparaisse sur inputou blurvous pouvez utiliser field.reportValidity () juste après.
Sam Carlton
4

Edit : Quelqu'un a précisé que vous recherchez des attributs "valides" "non valides" pour DOM.

J'ajouterais des attributs à chaque balise en utilisant dom_object.setAttribute("isvalid", "true"). Vous pouvez également avoir une fonction de validation centrale qui met à jour ces attributs à chaque fois (et les utilise à dom_object.getAttribute("isvalid")chaque fois).

Vous pouvez exécuter cette fonction chaque fois qu'un élément perd le focus, ou quand vous le souhaitez.

Pas vraiment élégant, mais malheureusement, il n'y a pas de support "pseudo" avec javascript et HTML5 maintenant.


Si je comprends votre question, vous pouvez faire la validation avec Javascript. Cependant, sachez qu'il est très facile de contourner la validation côté client, en particulier la validation javascript . Vous ne devez jamais faire confiance aux données client et toujours effectuer des vérifications côté serveur.

Par exemple, je pourrais facilement trouver les ID d'élément en inspectant le code source, puis document.getElementById('some_id').setAttribute('max', new_number)modifier la valeur maximale (c'était l'une des entrées de votre lien).

Il y a plusieurs façons de le faire, je vais donc essayer de vous donner l'idiome général.

Vous pouvez saisir la valeur en faisant document.getElementById('form_element_id').value(assurez-vous de donner le formulaire a namequi est envoyé au serveur, et un idqui est utilisé par javascript). Pour les zones de texte, vous pouvez utiliser .innerHTML.

Ensuite, vous avez la valeur dans une variable, il existe différentes manières de la vérifier.

Par exemple, vous pourriez faire if (parseInt(my_value) < 0) //error. Vous pouvez également utiliser des expressions régulières, je ne vais pas tout expliquer mais vous pouvez commencer ici http://www.w3schools.com/jsref/jsref_obj_regexp.asp . Je sais que w3schools n'est pas la meilleure source mais je trouve que c'est un bon point de départ.

Passons maintenant à la partie validation: ajoutez onsubmit="return validateForm()à votre balise form où validateForm () est la fonction qui fait toute la vérification. Et la fonction retourne simplement truesi elle est valide et falseautrement. Cela remplace la fonction de validation par défaut (qui par défaut ne fait rien).

Donc, dans l'exemple ci-dessus, //errorserait remplacé par return false. Vous pouvez faire d'autres choses aussi; comme alerter l'erreur puis retourner faux. Vous pouvez également utiliser javascript pour mettre en évidence les champs non valides (je ne sais pas si c'est ce que vous entendez par " marquer un champ de saisie comme invalide / valide à partir de javascript ")

Bien sûr, si vous ne voulez pas vérifier tous les champs, vous ne devez renvoyer true que si certains passent. Encore une fois, vous ne devriez pas vous fier à cela, mais si vous voulez seulement dissuader les gens ordinaires, c'est une solution facile.

Raekye
la source
9
Vous avez tout à fait raison, mais je ne pense pas que vous ayez complètement compris la question. En HTML5, il existe différentes manières d'ajouter des valeurs d'attribut au balisage HTML qui impliquent des règles de validation intégrées. Lorsqu'un navigateur applique ces règles, un champ de saisie correspondra aux pseudo-classes «: valid» ou «: invalid» dans CSS. Ainsi, vous pouvez écrire du HTML avec ces attributs, et du CSS avec des sélecteurs ": valid" et ": invalid" avec des règles, et donner un retour visuel sans aucun JavaScript. La question est de savoir si le statut ": valid" est disponible en tant qu'attribut DOM, en gros.
Pointy
-17

Existe-t-il un moyen de marquer un champ de saisie comme invalide / valide à partir de javascript?

Malheureusement, vous ne pouvez pas styliser les pseudo-classes en JavaScript, car ce ne sont pas de vrais éléments, ils n'existent pas dans le DOM réel.

Avec JavaScript vanilla, vous utiliseriez l' API de validation .

Dans jQuery, vous pouvez simplement le faire, http://jsfiddle.net/elclanrs/Kak6S/

if ( $input.is(':invalid') ) { ... }

Ou bien, puis-je remplacer la méthode de validation utilisée?

Si vous utilisez la validation HTML5, respectez le balisage. Sinon, vous pouvez désactiver la validation HTML5 avec $form.attr('novalidate', 'novalidate')et utiliser JS pour valider vos champs, puis ajouter des classes validou invalidsi nécessaire. J'ai créé un plugin qui fonctionne comme ça pour prendre en charge les navigateurs non HTML5.

elclans
la source
Que voulez-vous dire que vous ne pouvez pas les coiffer? Je le fais déjà. input:invalid + label::after{content: " INVALID";color: red;}Ajoute un morceau rouge de texte INVALID après l'étiquette que j'ai à côté du champ de saisie si le champ n'est pas valide (par exemple si un champ de courriel contient un courriel invalide)
Svish
11
"Existe-t-il un moyen de marquer un champ de saisie comme invalide / valide à partir de JavaScript?" "Malheureusement, vous ne pouvez pas styliser les pseudo-classes à partir de JavaScript" Ce n'est pas ce que la question a posé.
mikemaccana
Vous devriez pouvoir utiliser le CSSOM pour définir dynamiquement une nouvelle classe avec une pseudo-classe ...
Brett Zamir