IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

comment ajouter un écouteur dynamiquement


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Points : 134
    Points
    134
    Par défaut comment ajouter un écouteur dynamiquement
    Bonjour ,

    J'ai besoin de permettre à des utilisateurs d'entrer des données :

    L'utilisateur sélectionne un cours dans une liste de choix un événement de type onchange est lié à cette liste
    la valeur sélectionnée est envoyée par une requête Ajax au serveur.
    Le serveur me retourne un ensemble de chapitre corepondant au cours que j'insère dans une nouvelle liste.
    Sur cette nouvelle liste , j'ai toujours un listener onchange c'étzit pour vous expliquer en gros ce que je veux faire.

    Quand je reçois mes requêtes, j'utilise une fonction writeDiv pour créer ma liste de choix.Et je lui associe un listener par la partie en gras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function writeDiv(tab)
           {
               var monTableau = new Array() ;
                               
                       var indice = monTableau.length-1 ;
                       monTableau[indice] = "nouveau dossier" ;
                       
               // Récuperer les positions
                  var selection = document.getElementById("select1") ;
               var formulaire = document.getElementById("monFormulaire");
               var monRepere = document.getElementById("repere") ;
               var bouton = document.getElementById("selectionnez") ;
                var nouveauSelect = document.createElement("select") ;
               
              
               nouveauSelect.size = "1" ;
                   for (var i=0;i<monTableau.length;i++)
           {
                   op = new Option(monTableau[i],"",false,false) ;
               nouveauSelect.options.add(op) ;         
               
           }
           formulaire.insertBefore(nouveauSelect,monRepere) ;
           alert ("je sors de la fonction writeDiv() ") ;
               
               nouveauSelect.addEventListener('change',recupererValue,false);                    
           }
    Lorsque la nouvelle liste est créée je fais appel à une fonction recupererValue
    qui ma me récupérer la valeur sélectionnée et lancer la fonction EnvoyerChoxUtilisateurs().
    Voici cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function recupererValue(select)
        {
            alert ("Début de la fonction recupererValue");
            alert (select) ;
    if (!confirm("Voulez vous continuer ?"))
        {
    var monSelect = select ;
    //var maValeur = monSelect.options.[monSelect.selectedIndex].value ;
    var maValeur = monSelect.value ;
    alert (maValeur) ; // A ce niveau j'obtiens undefinedEnvoyerChoixUtilisateurs(maValeur) ;
    }
    else {
        alert("Vous avez décidé d'arreter") ;
    }
    }
    J'ai plusieurs questions :

    Je dois relancer plusieurs fois la même fonction writeDiv comment faire pour qu'à chaque fois cette fonction me donne un identifiant unique pour le select qu'il crée.

    2) Pour passer d'un élément à un objet de type DOM il me suffit de faire getElementById par contre si j'ai un objet de type DOM comment passer à un élément je ne sais pas si c'est très clair.

    J'ai encore d'autres questions mais je serai déjà très content d'avancer sur ces deux problèmes.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    effectivement c'est pas toujours super clair ce que tu racontes

    commençons par le commencement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // marche partout sauf sur IE
    nouveauSelect.addEventListener('change',recupererValue,false);
     
    // spécial IE
    nouveauSelect.attachEvent('onchange',recupererValue);
    ta callback recupererValue là, tu ne lui passes jamais le select en entrée. ce qu'elle a en entrée c'est soit rien (pour IE), soit l'événement (pour les autres navigateurs). donc quand tu tentes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function recupererValue(select)
    {
    ...
      alert (select) ; // la c'est l'objet événement que tu affiches, pas le select
    ...
      var monSelect = select ; // tu manipules toujours l'événement
      var maValeur = monSelect.value ; // équivalent "var maValeur = undefined"
      // parce que l'event n'a pas de propriété value
      alert (maValeur) ; // A ce niveau j'obtiens undefined => CQFD
      EnvoyerChoixUtilisateurs(maValeur) ;
      ...
    }
    alors comment récupérer le select ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function toto(e){
      // le select a déclencher l'event ?
      var evt = window.event || e;
      var select = evt.target || evt.srcElement; // voilà ton select ;)
     
      // ce n'es pas le select qui déclenche l'événement ?
      var select = document.getElementById("idselect");
     
      // ou l'élément qui déclenche l'action a une référence sur le select ?
      var o = evt.target || evt.srcElement;
      var select = o.referenceSurSelect;
      // par exemple à la création du select tu avais aussi créé un bouton
      // et tu as fait monBouton.referenceSurSelect = monSelect
      // (c'est un pointeur quoi)
    Q : comment faire pour qu'à chaque fois cette fonction me donne un identifiant unique pour le select qu'il crée.

    R : met un compteur que tu incrémentes à chaque création
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var cpt = 0;
     
    function creationDiv()
    {
     ...
     newDic.id = "toto" + cpt;
     cpt++;
     ...
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Points : 134
    Points
    134
    Par défaut
    Merci d'abord pour avoir fait l'effort de me comprendre,tu m'as donné de super pistes.
    je vais les explorer et je me permettrai de te demander des précisions demain.


    Encore Merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Points : 134
    Points
    134
    Par défaut
    Bonjour ,
    J'ai encore besoin d'aide.

    Ma première question est la suivante :
    Quand je remplis ma liste pour la liste de choix j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     for (var i=0;i<monTableau.length;i++)
           {
                   op = new Option(monTableau[i],"",false,false) ;
                   nouveauSelect.options.add(op) ;      
           }
    Mais est ce que ce code me remplit aussi le value de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <option value=? > ...</option>
    parce que quand j'essaie de recupérer value jobtiens "null".
    Sinon comment affecter une value à mes options.

    Merci de votre aide

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Option(text, value)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Points : 134
    Points
    134
    Par défaut
    Merci beaucoup,
    Voilà donc pourquoi je n'arrivais pas à récupérer de value.
    Mais j'ai une deuxiéme question :

    Pour attacher un événement au select que je viens de créer j'utilise :

    // marche partout sauf sur IE
    nouveauSelect.addEventListener('change',recupererValue,false);

    // spécial IE
    nouveauSelect.attachEvent('onchange',recupererValue);
    Mais moi en plus je pensais transmettre le nom de mon nouveau select en argument de ma fonction recupererValue est ce possible ? dans ce cas comment faire.
    => Ce que j'ai compris des explications que tu m'as donné c'est que c'est pas possible mais que la fonction recupererValue prend par defaut un objet event en argument charge à moi de remonter jusqu'à la source qui a déclenché l'événement par un :
    var evt = window.event || e;
    var select = evt.target || evt.srcElement;
    Est ce que j'ai bien compris ou bien je suis à coté de la plaque ?

    Merci

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    tu as bien compris.
    maintenant tu peux aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouveauSelect.addEventListener('change',function(event){recupererValue(nouveauSelect);},false);

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Points : 134
    Points
    134
    Par défaut
    Merci de ta réponse et surtout de ta patience à chaque fois que je pose une question j'ai l'impression que je me faire en***, mais encore une fois merci de ta patience.Je vais refaire des tests et je me permettrai de te poser des questions sur ce que je n'ai pas compris.

    Merci

Discussions similaires

  1. [lablgtk2] comment ajouter des widget dynamiquement?
    Par amiroushka dans le forum Caml
    Réponses: 4
    Dernier message: 06/11/2009, 21h21
  2. Réponses: 3
    Dernier message: 23/04/2007, 13h14
  3. Réponses: 3
    Dernier message: 05/11/2006, 11h42
  4. [C#] Comment ajouter un item dynamiquement
    Par Tercan dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/11/2006, 23h17
  5. Réponses: 1
    Dernier message: 19/08/2006, 19h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo