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 :

Coder un même évènement en une seule fois


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Coder un même évènement en une seule fois
    Bonjour,

    C'est la première fois que je vous sollicite. Je suis actuellement étudiante et je code un site pour l'apprentissage de l'anglais dans lequel j'ai inséré 30 fichiers audios.
    Il y a donc 30 fois ce code dans le fichier javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    document.getElementById('bip1').addEventListener('click', JouerSon1);
     
    function JouerSon1() {
        var sound = document.getElementById("Son1");
        sound.play();
    }
    Comment puis-je faire pour le simplifier?
    Même de votre aide.

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    30 fois le même code, impossible avec des ID ! Car un ID doit être unique dans la page web ! Il ne peut donc y avoir qu'un seul 'bip1 et un seul Son1.

    Mais je présume qu'il y a bip1, bip2 etc et idem pour Son.

    Un 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
    <button id="bip1">Joue Son1</button>
    <button id="bip2">Joue Son2</button>
    <button id="bip3">Joue Son3</button>
    <button id="bip4">Joue Son4</button>
     
    <figure>
        <figcaption>Listen to the T-Rex:</figcaption>
        <audio
            id="Son1"
            controls
            src="http://www.tafelrunde.net/hlds/sound/ambience/mtrex.wav">
                Your browser does not support the
                <code>audio</code> element.
        </audio>
    </figure>
     
    <figure>
        <figcaption>Listen to the T-Rex:</figcaption>
        <audio
            id="Son2"
            controls
            src="http://forcex.home.mindspring.com/dinoroar.wav">
                Your browser does not support the
                <code>audio</code> element.
        </audio>
    </figure>
     
    <figure>
        <figcaption>Listen to the T-Rex:</figcaption>
        <audio
            id="Son3"
            controls
            src="http://www.amodinosaur.com/Uploads/file/20150915/1442247102672373.wav">
                Your browser does not support the
                <code>audio</code> element.
        </audio>
    </figure>
     
    <figure>
        <figcaption>Listen to the T-Rex:</figcaption>
        <audio
            id="Son4"
            controls
            src="http://www.amodinosaur.com/Uploads/file/20150914/1442235779475029.wav">
                Your browser does not support the
                <code>audio</code> element.
        </audio>
    </figure>

    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
    18
    19
    20
    21
    22
    23
    24
    window.addEventListener('load', ev => {
        // le DOM est construit et la page web est visible
     
        // début code du test
     
        const elemsBip = Array.from(document.querySelectorAll('[id^="bip"]'));
     
        for (const elemBip of elemsBip){
            elemBip.addEventListener('click', ev => {
                document.querySelector('#Son' + ev.target.id.slice(-1)).play();
            }, {
                capture: false,
                passive: true,
                once: false
            });
        }
     
        // fin code du test
     
    }, {
        capture: false,
        passive: true,
        once: false
    });

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Mon exemple ne traite que bip1 à bip9, pour en traiter plusieurs dizaines il faut les numéroter bip01, bip02, etc.

    Au lieu d'un seul caractère, il faut maintenant copier les deux derniers caractères de l'ID : ev.target.id.slice(-2)

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour vos réponses si rapides!
    je suis tellement nulle en javascript (vous n'imaginez même pas!) que je ne comprends pas votre réponse.
    Mais vous avez raison, il y a plusieurs bips et sons (30 différents).
    Mon code html (que j'ai copié sur un forum) est le suivant :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <audio id="Son6" src="../audios/audios_poem/song.mp3"></audio>
        	<div id="bip6">
            <img src="../images/logo_son.png" />
             <span> song </span>
        	</div>
    Je veux juste qu'en cliquant sur une image, cela déclenche le fichier mp3 associé.

    Mon code est-il en phase avec votre réponse?

    Merci milles fois de votre aide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il n'y a pas besoin d'avoir le moindre player audio dans le code HTML.
    On peut très bien jouer du son sans balise <audio>.

    VERSION 1 :

    1- Tout ce dont tu as besoin dans le code HTML, ce sont les "touches" :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <div class="touches">
      <div data-id="1"><img src="../images/logo_son.png" /><br/>Son 1</div>
      <div data-id="2"><img src="../images/logo_son.png" /><br/>Son 2</div>
      <div data-id="3"><img src="../images/logo_son.png" /><br/>Son 3</div>
      <div data-id="4"><img src="../images/logo_son.png" /><br/>Son 4</div>
      <div data-id="5"><img src="../images/logo_son.png" /><br/>Son 5</div>
      <div data-id="6"><img src="../images/logo_son.png" /><br/>Son 6</div>
      <div data-id="7"><img src="../images/logo_son.png" /><br/>Son 7</div>
      <div data-id="8"><img src="../images/logo_son.png" /><br/>Son 8</div>
      ...
    </div>
    L'attribut data-id va permettre d'identifier le son à jouer.

    2- Dans le script JavaScript :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    "use strict";
    // -------------
    // 1- Liste des URL des fichiers audio
    const musics = [
      "", // l'index commence à 0 (zéro) : on ne met rien ici
      "https://www.memoclic.com/medias/sons-wav/2/729.wav", // 1
      "https://www.memoclic.com/medias/sons-wav/2/728.wav", // 2
      "https://www.memoclic.com/medias/sons-wav/2/727.wav", // ...
      "https://www.memoclic.com/medias/sons-wav/2/726.wav",
      "https://www.memoclic.com/medias/sons-wav/2/725.mp3",
      "https://www.memoclic.com/medias/sons-wav/2/724.mp3",
      "https://www.memoclic.com/medias/sons-wav/2/723.mp3",
      "https://www.memoclic.com/medias/sons-wav/2/722.mp3",
    ];
    // -------------
    // 2- Touches
    const touches = document.querySelectorAll(".touches > div"); // on cible les touches
    touches.forEach(function(touche) {
      touche.addEventListener("click", function() { // au click sur une touche
        let id = this.dataset.id; // on récupère le contenu de data-id
        playSound(id);
      });
    });
    // ------------------------
    // 3- player audio - SANS balise <audio> dans la page
    function playSound(id) {
      var audio = new Audio( musics[id] ); // on crée (virtuellement) le player audio
      audio.play();
    }

    3- Un peu de CSS :
    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    .touches > div {
      display: inline-block;
      border: 1px solid green;
      min-width: 60px;
      height: 60px;
      text-align:center;
      cursor:pointer;
    }

    VERSION 2 :

    Néanmoins, si tu veux vraiment un lecteur audio dans le code HTML (pour avoir accès aux boutons de contrôle du son, entre autres) :

    1- rajoute juste :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <audio id="player-audio" src="" controls></audio>
    2- remplace la fonction playSound() par :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // ------------------------
    // 3- player audio - AVEC balise <audio> dans la page
    const player_audio = document.getElementById('player-audio');
    function playSound(id) {
      player_audio.src = musics[id]; // on applique l'URL du fichier musique
      player_audio.play();
    }
    Remarque :
    • la solution SANS balise <audio> permet de jouer plusieurs sons EN MEME TEMPS
    • la solution AVEC balise <audio> ne permet de jouer QU'UN SEUL son à la fois.







    Citation Envoyé par danielhagnoul Voir le message
    Mon exemple ne traite que bip1 à bip9, pour en traiter plusieurs dizaines....
    @danielhagnoul
    Cette problématique se règle très facilement (et sans bidouillage * ) :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
                document.querySelector('#Son' + ev.target.id.replace('bip','')).play();
    * avec ev.target.id.slice(-2), tu ne peux aller QUE jusqu'à bip99... (et ça oblige effectivement à écrire bip01, bip02,..., bip09)
    Quid de bip100 et suivants ?
    ev.target.id.replace('bip','') est LA solution fiable
    Dernière modification par Invité ; 02/03/2019 à 11h35.

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Je me permets un petit pinaillage
    Citation Envoyé par jreaux62 Voir le message
    On peut très bien jouer du son sans balise <audio>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var audio = new Audio( musics[id] ); // on crée (virtuellement) le player audio
    Le constructeur new Audio renvoie un objet HTMLAudioElement, c’est donc bel et bien une balise <audio>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(Object.getPrototypeOf(new Audio());
    • la solution SANS balise <audio> permet de jouer plusieurs sons EN MEME TEMPS
    • la solution AVEC balise <audio> ne permet de jouer QU'UN SEUL son à la fois.
    Attention quand on manipule plusieurs éléments <audio>, j’ai pu constater que, sous Firefox au moins, ça causait des ralentissements sur le long terme. Ça ressemble à une fuite de mémoire, donc ça sera sans doute corrigé à l’avenir… J’espère

    Sinon, il existe vraiment () un moyen de faire du son sans <audio>, en utilisant l’API Web Audio. Notamment, on trouve sur la page de doc de OscillatorNode un exemple de code qui permet de générer un bip :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // crée un contexteaudio
    var contexteAudio = new (window.AudioContext || window.webkitAudioContext)();
     
    // create Oscillator node
    var oscillator = contexteAudio.createOscillator();
    oscillator.connect(contexteAudio.destination);
    oscillator.type = 'sine';
    oscillator.frequency.value = 440; // valeur en hertz
     
    oscillator.start();
    J’ai remplacé le 'square' de l’exemple original par 'sine', c’est plus agréable à l’oreille. Pour arrêter le son, il faut exécuter cette instruction :

  7. #7
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 749
    Points
    4 749
    Par défaut
    Je me permets [aussi] un petit pinaillage

    plutôt que
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // 2- Touches
    const touches = document.querySelectorAll(".touches > div"); // on cible les touches
    touches.forEach(function(touche) {
      touche.addEventListener("click", function() { // au click sur une touche
        let id = this.dataset.id; // on récupère le contenu de data-id
        playSound(id);
      });
    });

    utiliser une délégation d’évènements
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // 2- Touches
    document.querySelector(".touches").onclick = function(e) {
      if (!e.target.matches('div')) return;
      e.stopPropagation();
      playSound(e.target.dataset.id);
    }

    ce qui correspond mot pour mot à la question : "Comment coder un même évènement en une seule fois? "

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut suite réponses à ma question
    Bonjour,

    Merci à tous pour vos réponses.
    Je vais prendre en compte vos propositions de code ce soir et vous tiens au courant!

Discussions similaires

  1. Recherche par mots clés : afficher qu'une seule fois la même valeur
    Par Zazou48 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 09/05/2013, 15h30
  2. [MySQL] afficher une seule fois un titre pour différents clients qui ont le même titre
    Par Prisss dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 01/12/2010, 10h52
  3. Réponses: 5
    Dernier message: 29/11/2010, 15h49
  4. [CR 10] Imprimer plusieurs fois le même état sur une seule page
    Par Shell32 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 23/04/2010, 11h41
  5. é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

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