Suite à la présentation de la fonction de vérification de formulaire : controle des champs de formulaire - partie 1, voici une explication plus en détail du code utilisé.
Deux variables test_text et test_class sont présentes en début de code. Une seule des deux doit être renseignée selon que l'on met en évidence les champs par une classe css ou par un mot dans le label.
S'il s'agit d'une classe, on attribue son nom à la variable test_class.
S'il s'agit d'une chaîne de caractère, on affecte celle-ci à la variable test_text.
La variable message permet de définir le texte affiché dans la fenêtre d'alerte qui se lancera si le formulaire n'est pas entièrement rempli.
test_text = "";
test_class = "";
message = "merci de remplir tous les champs obligatoires";
Grâce à la fonction getElementsByTagName() on construit une boucle qui va passer en revue tous les labels de la fonction.
Pour chacun, on récupère le texte présent entre les balises ainsi que la classe appliquée.
On teste quelle variable à été renseignée (test_class ou test_text), s'il s'agit de la classe, on la compare avec celle du label, s'il s'agit d'une chaîne de caractères on la compare avec le texte du label.
for ( var i=0; i<formulaire.getElementsByTagName("label").length; i++ ) {
element_label = formulaire.getElementsByTagName("label")[i];
txt_label = element_label.firstChild.nodeValue;
class_label = element_label.className;
if ( (test_text != "" && txt_label.indexOf(test_text) != -1) || (test_class != "" && class_label == test_class) ) {
Lorsqu'un label indique que le champ doit être renseigné, on va ensuite rechercher le champ qui lui correspond pour vérifier son contenu.
Chaque label est lié à un champ grâce à l'attribut for de la balise label dont la valeur est égale à l'id du champ correspondant (for de label = id de input par exemple).
On récupère donc la valeur de for avec getAttribute(). Cependant, il faudra faire attention car pour internet explorer, for s'obtient avec getAttribute("htmlFor") alors que sous les autres navigateurs on utilise simplement getAttribute("for").
Avec la valeur récupérée, on peut facilement cibler le champ en utilisant document.geElementById().
On vérifie ensuite qu'il s'agit bien d'un input de type=text ou d'un textarea avec tagName qui nous renvoie le nom de la balise.
Enfin, on teste la valeur du champ, si le champ est vide alors on incrémente la variable nommée vide.
if ( element_label.getAttribute("htmlFor") || element_label.getAttribute("for") ) {
if ( document.all ) id_champs = element_label.getAttribute("htmlFor");
else id_champs = element_label.getAttribute("for");
champs = document.getElementById(id_champs);
if ( champs.tagName == "INPUT" && champs.getAttribute("type") == "text" ) {
if ( champs.value == "" ) vide ++;
}
else if ( champs.tagName == "TEXTAREA" && champs.value == "" ) vide ++;
}
Ici, le champ se trouve à l'intérieur des balises label.
Il suffit donc de tester avec getElementsByTagName() si le label contient un input text ou un textarea et de vérifier la valeur de celui-ci.
else {
if ( element_label.getElementsByTagName("input")[0] ) {
input_label = element_label.getElementsByTagName("input")[0];
if ( input_label.getAttribute("type") == "text" && input_label.value == "" ) vide ++;
}
else if ( element_label.getElementsByTagName("textarea")[0] && element_label.getElementsByTagName("textarea")[0].value == "" ) vide ++;
}
}
Pour les listes, on part du principe que si la liste est obligatoire, l'option pré-sélectionnée ne peut pas être celle valide, elle n'a pas d'attribut value.
Avec une boucle qui va analyser chaque option de l'élément select, on va pouvoir regarder si l'option sélectionnée a une valeur.
for (var j=0; j<formulaire.getElementsByTagName("select").length; j++ ) {
liste = formulaire.getElementsByTagName("select")[j];
for ( var k=0; k<liste.options.length; k++) {
if ( liste.options[k].selected == true && liste.options[k].value == "" ) vide ++;
}
}
Pour chaque élément analysé, si le champ devait être obligatoire et qu'il s'avérait être vide, on a incrémenté la variable nommée vide.
Si vide est différent de 0, alors on affiche une alerte et le formulaire n'est pas envoyé, sinon la fonction retourne la valeur true et le formulaire est envoyé normalement.
if ( vide != 0 ) {
alert(message);
return false;
}
else {
return true;
}
La fonction est à lancer lorsque le formulaire est envoyé, on utilisera donc l'événement onsubmit.
Il faut également cibler le formulaire concerné et le passer en paramêtre de la fonction.window.onload = function() {Sans oublier de faire un return sur la fonction pour que le formulaire ne soit pas envoyé lorsqu'il est incomplet
document.getElementsByTagName("form")[0].onsubmit =
function () { return verif_form(this); }
}
Quels que soient les champs remplis rien ne se passe quand je soumets le formulaire.
Testé avec Opera 8.5 sous Win XP
Sous IE ça marche...
Beau travail mais il faudrait gérer la problèmatique d'une chaine "vide" -barre espace- fonction trim()
Commentaires momentanément fermés. Merci de votre compréhension.