#javascript #dom
#javascript #dom
Вопрос:
У меня есть кнопка «Начать игру», при нажатии на которую запускается игра, и слово на кнопке меняется на «Повторить» — выбирается случайная карта и воспроизводится звук слова карты, и вам нужно угадать, какая это карта. Но когда игра началась, если вы нажмете эту кнопку, то она уже должна работать как повторитель, т.е. чтобы вы могли снова прослушать слово. Как удалить воспроизведение нового слова при нажатии кнопки, и повторить уже озвученное. 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();
})
}
Комментарии:
1.
removeEventListener
следует использовать ссылку на ту же функцию, которая используется сaddEventListener
, иначе она не будет работать.2. @EmielZuurbier но я удаляю ту же функцию startGame . Или я не понимаю
Ответ №1:
При addEventListener
использовании вы используете анонимную функцию, которая вызывает вашу startGame
функцию и устанавливает innerHTML
класс and на кнопке.
Функция, которую вы используете, 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
inside, которая выполняется по щелчку, вы добавляете нового слушателя после каждого щелчка. Это может привести к неожиданному поведению.