Javascript 如何删除eventListener。removeEventListener不';行不通

Javascript 如何删除eventListener。removeEventListener不';行不通,javascript,dom,Javascript,Dom,我有一个“开始游戏”按钮,当你点击游戏开始时,按钮上的单词变成“重复”——随机选择一张牌,播放该牌单词的声音,你需要猜它是哪张牌。但是当游戏开始时,如果你按下这个按钮,那么它应该已经作为一个中继器工作了,也就是说,这样你就可以再次听到这个单词了。如何在按下按钮时删除新词的播放,以及如何重复已发声的新词。RemoveEventListener不起作用。当我点击时,它会同时播放新旧单词 const startGameBtn = document.getElementById('start-game'

我有一个“开始游戏”按钮,当你点击游戏开始时,按钮上的单词变成“重复”——随机选择一张牌,播放该牌单词的声音,你需要猜它是哪张牌。但是当游戏开始时,如果你按下这个按钮,那么它应该已经作为一个中继器工作了,也就是说,这样你就可以再次听到这个单词了。如何在按下按钮时删除新词的播放,以及如何重复已发声的新词。RemoveEventListener不起作用。当我点击时,它会同时播放新旧单词

const startGameBtn = document.getElementById('start-game');
startGameBtn.addEventListener('click', function() { 
  startGameBtn.innerHTML = 'Repeat';
  startGameBtn.classList.add('repeat');  
  startGame(); 
}) 
startGameBtn.removeEventListener('click', function() {
  startGame()
});
function startGame() {
  let randomCard = createRandomCard(); 
  randomCard.querySelector('audio').play(); 
  document.getElementById('category').addEventListener('click', (e) => {
    if(document.body.classList.contains('game-mode')) {
      if(e.target.closest('.card-item') === randomCard) {
        e.target.closest('.card-item').classList.add('checked-card');  
        randomCard = createRandomCard();
        setTimeout(function(){ randomCard.querySelector('audio').play(); }, 2500);  
      } else {
        let error = 'audio/error.mp3';
        playAudio(error)
      }    
    }   
  }) 
  document.querySelector('#start-game').addEventListener('click', function() {
    randomCard.querySelector('audio').play();
  })
}

使用
addEventListener
时,使用一个匿名函数调用
startName
函数,并在按钮上设置
innerHTML
和类


您在
removeEventListener
中使用的函数也是匿名的,因此不能与在
addEventListener
中使用的函数相同。这将导致
removeEventListener
调用不删除侦听器,因为它根本不知道要删除什么


因此,创建一个对(非匿名)函数的引用,并将该引用传递给
addEventListener
removeEventListener

const startGameBtn = document.getElementById('start-game');

// Create reference to function.
const onStartClick = () => {
  startGameBtn.innerHTML = 'Repeat';
  startGameBtn.classList.add('repeat');  
  startGame(); 
};

// Use reference in adding and removing the event listeners.
startGameBtn.addEventListener('click', onStartClick);
startGameBtn.removeEventListener('click', onStartClick);

至于代码的其余部分,请记住,每当您在单击时执行的函数中使用
addEventListener
时,每次单击后都会添加一个新的侦听器。这可能会导致意外行为。

removeEventListener
应使用对与
addEventListener
一起使用的相同函数的引用,否则它将不起作用。@EmielZuurbier但我删除了相同的函数startName。或者我不明白