Rewriting event handler to call a function

I’ll post the previous code below… for comparison, it was working as I expected up until that point.
I’m trying to pull the anonymous function out of
line 18…
pad.addEventListener(“click”, padClicks); //end of EventListener
}); //end of Array.from(pads).forEach((pad, index)
and call the new function padClicks on line 21
function padClicks() {

var clickCounter = 0;
var currentLevel = 0;
var simon_sSequence = [];
var player_sInput = [];
const audioTapper = document.querySelector("#audioT");
const audioError = document.querySelector("#audioE");
const levelDisplay = document.getElementById("level_Display");
const simonzSequence = document.getElementById("simon_sSequence");
const playerInput = document.getElementById("player_sInput");
const pads = document.querySelectorAll(".padz");
// Convert the padz list to an array that we can iterate over using .forEach()
Array.from(pads).forEach((pad, index) => {
  // Get the associated audio element nested in the padz-div
  const audio = pad.querySelector("audio");
  // Add a click listener to each pad which
  // will play the audio, push the index to
  // the user input array, and update the span
  pad.addEventListener("click", padClicks);   //end of EventListener
});     //end of Array.from(pads).forEach((pad, index)

function padClicks() {
    player_sInput.push(index);
    if (player_sInput[clickCounter] !== simon_sSequence[clickCounter]) {
      audioError.play();
      $("body").animate({ backgroundColor: "red" }, 100);
      $("#container").effect( "shake", {times:100}, 1000, 'linear' );
      $("body").animate({ backgroundColor: "gray" }, 5000);
      //console.log("wrong");
    } else {  //end of if
      audio.play();
      playerInput.textContent = "Player's reply " + player_sInput;
      clickCounter++;
        //console.log(clickCounter);
    }   //end of else
}

function audioBlack() {
  //generate a random number & push it to simon_sSequence
  simon_sSequence.push(Math.floor(Math.random() * 4));
  simonzSequence.textContent = "Simon says " + simon_sSequence;
  playerInput.textContent = "Player's reply " + player_sInput;
  //for each in the array set time interval(300ms);
  //dipslay hover effect
  //play pad sound
  audioTapper.play();
  player_sInput = []; //clear player's input for this turn
  clickCounter = 0;
  currentLevel++;
  levelDisplay.textContent = "Level: " + currentLevel + " " + simon_sSequence.length + " " + player_sInput.length;
}

is it maybe because I break scope on the audio array? Should I be passing the pads in as an arrugment? I’m new to event listeners, because I’ve always gotten away with on click in the HTML but I’m trying to get better at doing it right for best practices.

var clickCounter = 0;
var currentLevel = 0;
var simon_sSequence = [];
var player_sInput = [];
const audioTapper = document.querySelector("#audioT");
const audioError = document.querySelector("#audioE");
const levelDisplay = document.getElementById("level_Display");
const simonzSequence = document.getElementById("simon_sSequence");
const playerInput = document.getElementById("player_sInput");
const pads = document.querySelectorAll(".padz");
// Convert the padz list to an array that we can iterate over using .forEach()
Array.from(pads).forEach((pad, index) => {
  // Get the associated audio element nested in the padz-div
  const audio = pad.querySelector("audio");
  // Add a click listener to each pad which
  // will play the audio, push the index to
  // the user input array, and update the span
  pad.addEventListener("click", () => {
    player_sInput.push(index);
    if (player_sInput[clickCounter] !== simon_sSequence[clickCounter]) {
      audioError.play();
      $("body").animate({ backgroundColor: "red" }, 100);
      $("#container").effect( "shake", {times:100}, 1000, 'linear' );
      $("body").animate({ backgroundColor: "gray" }, 5000);
      //console.log("wrong");
    } else {  //end of if
      audio.play();
      playerInput.textContent = "Player's reply " + player_sInput;
      clickCounter++;
        //console.log(clickCounter);
    }   //end of else
  });   //end of EventListener
});     //end of Array.from(pads).forEach((pad, index)

function audioBlack() {
  //generate a random number & push it to simon_sSequence
  simon_sSequence.push(Math.floor(Math.random() * 4));
  simonzSequence.textContent = "Simon says " + simon_sSequence;
  playerInput.textContent = "Player's reply " + player_sInput;
  //for each in the array set time interval(300ms);
  //dipslay hover effect
  //play pad sound
  audioTapper.play();
  player_sInput = []; //clear player's input for this turn
  clickCounter = 0;
  currentLevel++;
  levelDisplay.textContent = "Level: " + currentLevel + " " + simon_sSequence.length + " " + player_sInput.length;
}

CodePen for reference

This topic was automatically closed 91 days after the last reply. New replies are no longer allowed.