Search code examples
javascriptforeachclickthisaddeventlistener

How to assign different audio to different buttons after clicked event


  <h1 id="title">Drum 🥁 Kit</h1>
  <div class="set">
    <button class="w drum">w</button>
    <button class="a drum">a</button>
    <button class="s drum">s</button>
    <button class="d drum">d</button>
    <button class="j drum">j</button>
    <button class="k drum">k</button>
    <button class="l drum">l</button>
  </div>
var tekan = document.querySelectorAll(".drum");

tekan.forEach(drum => {
drum.addEventListener("click", play);
})

function play() {
// const sound = ["crash.mp3", "kick.mp3", "snare.mp3", "tom1.mp3", "tom2.mp3", "tom3.mp3", "tom4.mp3"];

var audio = new Audio('sounds/crash.mp3');
audio.play();  
};

When I click each button, it will only play the crash.mp3 audio, how do I assign different audio like the one in const sound to each button?

I tried to use this keyword so that it changes the audio file source (/crash.mp3) in

var audio = new Audio('sounds/crash.mp3'); 

according to the button clicked. I guess my knowledge of this keyword is still vague, or is there any way other than this? It would be great if I could only use Javascript for this.


Solution

  • When an event listener is triggered, the callback function receives the event that triggered it as an argument, with it you can determine which button was clicked. In your case you can use the element's class for that.

    The element's class can be accessed using the event.target.className for the string with all of the classes or event.target.classList for a list containing a string for each class.

    For your use case classList[0] contains the relevant information as the key label is the first class.

    const tekan = document.querySelectorAll(".drum");
    
    tekan.forEach(drum => {
      drum.addEventListener("click", play);
    })
    
    const drumSoundFiles = {
      "w": "crash.mp3", 
      "a": "kick.mp3", 
      "s": "snare.mp3",
      "d": "tom1.mp3", 
      "j": "tom2.mp3",
      "k": "tom3.mp3",
      "l": "tom4.mp3"
    }
    
    function play(event) {
      const pressedKey = event.target.classList[0]
      const soundFile = drumSoundFiles[pressedKey]
    
      const audio = new Audio(`sounds/${soundFile}`)
      audio.play()
    };
    

    Remember to map each key in the drumSoundFiles object to the correct sound.