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 :

Fonctions anonymes et passage de variables


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 13
    Par défaut Fonctions anonymes et passage de variables
    Salut, j'ai un problème assez embetant avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function EditInPlace() {
    	var v=getElementsBySelector("span.editinplace");
    	var l=v.length;
    	for(i=0;i<l;i++)
    	{
    	    var id_span = v[i].id;
    	    addEvent(v[i],'click',function() { ShowEditInPlace(id_span); });
    	}
    }
    Qui va attacher un évènement clic sur tous les <span class=editinplace> avec le même id à chaque fois, le dernier de mon tableau.

    Si j'ai par exemple:
    <span id=s1 class=editinplace>Test</span>
    <span id=s2 class=editinplace>Test</span>
    <span id=s3 class=editinplace>Test</span>

    Chaque clic sur n'importe lequel de ces 3 spans appelera ShowEditInPlace(s3).
    Le comportement correct serait d'appeler ShowEditInPlace avec en paramètre le bon id pour chaque span.

    Si je fais en dur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    addEvent(v[0],'click',function() { ShowEditInPlace(v[0].id); });
    addEvent(v[1],'click',function() { ShowEditInPlace(v[1].id); });
    addEvent(v[2],'click',function() { ShowEditInPlace(v[2].id); });
    Après le for, en enlevant la ligne addEvent du for, ShowEditInPlace aura à chaque fois le bon paramètre si je clic sur un des spans = c'est le comportement que je voudrais avoir.

    Une idée de pourquoi celà ne marche pas lorsque je le fais dans le for?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    oui sujet déja discuté et résolu et doit d'ailleurs figurer dans la FAQ ..
    je recherche ...

    [edit]
    trouvé
    http://javascript.developpez.com/faq...lick.dynamique
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 13
    Par défaut
    Merci SpaceFrog

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 162
    Par défaut
    Une autre solution :
    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
     
    function EditInPlace() {
    	var v=getElementsBySelector("span.editinplace");
    	var l=v.length;
    	for(i=0;i<l;i++)
    	{
    	    var buildFunction = function()
    	    {
    	        return function()
                    {
                        var id_span = v[i].id;
                        ShowEditInPlace(id_span);
                    }
                }
    	    addEvent(v[i],'click',buildFunction());
    	}
    }
    Je ne sais pas s'il y a une "meilleure" solution, mais le fait d'attacher une propriété à un élément html me "gène", mais c'est du chipotage...

    A+

  5. #5
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    On peut faire beaucoup plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function EditInPlace() {
    	var v=getElementsBySelector("span.editinplace");
    	var l=v.length;
    	for(i=0;i<l;i++)
    	{
    	    addEvent(v[i],'click',ShowEditInPlace);
    	}
    }
    vous allez me dire que la fonction ShowEditInPlace ne sait pas sur quel objet travailler
    c'est très simple this

    je suppose que ta fonction ShowEditInPlace prend l'id en argument et fait un getElementById pour retrouver le span

    alors que this est l'élément en question pas besoin de le chercher
    pour t'en convaincre fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function ShowEditInPlace() {
      alert(this.id);
    }
     
    function EditInPlace() {
    	var v=getElementsBySelector("span.editinplace");
    	var l=v.length;
    	for(i=0;i<l;i++)
    	{
    	    addEvent(v[i],'click',ShowEditInPlace);
    	}
    }
    généralement quand je fais ça je fais en sorte que le nom de la fonction me renseigne sur le fait que c'est un gestionnaire d'évènement.

    si tu tient à ce que ta fonction ShowEditInPlace reste une fonction normale
    tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function EditInPlace() {
    	var v=getElementsBySelector("span.editinplace");
    	var l=v.length;
    	for(i=0;i<l;i++)
    	{
    	    addEvent(v[i],'click',function() {ShowEditInPlace(this.id)});
    	}
    }
    A+JYT

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par BaBeuH Voir le message
    le fait d'attacher une propriété à un élément html me "gène", mais c'est du chipotage...
    Tu n'attaches pas une propriété à un élément HTML mais à un objet JavaScript de type HTMLElement, or l'intérêt d'un objet est bien de lui affecter des propriétés et des méthodes. Je ne vois donc pas ce qu'il y a de gênant
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    c'est un truc que je ne comprends pas moi aussi
    on vois partout des dev où on crée des variables des objet des fonction globales qui ensuite font des recherches dans le DOM pour manipuler les objets de la page

    alors que le DOM à été conçu pour ça pour porter les méthodes et les attributs des éléments.

    c'est tout de même beaucoup plus facile d'attacher les attribut et les méthodes à l'objet qui en est le porteur plutôt que de les mettre ailleurs pour ensuite essayer tant bien que mal de retrouver ses petits.

    J'avoue ne pas comprendre cette réticence
    franchement je ne comprends vraiment pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <div>
    <a href='#' onclick="this.parentNode.style.display='none'; return flase;">close</a>
    ....
    </div>
    et tout de même vachement plus simple est compréhensible que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <script type="application/javascript">
    function closeDiv(id) {
      var element = document.getElementById(id);
      if (element) {
        element.parentNode.style.display='none';
      }
      return false;
    }
    </script>
    ...
    <div id="myDiv">
    <a href='#' onclick="return closeDiv('myDiv');">close</a>
    ....
    </div>
    franchement lorsqu'on place des éléments dans des attributs et des méthodes portés par les bons éléments du DOM
    les scripts fondent comme neige au soleil et ça devient d'une efficacité redoutable

    A+JYT

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JS] Fonction anonyme et retour de variable ?
    Par lounislounis dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/07/2010, 00h23
  2. Problème de passage de variable à une fonction
    Par PunkMetal dans le forum Langage
    Réponses: 2
    Dernier message: 26/04/2007, 23h56
  3. passage de variable dans fonction
    Par nicerico dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/12/2006, 23h25
  4. Passage de variables dans une fonction
    Par renaud26 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/07/2006, 17h49
  5. [Debutant]Passage de variable a une fonction
    Par picomz dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/06/2006, 19h56

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