Переключить звук и класс по клику, но также удалить класс через 6 секунд

Я пытаюсь использовать jQuery, чтобы добавить класс «активный» к ссылке при нажатии, а затем автоматически удалить через 6 секунд. Если ссылка имеет класс «активен» при нажатии, тогда продолжайте и удалите класс. Я также пытаюсь использовать эту ссылку для воспроизведения/остановки воспроизведения mp3.

HTML:

<audio id = "cat-growl-sound" controls>
  <source src = "sound.mp3" type = "audio/mpeg">
</audio>


<a id = "cat-growl-link" href = "javascript:void(0)">Fire Me!</a>

CSS:

audio { display: none; }
#cat-growl-link.active { color: red; }

JЗАПРОС:

$('#cat-growl-link').click(function() {
  $("#cat-growl-sound")[0].play();
  $(this).addClass('active');
  $(this).removeClass('active').delay(6000);
});
$('#cat-growl-link.active').click(function() {
  $("#cat-growl-sound").stop();
  $(this).removeClass('active');
});

Я пробовал разные методы, чтобы попытаться заставить это работать, но разные методы работают только частично, а не все. Этот сценарий, который я решил опубликовать здесь, я думаю, лучше всего объясняет, что я пытаюсь сделать, даже если он не работает. Как мне заставить это работать правильно?

Вот jsFiddle с рабочим звуком: https://jsfiddle.net/tcmpguok/

.delay() работает только с очередью анимации в jQuery. Вместо этого используйте setTimeout
j08691 10.12.2020 19:22

... и только в методах, связанных после него, а не перед ним.

Mitya 10.12.2020 19:22
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пара проблем. Во-первых, delay() работает только с методами jQuery, использующими очередь анимации — другими словами, асинхронными операциями. Даже в этом случае будут задержаны только методы, связанные после delay(), а не те, которые были до него.

Во-вторых, ваш второй обработчик событий не является динамическим; он будет привязан к любому элементу, который соответствует #cat-growl-link.active, во время загрузки страницы, а не в будущем, поскольку класс элемента добавляется/удаляется.

В общем, вы, вероятно, хотите что-то вроде этого:

let audio = $("#cat-growl-sound")[0],
    timeout;
$('#cat-growl-link').on('click', function() {
    if (!$(this).is('.active')) {
        $(this).addClass('active');
        audio.play();
        timeout = setTimeout(() => $(this).removeClass('active'), 6000);
    } else {
        $(this).removeClass('active');
        clearTimeout(timeout);
        audio.pause();
        audio.currentTime = 0;
    }
});

Спасибо, что нашли время объяснить. Одна проблема с фрагментом, однако, я получаю сообщение об ошибке консоли: «audio.stop не является функцией».

Xarcell 10.12.2020 20:35

Я попытался заменить «audio.stop» принятым ответом из этого вопроса (stackoverflow.com/questions/14834520/html5-audio-st‌​op-function), но это тоже не сработало.

Xarcell 10.12.2020 20:39

замените audio.stop на audio.pause(); audio.currentTime = 0;, и я приму это как правильный ответ.

Xarcell 10.12.2020 20:44

Другие вопросы по теме