[RESOLU] chaine caractère en parametre de fonction / Javascript

chaine caractère en parametre de fonction / Javascript [RESOLU] - HTML/CSS - Programmation

Marsh Posté le 12-05-2007 à 02:40:41    

Bonjour, ou plutôt bonsoir :)
 
Alors mon petit problème qui me prend la tête depuis quelques temps est le suivant :
Je souhaite créer une petite fonction JavaScript qui permette de vérifier un formulaire. Jusque là rien de très sorcier...
Mais le petit plus, c'est que je voudrais pouvoir réutiliser cette fonction pour n'importe quel formulaire (donc de nom différent) et, par exemple, juste pour le deuxième, s'il y'en a deux sur une page...
 
Je veux donc faire passer le nom du formulaire à checker en paramètres, mais le problème est que ça foire à chaque fois avec le message d'erreur suivant :

Code :
  1. Erreur : document.getElementsByName(nom).style has no properties


 
Pour exemple, la fonction "rouge" marche car je fournis le numéro du formulaire (calculé dans une autre fonction), ainsi que le numéro de l'élément dans ce formulaire.
Mais la fonction "white" ne marche pas et renvoie le message d'erreur ci-dessus, et ce pour n'importe quel passage de chaîne de caractères en paramètre de fonction...
Je suppose que le problème vient du fait que nom n'est pas entre guillemets dans le getElements, alors si quelqu'un a une idée pour résoudre ce problème de cette manière, je suis preneur... :)
 

Code :
  1. function rouge(num_form,i)
  2. {
  3. document.forms[num_form].elements[i].style.background = "#AD0000";
  4. }
  5. function white(nom)
  6. {
  7. document.getElementsByName(nom).style.background = "white";
  8. }
  9. document.write(rouge(0,2));
  10. document.write('prenom');


 
EDIT : de même si pour la fonction "rouge", je change par :

Code :
  1. function rouge(formulaire, elementformulaire)
  2. {
  3.          document.formulaire.elementformulaire.style.background = "#AD0000";
  4. }


j'obtiens la même erreur...


Message édité par Mister_Pingouin76 le 12-05-2007 à 14:46:29

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

Marsh Posté le 12-05-2007 à 02:40:41   

Reply

Marsh Posté le 12-05-2007 à 02:58:01    

un formulaire on y accede par un ID
<form id="tamere">

 

document.getElementById("tamere" )
un element  de formulaire c'est pareil.

 

getElementsByName ca n'existe pas ou plus du tout.

 


et même si tu voulais que ta fontion rouge marche, il faudrait faire :

 
Code :
  1. function rouge(formulaire, elementformulaire)
  2.     {
  3.             document[formulaire][elementformulaire].style.background = "#AD0000";
  4.     }


Message édité par gatsu35 le 12-05-2007 à 02:58:47
Reply

Marsh Posté le 12-05-2007 à 03:08:49    

-La méthode getElementsByName c'est à chier et non portable.
-Sache que l'attribut name est deprecated, il est recommandé d'utiliser un id. Par exempe, name à disparu dans XHTML, donc du coup tu peux foutre ton js à la poubelle.
-Pour cibler un Id, getElementById s'impose, ce qui te permet de passer une string en paramètre de ta fonction.
-Utiliser le "tableau" forms c'est également à chier, si tu dois rajouter une form au milieu de ta page, tout le tableau est décalé.
-Pense "factorisation", à savoir une fonction indépendante de l'environnement et des propriétés de ta page.
-Même pour tester évite ce genre de nom de fonction.


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 12-05-2007 à 11:43:53    

oki :)
merci je vais suivre vos conseils et tout revoir ce joyeux bordel :)


---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

Marsh Posté le 12-05-2007 à 13:55:59    

Et si je veux faire une "vérification listée" de tous les éléments que contient mon formulaire ?
 
Du genre :  

Code :
  1. function check(formulaire) {
  2.     for(var i =0; i < document[formulaire].length; i++)
  3.     {
  4.   if (document[formulaire].getElementById(i).value=="" )
  5.   {
  6.         alert("Le champ "+document[formulaire].elements[i].name+" est vide" );
  7.  rouge(formulaire,elements[i].name);
  8.  document[formulaire].elements[i].focus();
  9.  return false;
  10.   }
  11.           else return true;
  12.      }
  13. }


 
PS : j'ai codé n'importe comment et plusieurs choses doivent être fausses, mais je n'ai aucune idée de comment y arriver avec getElementById :/
Si une bonne âme charitable pouvait m'aider :p
Merci d'avance :)


Message édité par Mister_Pingouin76 le 12-05-2007 à 13:56:40

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

Marsh Posté le 12-05-2007 à 14:10:03    

Passer par un getElementsByTagName depuis ton formulaire.
 
Par exemple si tu as

Code :
  1. <form id="monform">
  2. <input type="text" name="nom" id="form_name"/>
  3. <input type="text" name="prenom" id="form_surname"/>
  4. <input type="text" name="chocolat" id="form_hpricot"/>
  5. </form>


Tu peux faire un truc du style

Code :
  1. function check(formId) {
  2.    var error = false;
  3.    var errors = [];
  4.    // récupération de l'élément de formulaire
  5.    var form = document.getElementById(formId);
  6.    // récupération de tous les "input" dans le formulaire
  7.    var inputs = form.getElementsByTagName('input');
  8.    // on itère sur les inputs
  9.    for(var i=0; i<inputs.length; ++i) {
  10.        var currentInput = inputs[i];
  11.        if(currentInput.value == "" ) {
  12.            setError(currentInput)
  13.            errors.push("Le champ " + currentInput.name + " est vide" );
  14.            // on ne focus() que le premier contrôle générant une erreur
  15.            if(!error) {
  16.                currentInput.focus();
  17.            }
  18.            error = true;
  19.        } else {
  20.            clearError(currentInput)
  21.        }
  22.    }
  23.    if(error) {
  24.        alert(errors.join("\n" ));
  25.    }
  26.    return !error;
  27. }
  28. function setError(control) {
  29.    control.style.borderColor = "red";
  30. }
  31. function clearError(control) {
  32.    control.style.borderColor = "";
  33. }


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-05-2007 à 14:46:16    

Merci beaucoup, je comprends beaucoup mieux maintenant :)
J'ai pu modifier mon code avec les getElementsByTagName et ca marche nickel :)
Encore merci


---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed