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 :

Affecter un événement une seule fois


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2018
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 166
    Par défaut Affecter un événement une seule fois
    Bonjour,
    cette discussion fait suite à : Création d'un mini jeu vidéo

    J'aimerais que le joueur ne puisse pas jouer 2 fois dans la même map area, sinon c'est trop facile de faire des points.
    Et du coup comme il y aura beaucoup de map area, qu'il est une sorte de radar des map déjà trouvées.

    Du coup j'imagine que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (result === area["dataset"]["nom"]) { // area["dataset"]["nom"] contient la valeur de la balise "data-nom"
     
    				compt += 10;
    				document.getElementById("champDuPrompt").innerHTML = compt;
     
    			}
    je vais insérer une ligne qui change l'eventlistener "Click" pour qu'il renvoie un message d'alerte si c'est déjà fait au lieu d'ouvrir le prompt

  2. #2
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2018
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 166
    Par défaut
    J'ai fait un essai en reprenant un code plus simple, une image, 2 maps area

    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
    54
    55
    56
    <body>
        <map name="testmap" id="zones_image">
    		<area
    			shape="rect"
    			coords="570,195,660,275"
    			data-nom="bleu"
    		/>
    		<area
    			shape="poly"
    			coords="1027,266,1031,268,1034,271,1035,274,1033,279,1029,282,1021,282,1016,278,1017,271,1023,265,1024,261,1027,266"
    			data-nom="jaune"
    		/>
    	</map>
     
        <img usemap="#testmap" src="Fond.png" STYLE="position:absolute; top:250; left:50">
     
     
     
    <script type="text/javascript">
        
     
    let balises_area = Array.from(
            document
                    .getElementById("zones_image") // identifiant de la balise "map"
                    .getElementsByTagName("area")
    );
     
     
    balises_area.forEach(area => { // parcours de toutes les balises "area"
     
            area.addEventListener( // ajout d'un gestionnaire d'évènement à une balise
                      "click"
                    , evenement_clic => {
     
                            let area = evenement_clic["target"];
     
     
                            let result = prompt("Entre le nom du jeu :", "");
     
                            if (result === area["dataset"]["nom"]) { // area["dataset"]["nom"] contient la valeur de la balise "data-nom"
     
     
                            }
                else {
                     }
                    }
            );
     
     
    });
     
        
    </script>
     
     
    </body>


    et j'ai essayé de changer l'attribut du click sur false pour que la map ne fonctionne plus.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("area["dataset"]["nom"]").setAttribute("onclick", "return false;");
    Mais en fait plus rien ne fonctionne dès le début. si j'enlève cette ligne de code, les zones fonctionnent très bien.

    Où me suis je planté???

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Concernant ton soucis il existe également plusieurs solutions mais de loin la « plus mieux » et de n'écouter qu'une fois l'événement.

    Pour cela tu peux passer à addEventListener l'option {once: true}.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function fonctionSurClic(e) {
      const elClicked = e.target;   // par exemple ou this
      // ce que tu veux faire dans ta fonction
    }
     
    element.addEventListener("click", fonctionSurClic, {
      once: true
    });
    Je te conseille de lire ceci : addEventListener : Problèmes de mémoire

  4. #4
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2018
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 166
    Par défaut
    Par rapport à la fonction que tu as notée, j'ai lu le lien que tu m'as envoyé mais ce que je ne comprends pas, c'est que tu écoutes le gestionnaire d'élément "click" définit plus haut dans les area. Si cet évènement passe "true" alors le gestionnaire d'élément click s'arrête? Mais du coup, est ce que ca ne va pas s'arreter pour toutes les balises area ou juste pour une seule ?

    J'ai aussi essayé de l'utiliser, mais la encore je ne sais pas où la placer. Dans les balises area? après? Lorsque je la mets avant, cela empêche les balises de fonctionner.

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Pour info : création d'une nouvelle discussion
    Si cet évènement passe "true" alors le gestionnaire d'élément click s'arrête?
    l'événement est attaché à chaque élément, pas de façon global, quand tu auras cliqué sur un élément son événement attaché ne sera plus écouté mais cela ne concerne que cet élément et pas les autres en attendant qu'il soit cliqué à leur tour.


    J'ai aussi essayé de l'utiliser, mais la encore je ne sais pas où la placer.
    là je ne comprend pas de quoi tu parles !?!

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2018
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 166
    Par défaut
    Tout d'abord, merci d'avoir créé une nouvelle discussion.

    Ensuite quand j'utilise la fonction que tu as créé, elle n'enlève pas l'event "click". Je peux ouvrir une boite de dialogue à chaque fois que je clique sur la même zone

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <body>
        <map name="testmap" id="zones_image">
    		<area
    			shape="rect"
    			coords="570,195,660,275"
    			data-nom="bleu"
    		/>
    		<area
    			shape="poly"
    			coords="1027,266,1031,268,1034,271,1035,274,1033,279,1029,282,1021,282,1016,278,1017,271,1023,265,1024,261,1027,266"
    			data-nom="jaune"
    		/>
    	</map>
     
        <img usemap="#testmap" src="Fond.png" STYLE="position:absolute; top:250; left:50">
     
     
     
    <script type="text/javascript">
        
     
    let balises_area = Array.from(
            document
                    .getElementById("zones_image") // identifiant de la balise "map"
                    .getElementsByTagName("area")
    );
     
     
        
    balises_area.forEach(area => { // parcours de toutes les balises "area"
     
            area.addEventListener( // ajout d'un gestionnaire d'évènement à une balise
                      "click"
                    , evenement_clic => {
     
                            let area = evenement_clic["target"];
     
     
                            let result = prompt("Entre le nom du jeu :", "");
     
                            if (result === area["dataset"]["nom"]) { // area["dataset"]["nom"] contient la valeur de la balise "data-nom"
     
     
                            }
                else {
                     }
                    }
            );
     
     
    });
        function fonctionSurClic(e) {
      const elClicked = e.target;   // par exemple ou this
      // ce que tu veux faire dans ta fonction
    }
     
    element.addEventListener("click", fonctionSurClic, {
      once: true
    });
    </script>
     
     
    </body>

    C'est pour cette raison que je pensais l'avoir mal placé dans le script.

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

Discussions similaires

  1. Coder un même évènement en une seule fois
    Par Sablhotel dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 03/03/2019, 10h15
  2. évènement onclick détecté qu'une seule fois
    Par sebac dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 03/03/2010, 10h50
  3. Réponses: 1
    Dernier message: 19/03/2005, 22h47
  4. Réponses: 18
    Dernier message: 10/02/2005, 13h22
  5. Réponses: 2
    Dernier message: 30/11/2004, 11h48

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