Остановить звук, созданный с помощью javascript

Вот примерно так выглядит мой скрипт.

var ButtonSelect = document.querySelectorAll(".musicBtn")

ButtonSelect.forEach(element => element.addEventListener("click", playMusic))

function playMusic(){
    var audio = new Audio("music1.mp3");
    if (this.id == "A")
        audio.play();
    else if (this.id == "B") {
        audio.src = "music2.mp3";
        audio.play();
    } else if (this.id == "C") {
        audio.src = "music3.mp3";
        audio.play();
    } ...
}

И это примерно так и продолжается. Таким образом, в зависимости от того, какая кнопка нажата, играет другая песня. Но я хочу сделать так, чтобы нажатие кнопки не только запускало соответствующую песню, но и останавливало любую песню, воспроизводимую в данный момент. Поскольку звуковой объект создается локально и исчезает после вызова функции, как мне это сделать? Нет ли способа просто попросить страницу остановить воспроизведение любого звука, не указывая, откуда он исходит?

Отвечает ли это на ваш вопрос? Кнопка JavaScript Остановить все аудио на странице

caramba 17.12.2020 07:17

Взгляните на Как правильно удалить аудио html5 без добавления в DOM? Он показывает, как можно манипулировать элементом Audio в DOM для изменения звука.

Richard 17.12.2020 07:32

Спасибо, но я пытаюсь сделать это без использования элемента html audio.

FrankBlack23 17.12.2020 16:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вопрос спрашивает, как можно приостановить воспроизводимый в данный момент звук при выборе нового.

Есть дополнительная проблема. Данный код создает новый элемент каждый раз, когда нажимается кнопка, но он никогда не избавляется от него, поэтому постепенно хранилище будет заполняться аудиоэлементами, которые никогда не будут пересматриваться.

Простой способ обойти это — иметь только один аудиоэлемент и изменять src при нажатии кнопки. Таким образом, мы не наращиваем элементы, которые впоследствии становятся излишними.

Попробуйте этот код в первую очередь:

var ButtonSelect = document.querySelectorAll(".musicBtn")
var audio = new Audio("music1.mp3");

ButtonSelect.forEach(element => element.addEventListener("click", playMusic))

function playMusic(){
    audio.pause();
    if (this.id == "A") {
        audio.src = "music1.mp3";
        audio.play();
    }
    else if (this.id == "B") {
        audio.src = "music2.mp3";
        audio.play();
    } else if (this.id == "C") {
        audio.src = "music3.mp3";
        audio.play();
    }
}

Если это работает нормально, вы можете рассмотреть возможность упрощения своего кода, например, используя источник звука в качестве атрибута data-src для каждой из ваших кнопок, вместо того, чтобы выбирать, какой звук воспроизводить через идентификатор.

Аргх, и это было НАСТОЛЬКО просто. Большое спасибо, чувак.

FrankBlack23 17.12.2020 16:48

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