Имитация нажатия на кнопку в audio controls.
Всем привет. Есть audio controls для воспроизведения музыки.
<audio controls class="muz"> <source src="music/1.mp3" type="audio/ogg" /> Есть ли возможность с помощью JS имитировать нажатие на кнопку для начала воспроизведения музыки сразу после загрузки страницы? Знаю раньше была такая возможность, сейчас в браузере это отменили. Обойти этот запрет можно? Всем спасибо за участие. |
Цитата:
Вам дай волю - вы достанете этими звуками и видосами... |
Юзер если захочет может разрешить автозапуск для твоего сайта(слева у адресной строки кнопочка). А если не захочет - то и не надо.
|
Да мне это надо не для сайта в интернете, а для автономной страницы. Пусть будет не audio controls, а простая обычная кнопка.
|
III, на локальной странице в FF ты точно также можешь разрешить автовоспроизведение. В хроме увы нет.
Простая обычная кнопка кликается button.click(). Но аудио это тебе не воспроизведёт.:) |
Спасибо, всё стало понятно. Значит программное нажатие на кнопку тут не сработает.
|
Снова здравствуйте. Хотелось бы уточнить ещё такой вопрос по этой теме.
Речь опять же об автономной форме. Если сделать дополнительно страницу HTML в папке где основная страница, поместить туда кнопку, которая будет перенаправлять на основную страницу, примерно так
<button id="button">
<i class="fas fa-volume-up"></i>
</button>
<button onclick="window.open('ДР.html','_self');">
. В этой новой странице, от этой же кнопки включается музыка. Всё остальное выполняется на основной странице. Такой вариант возможен? Если да, то подскажите скрипт как это сделать.Всем спасибо. |
По сути, единственное, что требуется от пользователя - кликнуть по странице, чтобы разрешить проигрывать аудио.
Если очень хочется запустить медиа на странице, то почему не сделать как-то так?
<style>
.overlay {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, .7);
z-index: 1;
}
</style>
<div class="overlay">
<button type="button" disabled>
Loading...
</button>
</div>
<button type="button" data-role="play-pause-button">
Pause
</button>
<script>
document.addEventListener('DOMContentLoaded', () => {
const audio = new Audio();
const play = () => {
audio.play().catch(e => {
alert(e.message);
});
};
audio.addEventListener('canplaythrough', () => {
const button = document.querySelector('.overlay button');
if (!button) {
return;
}
button.textContent = 'Start';
button.disabled = false;
button.addEventListener('click', () => {
document.querySelector('.overlay')?.remove();
audio.muted = false;
audio.loop = true;
audio.volume = 1;// 0..1
play();
}, {once: true});
});
audio.addEventListener('error', () => {
alert(audio.error?.message ?? 'Something went wrong');
});
audio.src = 'https://mp3bob.ru/download/muz/Rick_Astley_-_Never_Gonna_Give_You_Up_[www.mp3pulse.ru].mp3';
document.querySelector('[data-role="play-pause-button"]')?.addEventListener('click', e => {
const button = e.target;
if (audio.paused) {
button.textContent = 'Pause';
play();
} else {
button.textContent = 'Play';
audio.pause();
}
});
});
</script>
|
Это практически тоже самое, что и нажать кнопку на audio controls. Мне надо, чтобы пользователь нажал один раз где-нибудь кнопку в результате всё заработало, страница открылась, музыка играет и все действия на странице выполняются согласно сценария. У меня страница сделана пипа открытки, хочется сделать так, чтобы пользователь не делал лишних манипуляций. Важно чтобы воспроизведение музыку начиналась сразу после открытия страницы.
|
Что-то я не догоняю, в чем разница между кнопкой на целевой странице и кнопкой на первой странице, которая будет открывать вторую?
Что там кнопка, что там. Единственное отличие в том, что первый вариант позволит проигрывать аудио, а второй - нет. В любом случае, ваша задача не решаема способом, на котором вы настаиваете. |
Я рассчитывал на тот вариант, что если автоплей сейчас в браузерах отключен и воспроизведение звука можно включить только после нажатия на кнопку или какого-то иного действия на странице, то сделав дополнительную страницу (назовём Старт), включаю на ней нажатием кнопки воспроизведение звука и этой же кнопкой делаю переадресацию для открытия в другой вкладке, второй страницы (назовём её ДР). Естественно открыты две страницы, за счет первой происходит воспроизведение звука, а вторая (др), она после переадресации отображена на экране и отображает выполнение сценария. После того как отключили автоплей, я находил в интернете вариант сайта где на странице была, точно не помню, толи кнопка толи ссылка, нажав на которую открывалась точно так же страница и начинала звучать фоновая музыка, при этом никаких дополнительных действии не производилось. Правда в тот момент я не разбирался, как это там всё работает.
|
III, если отойти от технической стороны вопроса, мне тоже не до конца понятел смысл с позиции дизайна Вашего приложения:
Первоначально Вас интересовал вариант с одной страницей без клика. Потом Вы допустили вариант со второй страницей, но с кликом на первой. При этом Вы игнорируете вариант с одной страницей, но с тем же кликом. Если это открытка, то почему просто не сделать оверлей с надписью "Показать открытку" или близкой по смыслу, скрывать его после нажатия, и показывать саму открытку вместе с аудиосопровождением? |
-Первоначально Вас интересовал вариант с одной страницей без клика. Если автоплей заблокирован, то этот вопрос отпадает.
-Потом Вы допустили вариант со второй страницей, но с кликом на первой. Уточняю, есть две страницы основная, там где выполняется основной сценарий, ДР. Вторая страница Старт, тут кнопка, которая запускает открытие ДР в другой вкладке и запускает воспроизведение звука на странице Старт. Это основной вариант для обсуждения. - При этом Вы игнорируете вариант с одной страницей, но с тем же кликом. Этот вариант отбрасываем т.к. у меня и так на странице есть <audio controls class="muz"> <source src="music/1.mp3" type="audio/ogg" />. Его я хочу убрать, т.к. хочу чтобы аудио начиналось с момента открытия страницы, потому что весь сценарий привязок к музыке. И чем вариант с кнопкой отличается от того что у меня на данный момент есть? Имеется ввиду вариант с одной страницей. Хочу сделать так, чтобы человек открыл страницу которую я ему скажу, увидел "нажми меня" и всё заработало, как задумал автор. Проблема в том что я мало смыслю в скриптах и не знаю решаема ли моя задумка. Пока сделал так. Переадресацию для открытия в новой вкладке осуществляю так <button onclick=" myFunc()"> open in a new tab</button>
function myFunc(){
window.open("ДР.html");
}
надо теперь для этой кнопки назначить запуск музыки на странице Старт. Вариант моей страницы во вложении. Всем спасибо за участие. Жду новые варианты если моя хотелка осуществима. |
Цитата:
Тем, что на кнопке вместо "нажми меня" написано "Start", а под оверлеем вместо открытки кнопка управляющая воспроизведением музыки? |
Уважаемый Nexus, Вы наверное не понимаете суть моей проблемы, ну или скажем хотелки. Необходимо при открытии страницы "ДР", одновременное начало анимации и включения аудио. В Вашем же варианте, пока не нажмёшь на кнопку аудио не воспроизводится. У меня и так на странице "ДР" есть кнопка начала воспроизведения музыки.
Откройте моё вложение и убедитесь. Почему предлагал две страницы? На странице "Старт" кнопка которая должна делать переадресацию на открытие "ДР" в новой вкладке и включать аудио для воспроизведения аудио на странице "Старт". Для примера, если в интернете открыть две страницы на одной из которых воспроизводится аудио, а на другой нет, то при переключении страниц фоновая музыка всё рано звучит. Вот этот вариант я и хочу использовать. Как сделать переадресацию я знаю, а вот как к этой же кнопки прикрутить включение аудио сразу после переадресации, не знаю. Может быть такой возможности нет? Ваш вариант с кнопкой с кусочком из моей открытку во вложении. |
III, судя по тому что я увидел, вы с кодом даже не на "вы", а по "фамилии/отчеству".
Глядите, что у меня получилось поправив синтаксические ошибки в html и css и запустив ваш код после нажатия на кнопку "Нажми меня": *!* АХТУНГ: звук НЕВОЗМОЖНО отключить до перезагрузки страницы! */!*
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Андрюха день рождения</title>
<style>
.container {
width: 100%;
margin: 0 auto;
max-width: 1064px;
}
.image-stack::after {
content: ' ';
display: table;
clear: both;
}
.overlay {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
display: flex;
align-items: center;
justify-content: center;
background: #fff;
z-index: 10;
}
@supports (display: grid) {
.image-stack {
display: grid;
position: relative; // необходимо, чтобы перекрытие работало
grid-template-columns: repeat(12, 1fr);
}
#test {
float: left;
z-index: 5;
}
.voda {
float: left;
z-index: 1; // говорит браузеру сделать это изображение сверху
}
.prud {
float: left;
z-index: 1; // говорит браузеру сделать это изображение сверху
}
.voda {
width: 1064px;
height: 310px;
grid-column: 4 / -1;
grid-row: 1;
margin-top: 20em;
margin-left: 0em;
}
.prud {
grid-column: 4 / -1;
grid-row: 1;
margin-top: 6.2em;
margin-left: 0em;
}
#test {
width: 32vw;
height: 25vw;
position: absolute;
top: 0;
left: -19em;
top: 4em;
right: 0;
margin: auto;
text-align: left;
color: white;
font: 500 30px/1.5 'Syncopate', sans-serif;
font-style: italic;
text-shadow:
0 1px 0 #ccc,
0 2px 0 #c9c9c9,
0 3px 0 #bbb,
0 4px 0 #b9b9b9,
0 5px 0 #aaa,
0 6px 1px rgba(0, 0, 0, 0.10),
0 0px 5px rgba(0, 0, 0, 0.10),
0 1px 3px rgba(0, 0, 0, 0.30),
0 3px 5px rgba(0, 0, 0, 0.20),
0 5px 10px rgba(0, 0, 0, 0.25),
0 10px 10px rgba(0, 0, 0, 0.20),
0 20px 20px rgba(0, 0, 0, 0.15);
font-size: 2vw;
}
}
</style>
</head>
<body>
<div class="overlay">
<button type="button" disabled>
Загрузка...
</button>
</div>
<div class="container">
<div class="image-stack">
<img class="voda" src="pictures/Вода.gif" alt="" />
<img class="prud" src="pictures/Пруд.png" alt="" />
<div id="test">
С днём рождения, Андрюха !<br>
Дорогой наш рыбачок,<br>
Пусть всегда, без промедления,<br>
Рыбка дёргает крючок.<br>
Чтобы ты её, родную, <br>
Не ждал полдня на берегу, <br>
А ловил её большую, <br>
В море, в речке и в пруду ! <br>
</div>
</div>
</div>
<script>
const MP3_URL = 'https://mp3bob.ru/download/muz/Rick_Astley_-_Never_Gonna_Give_You_Up_[www.mp3pulse.ru].mp3';
document.addEventListener('DOMContentLoaded', () => {
// Для печати стихотворения
const printText = () => {
var textNodes = [];
var textNodes_data = [];
var i = 0;
function search_textNodes(b) {
b = b.childNodes;
for (var c = 0, d = b.length; c < d; c++) {
var a = b[c];
if (a.nodeType == 3) {
textNodes.push(a);
textNodes_data.push(a.data);
a.data = ""
} else a.hasChildNodes() && search_textNodes(a)
}
};
var d = document.getElementById('test');
search_textNodes(d);
(function() {
var a = textNodes_data[i];
if (a) {
textNodes[i].data += a.charAt(0);
textNodes_data[i] = a.substr(1)
} else i++;
i < textNodes.length && setTimeout(arguments.callee, 160)
})();
}
// Загрузка аудио и начало работы
const audio = new Audio();
const play = () => {
audio.play().catch(e => {
alert(e.message);
});
};
audio.addEventListener('canplaythrough', () => {
const button = document.querySelector('.overlay button');
if (!button) {
return;
}
button.textContent = 'Нажми на меня';
button.disabled = false;
button.addEventListener('click', () => {
document.querySelector('.overlay')?.remove();
audio.muted = false;
audio.loop = true;
audio.volume = 1; // 0..1
play();
printText();
}, {
once: true
});
});
audio.addEventListener('error', () => {
alert(audio.error?.message ?? 'Something went wrong');
});
audio.src = MP3_URL;
});
</script>
</body>
</html>
UPD. хотел вкорячить сюда еще и подключенные графические файлы как base64, но они слишком тяжелые, так что превью обойдется без них. |
Nexus, спасибо за участие в моей проблеме. Насчет кода, честно говоря, я почти профан, это всё заслуги участников форумов и полученные знания из разных источников в инете, я просто с миру по нитке и из этих ниток что-то тку. Сейчас занят, а завтра отвечу на ваше сообщение. Всего Вам хорошего.
|
Вложений: 1
Nexus, ещё раз спасибо за рекомендации. Всё супер! Ваш вариант, я так понял, с блокировкой страницы, придумано отлично. Вот только плохо, что аудио зациклено. У меня аудио длится 3 минуты 15 сек. Если бы его отключить каким-то образом через это время или опять поставить блокировку на страницу или перезагрузить страницу, не знаю что лучше, то было бы вообще класс. Во вложении полный вариант того что у меня в итоге получилось. Спасибо большое за участие.
|
III,
Цитата:
audio.loop = true; и замените её на audio.loop = false; У меня в примере это строка 195 |
Nexus, всё получилось как хотелось. Огромное спасибо. Уже пора присваивать статус не профессор а академик. Благодарю за терпеливое отношение к моей особе. Подарочек к 70-летию моего младшего дружка-рыбачка, я думаю будет неплохой. Долгих лет вам и крепкого здоровья.
|
| Часовой пояс GMT +3, время: 04:41. |