Problème pour associer une fonction à un onclick

takinelinfo Messages postés 13 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 1 juillet 2008 - 1 juil. 2008 à 21:26
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 - 2 juil. 2008 à 11:09
Bonsoir,
Je vais essayer de vous donner un autre exemple que le post précédent.
Voici une fonction toute bête:
<html>
    <head>
        <script type="text/javascript">
           function init_lien()
           {
               var tab_lien = document.getElementsByTagName('a');
               for(var i=0; i<tab_lien.length; i++)
                  tab_lien[i].onclick=function(){ alert(i); };
          }
        </script>
    </head>
 
    
        [# Lien 1]
        [# Lien 2]
        [# Lien 3]
    
</html>


Mon problème précédent se résume à celui ci. Comment passer un paramètre à une fonction que l'on veut associer à un onclick. Dans le cas ci dessus (pas besoin de serveur web pour le tester), comment faire pour que l'on ai:
clic lien 1 -> affiche "1"
clic lien 2 -> affiche "2"
clic lien 3 -> affiche "3"


Actuellement j'ai
clic lien 1 -> affiche "3"
clic lien 2 -> affiche "3"
clic lien 3 -> affiche "3"




Bien entendu cette fonction n'est la que pour illustrer, et elle ne sers à rien.

6 réponses

nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
2 juil. 2008 à 08:19
Salut,

Pour associer une fonction a un click sur un element tu as plusieurs solutions que voici :

element.onclick = function() {
   ...
}

element.attachEvent('onclick',function() { ... }); // exclusif IE

element.addEventListener('click',function() { ... },false);

a++

Si la réponse vous convient, pensez : Réponse acceptée !
0
Zobibol Messages postés 469 Date d'inscription mercredi 9 janvier 2002 Statut Membre Dernière intervention 20 février 2017 6
2 juil. 2008 à 09:55
Bonjour,
le principe est de stocker la valeur sur le tag ( enfin, le principe que j'ai trouvé et que j'utilise bien souvent)
du coup pour l'exemple, on obtiendrait un truc :

<html>
    <head>
        <script type="text/javascript">
           function init_lien()
           {
               var tab_lien = document.getElementsByTagName('a');
               for(var i=0; i<tab_lien.length; i++){
                       // stockage de la valeur sur le lien
                       // ajoute 1 à i car, le i commençant à 0 l'affichage comme demandé dans l'exemple commencerait par 0.
                       tab_lien[i].storeValue = i + 1 ;
                  tab_lien[i].onclick=function(){ alert(this.storeValue); };
                }
          }
        </script>
    </head>
 
   
        [# Lien 1]
        [# Lien 2]
        [# Lien 3]
   
</html>

cela conviendrait-il ?
0
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008
2 juil. 2008 à 10:19
Salut,

La solution n'est pas si facile que ça à comprendre...

function init_lien()
{
      var tab_lien = document.getElementsByTagName('a');
      for(var i=0; i<tab_lien.length; i++)
            tab_lien[i].onclick=function(index){ return function() { alert(index+1);}; }(i);
}

Si tu veut comprendre comment ça marche il faut que tu te documentes sur les closures.
La solution proposé par Zobilol est fonctionnelle mais elle n'est pas satisfaisante car elle ajoute un attribut à l'élément sur lequel tu ajoutes un event listener.
Il serait également plus "conforme" d'utiliser la méthode DOM-2 d'ajout d'event plutôt que la méthode DOM-0.

DOM-2 : element.addEventListener('click', toto, false) || element.attachEvent('onclick', toto)
DOM-0 : element.onclick = toto;
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
2 juil. 2008 à 10:34
Salut ralecul,

C'est étonant que tu n'est pas citer prototype et sa methode :

Event.observe();

a++

Si la réponse vous convient, pensez : Réponse acceptée !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008
2 juil. 2008 à 10:55
[auteur/NICOMILVILLE/1109562.aspx
]Nicomilville : C'est juste que j'en ai marre de me répéter ;-)
@+
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
2 juil. 2008 à 11:09
lol, oui, je te comprend !

a++

PS : petit conseille si tu veus pas le répèter, met le en signature, lol !

Si la réponse vous convient, pensez : Réponse acceptée !
0
Rejoignez-nous