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 :

Fonction avec paramètres dans addEventListener ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Par défaut Fonction avec paramètres dans addEventListener ?
    Bonjour,

    Voici mon problème : ce que je veux faire c'est de stocker les coordonnes à chaque clique de souris dans un tableau.
    Pour cela j'ai créée une classe point, le tableau contiendra un ensemble de point.

    Par ailleurs, mon principal soucis provient de la fonction du addEventListener j'aimerai mettre en paramétré le tableau mais je n'y arrive pas.

    voici le code javascript :

    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 position_clique_point(ev,tab) {
        var x = ev.clientX - canvas.offsetLeft;
        var y = ev.clientY - canvas.offsetTop;
        return new point2d(x,y);
    }
     
    window.onload = function () {
        "use strict";
        var tab=[];
        var canvas = document.getElementById('jeu');
        var ctx = canvas.getContext("2d");
        tab.push(canvas.addEventListener('click', position_clique_point, false));
     
    };


    Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Par défaut
    Oui mais non je ne vois pas comment stocker les points dans un tableau même par délégation.

  3. #3
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    ah ok, j'étais hors sujet.

    Code JavaScript : 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
    window.onload = function () {
      "use strict";
      var tab=[];
      var canvas = document.getElementById('jeu');
      var ctx = canvas.getContext("2d");
     
      canvas.addEventListener('click', position_clique_point, false);
     
      // ...
     
      function position_clique_point(ev) {
        tab.push({x: (ev.clientX - canvas.offsetLeft) ,y:(ev.clientY - canvas.offsetTop) });
     
        // ne pas négliger le fait que les objet JS ne sont pas directement copiable (il faut utiliser assign sinon)
        // donc autant le créer directement au moment du push dans le tableau
      }
    };

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    Code JavaScript : 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 position_clique_point(ev) {
      tab.push({x: (ev.clientX - canvas.offsetLeft) ,y:(ev.clientY - canvas.offsetTop) });
     
      // ne pas négliger le fait que les objet JS ne sont pas directement copiable (il faut utiliser assign sinon)
      // donc autant le créer directement au moment du push dans le tableau
    }
     
    window.onload = function () {
      "use strict";
      var tab=[];
      var canvas = document.getElementById('jeu');
      var ctx = canvas.getContext("2d");
     
      canvas.addEventListener('click', position_clique_point, false);
    };
    Je n'ai pas testé mais je me demande si cela ne va pas buguer car tu n'as pas passé le tableau tab en paramètre de la fonction position_clique_point(ev)...

    Autre solution que le passage en paramètre : mettre tab en globale...


    EDIT : Un autre problème c'est que "canvas" n'est pas défini dans la fonction position_clique_point(ev)...

    Mais là ce serait dommage de le passer en variable globale si on n'en a pas besoin ailleurs alors perso j'ai ajouté : var canvas = ev.target; dans la fonction...

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Je n'ai pas testé mais je me demande si cela ne va pas buguer car tu n'as pas passé le tableau tab en paramètre de la fonction position_clique_point(ev)
    ...
    EDIT : Un autre problème c'est que "canvas" n'est pas défini dans la fonction position_clique_point(ev)...
    Non ça ne buguera pas car lorsque position_clique_point est exécutée, comme tab ou canvas ne sont pas déclarées dans la fonction, Javascript cherchera si ces variables existent dans le bloc où est appelée la fonction (puis dans le bloc parent, puis dans le bloc parent du bloc parent..., jusqu'à ce qu'il mette la main dessus).

    Un peu de lecture sur le sujet.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    @psychadelic : +1 ! Oui j'ai vu entre temps que tu avais modifié ton code...

    Citation Envoyé par CosmoKnacki Voir le message
    Non ça ne buguera pas car lorsque position_clique_point est exécutée, comme tab ou canvas ne sont pas déclarées dans la fonction, Javascript cherchera si ces variables existent dans le bloc où est appelée la fonction (puis dans le bloc parent, puis dans le bloc parent du bloc parent..., jusqu'à ce qu'il mette la main dessus).

    Un peu de lecture sur le sujet.
    +1 ! Oui merci pour le lien et l'explication, cela me fera un rappel...

    Ceci dit en fait ce que je disais concerne le premier code de psychadelic (et c'est celui-là que j'ai cité dans mon message) et toi ton explication concerne la version corrigée de son code (enfin je suppose car sinon ça ne colle pas)... Le premier bogue pour les raisons que j'ai mentionnées mais pas la version corrigée...

    PS : Ceci dit si on veut avoir accès au tableau tab ailleurs dans le code il faudra faire quelque chose (perso je l'ai mis en globale, le plus simple).

  7. #7
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Je n'ai pas testé mais je me demande si cela ne va pas buguer car tu n'as pas passé le tableau tab en paramètre de la fonction position_clique_point(ev)...
    oui tu as raison, et c'est d'ailleurs la raison pour laquelle j'ai corrigé mon code
    Dernière modification par psychadelic ; Aujourd'hui à 15h27. Motif: petite coquille sur la portée de variable

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Si tu tiens à passer le tableau en paramètre tu peux faire ça par exemple :

    Code HTML : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <!DOCTYPE html>
    <html>
     
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>Model</title>
     
        <style>
            canvas {
                background-color: green;
                width: 500px;
                height: 300px;
            }
        </style>
         <script>
                window.onload = function () {
                    "use strict";
                    var tab = [];
                    var canvas = document.getElementById('jeu');
                    var ctx = canvas.getContext("2d");
        
                    canvas.addEventListener('click', function (ev) {
                        position_clique_point(ev, tab);
                    }, false);
                };
        
        
                function position_clique_point(ev, tab) {
        
                    var canvas = ev.target;
                    var x = ev.clientX - canvas.offsetLeft;
                    var y = ev.clientY - canvas.offsetTop;
        
                    var point2d = {x,y};    //var point2d = {x,y};    
                    tab.push(point2d);    
                    console.log(point2d, tab);
                }
            </script>
    </head>
     
    <body>
     
     
        <canvas id="jeu"></canvas>
     
     
    </body>
     
    </html>

    J'ai modifié une partie de ton code pour que le test soit possible (car par exemple tu ne nous as pas donné la "classe point"...)...


    EDIT : Mais j’anticipe un problème, dans le code précédent j'ai laissé tab en variable locale (comme c'est le cas dans le code initial) mais du coup tu n'auras pas accès à ce tableau en dehors de la fonction dans laquelle il est défini alors tu peux le mettre en variable globale et dans ce cas plus besoin de le passer en paramètre, cela donnerait ça :

    Code html : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <!DOCTYPE html>
    <html>
     
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>Model</title>
     
        <style>
            canvas {
                background-color: green;
                width: 500px;
                height: 300px;
            }
        </style>
        <script>
            "use strict";
            var tab = [];
     
            window.onload = function () {
                var canvas = document.getElementById('jeu');
                var ctx = canvas.getContext("2d");
     
                canvas.addEventListener('click', function (ev) {
                    position_clique_point(ev);
                }, false);
            };
     
     
            function position_clique_point(ev) {
                var canvas = ev.target;
                var x = ev.clientX - canvas.offsetLeft;
                var y = ev.clientY - canvas.offsetTop;
     
                var point2d = {
                    x,
                    y
                }; //var point2d = {x,y};    
                tab.push(point2d);
                console.log(point2d, tab);
            }        
        </script>
    </head>
     
    <body>
     
     
        <canvas id="jeu"></canvas>
     
     
    </body>
     
    </html>

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2012, 14h18
  2. Executer une fonction (avec paramètres) dans un thread secondaire
    Par you38 dans le forum Threads & Processus
    Réponses: 21
    Dernier message: 06/08/2010, 08h12
  3. Fonction avec paramètre illimité
    Par Kiboumz dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2006, 17h58
  4. [Function]Appel de fonction avec paramètre
    Par julienOriano dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2006, 07h48
  5. Réponses: 4
    Dernier message: 11/09/2005, 01h21

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