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 :

Arrêter un fond sonore lors d'un scroll ou lors d'un click


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 445
    Points : 138
    Points
    138
    Par défaut Arrêter un fond sonore lors d'un scroll ou lors d'un click
    Bonjour à tous,
    J'ai dans mon body une musique en autoplay que je voudrais arrêter lors du scroll ou lors du click sur la div class="logo".
    Cela est-il possible ? Au cas ou, voici le body concerné :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <body>
    <audio autoplay>
    <source src="audio/song.ogg" type="audio/ogg">
    <source src="audio/song.mp3" type="audio/mp3">
    </audio>
    <div id="header">
       <div class="logo"><a href="#section-un"><img src="img/logo.svg"  alt="" width="50em" class="logo animClass"/></a>
        </div>
    Merci pour votre aide et bon week-end,
    dh

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    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 093
    Points : 6 754
    Points
    6 754
    Par défaut
    C'est assez simple.

    Tout ce dont tu as besoin c'est de surveiller les évènements click et scroll de ta div (par exemple avec addEventListener) et d'appeler la méthode pause de ton objet audio.

    Tu devrais ajouter des id à ton <audio> et ta <div class="logo"> pour y accéder plus facilement depuis ton script.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre habitué
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 445
    Points : 138
    Points
    138
    Par défaut
    Merci Watilin pour ta réponse,
    OK, je vais ajouter un id pour l'audio et le logo mais j'ai du mal à voir comment adapter le code addEventListener à mon cas :
    Code exemple du site :
    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
    <html>
     <head>
       <title>Exemple de DOM Event</title>
       <style type="text/css">
         #t { border: 1px solid red }
         #t1 { background-color: pink; }
       </style>
       <script type="text/javascript">
       // fonction pour modifier le contenu de t2
       function modifieTexte() {
         var t2 = document.getElementById("t2");
         t2.firstChild.nodeValue = "trois";    
       }
       // fonction pour ajouter un écouteur à t
       function load() { 
         var el = document.getElementById("t"); 
         el.addEventListener("click", modifieTexte, false); 
       } 
       </script> 
     </head> 
     <body onload="load();"> 
     <table id="t"> 
       <tr><td id="t1">un</td></tr> 
       <tr><td id="t2">deux</td></tr> 
     </table> 
     </body> 
     </html>
    Je ferai des tests demain-.
    Merci et bonne soirée,
    dh

  4. #4
    Membre habitué
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 445
    Points : 138
    Points
    138
    Par défaut
    Bonsoir Watilin,
    L'audio et le logo ont leurs id, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       function pause() {
         var audio = document.getElementById("audio");
       }
       function load() { 
         var el = document.getElementById("logo"); 
         el.addEventListener("click", audio.pause, false); 
       }
    Je fais plus que débuter en js. Où sont mes (nombreuses) erreurs ???
    Merci pour votre aide et bonne fin de soirée,
    dh

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 58
    Points
    58
    Par défaut
    Tu n'est pas obligé de passer par un addEventListener, un .onclick suffit je pense.

    JSFiddle

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    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 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par dhillig Voir le message
    Bonsoir Watilin,
    L'audio et le logo ont leurs id, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       function pause() {
         var audio = document.getElementById("audio");
       }
       function load() { 
         var el = document.getElementById("logo"); 
         el.addEventListener("click", audio.pause, false); 
       }
    Je fais plus que débuter en js. Où sont mes (nombreuses) erreurs ???
    Il y en a juste deux petites :
    1. Tu n'as pas besoin de déclarer une fonction pause ;
    2. La variable audio que tu as déclarée dans ta fonction pause n'est pas à portée depuis la fonction load. N'oublie pas que la portée des variables en JavaScript est délimitée par les fonctions.

    Une autre chose qui pourrait éventuellement poser problème, c'est le changement de contexte de la méthode pause. Prenons ce code comme exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function load() {
      var audio = document.getElementById("audio");
      var el = document.getElementById("logo");
      el.addEventListener("click", audio.pause, false);
    }
    Lorsque audio.pause est appelée, elle reçoit el comme contexte, c'est-à-dire que l'objet this dans cette fonction sera el. C'est une particularité de addEventListener. Le problème est que pause est censée avoir audio comme contexte, et comme c'est une méthode native, tu n'as aucun moyen de savoir si elle utilise this ou pas. Peut-être que ça ne pose pas de problème dans le cas présent, mais sache que ce problème peut se produire avec d'autres objets.

    Ça arrive par exemple avec l'objet console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.body.addEventListener("click", console.log, false);
    Lors d'un clic, je reçois ce message :
    TypeError: 'log' called on an object that does not implement interface Console.
    Désolé si je rentre dans les détails techniques, mais il vaut mieux que tu saches d'où vient le problème si jamais tu le rencontres un jour.
    En fait, la solution est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.body.addEventListener("click", function(event){ console.log(event); }, false);
    Et donc dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    el.addEventListener("click", function() { audio.pause(); }, false);
    Mais si tu préfères, tu peux prendre la solution de LuluHow

    Citation Envoyé par LuluHow Voir le message
    Tu n'est pas obligé de passer par un addEventListener, un .onclick suffit je pense.
    Mais alors en quoi addEventListener est utile finalement ? Réponse : il permet d'attacher plusieurs fonctions sur le même évènement du même objet. Alors que si on modifie un onclick, la fonction précédente est oubliée.

    Il n'y a rien de plus fouuuh, plus gentiiiiiih…
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Membre habitué
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 445
    Points : 138
    Points
    138
    Par défaut :)
    Bonsoir Watilin et LuluHow,
    Un grand merci à vous
    Le code le LuluHow, simple et super efficace.
    Merci bcp Watilin pour toutes tes explications (j'adore ça... apprendre ! ).
    Problème résolu mais afin de comprendre davantage addEventListener, le code approprié à mon prob (résolu) serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function () {
      var audio = document.getElementById("audio");
       }
    function load() {
      var audio = document.getElementById("audio");
      var el = document.getElementById("logo");
    el.addEventListener("click", function() { audio.pause(); }, false);
    }
    Ou sans la fonction () - je n'ai pas trop compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function load() {
      var audio = document.getElementById("audio");
      var el = document.getElementById("logo");
    el.addEventListener("click", function() { audio.pause(); }, false);
    }
    Dans ces deux cas, le son ne s'arrête pas. Il y a donc un truc que j'ai pas compris
    Encore merci à vous et bonne soirée
    TOP CE SITE ET SES MEMBRES !!!
    dh

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 58
    Points
    58
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        function load() {
            var audio = document.getElementById("audio");
            var el = document.getElementById("logo");
            el.addEventListener("click", function() { 
                audio.pause(); 
            }, false);
        }
    window.onload = load();

    Tu dois appeler utiliser la méthode onload. Cela permet de lancer ta fonction load() une fois que tous les éléments sont chargés dans le DOM.

  9. #9
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    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 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Lulu n'oublie pas que dhillig appelle déjà load depuis son <body>.
    Il faut choisir entre window.onload = ... et <body onload="..."> sinon la fonction risque d'être appelée plusieurs fois.

    Pour moi le problème est plutôt là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function () {
      var audio = document.getElementById("audio");
       }
    Encore une fois, la console aurait aidé à trouver tout de suite le problème :
    SyntaxError: function statement requires a name
    Dhillig, quand je te disais que tu n'avais pas besoin de déclarer la fonction pause, je ne voulait dire de retirer seulement le nom, mais la fonction entière

    Pour rentrer dans les détails, la syntaxe JavaScript a deux façons de considérer une fonction : la fonction-statement (instruction) et la fonction-expression. C'est pas évident à expliquer clairement mais je vais essayer, car ça rendra plus clair le message d'erreur de la console. En effet, pourquoi ne peut-on pas retirer son nom à la fonction audio alors qu'on a le droit de passer une fonction sans nom à addEventListener deux lignes plus bas ?

    Donc une fonction-statement c'est quand tu déclares une fonction dans le but de l'appeler plus tard. Une fonction-statement a obligatoirement un nom. De plus, elle est obligatoirement séparée de l'instruction précédente par un point-virgule, ou par une fin de ligne équivalente à un point-virgule grâce au mécanisme d'insertion automatique de point-virgule.

    La fonction-expression, comme son nom l'indique, est une expression, c'est-à-dire qu'elle est un « bout de calcul ». Une expression peut faire partie d'une expression plus grande (exemple : l'expression (2 + 1) fait partie de l'expression 3 * (2 + 1)) et une fonction peut être le résultat d'un « calcul » au sens large (par exemple un appel à new Function() donne en résultat une fonction). Une fonction-expression peut ne pas avoir de nom, dans ce cas on dit qu'elle est anonyme. Également, quand on appelle une fonction, les arguments qu'on lui passe sont des expressions, dont la fonction anonyme dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    el.addEventListener("click", function() {
      audio.pause();
    }, false);
    En régle générale, pour déterminer si on a affaire à une instruction ou une expression, on peut se fier aux points-virgules : un bout de code entre deux points-virules est une instruction Les instructions, elles, sont composées d'expressions. Ils y a toutefois certains cas un peu difficiles à discerner. La logique précise est décrite par la grammaire du langage, qui est en libre accès sur Ecmascript.org.

    Du fait que les interpréteurs JavaScript fonctionnent tous en analysant le code de gauche à droite, si une fonction se trouve immédiatement au début d'une instruction, elle est considérée comme un statement et doit donc avoir un nom. Ceci explique le message « fonction statement requires a name ».
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  10. #10
    Membre habitué
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 445
    Points : 138
    Points
    138
    Par défaut
    Bonsoir à tous et encore merci,
    Rien à faire, mon fichier est fâché avec addEventListener
    J'ai tenté tous les derniers scripts (ceux d'aujourd'hui), le son est toujours présent.
    Y-a t'il conflit entre mes scripts (il y en a pas mal dans ma page) ? Peut-être...
    Merci pour toutes tes explications Watilin, j'imprime (au sens propre) toute la discussion afin d'étudier tout ça sur papier... car je n'ai pas encore acquis la logique js, mais j'y travaille
    Encore MERCI à vous
    Prob résolu mais ravi que la discussion continue/est continuée...
    Bonne soirée,
    dh

    ERRATUM : que la discussion continue/AI continuée...

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

Discussions similaires

  1. Fond sonore avec la balise embed
    Par SG2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 17/03/2007, 08h10
  2. lire en boucle un fond sonore au format ogg
    Par ramdam dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/01/2007, 10h52
  3. Lecture de fond sonore en continue sur mon site
    Par snakejl dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 28/06/2006, 15h45
  4. [AJAX] Ajax et musique en fond sonore
    Par dragonfly dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 21/04/2006, 16h12
  5. [AJAX] Ajax et fond sonore
    Par dragonfly dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/04/2006, 12h02

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