Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Имитация нажатия на кнопку в audio controls. (https://javascript.ru/forum/misc/85782-imitaciya-nazhatiya-na-knopku-v-audio-controls.html)

III 03.03.2024 11:05

Имитация нажатия на кнопку в audio controls.
 
Всем привет. Есть audio controls для воспроизведения музыки.
<audio controls class="muz">
  <source src="music/1.mp3" type="audio/ogg" />

Есть ли возможность с помощью JS имитировать нажатие на кнопку для начала воспроизведения музыки сразу после загрузки страницы? Знаю раньше была такая возможность, сейчас в браузере это отменили. Обойти этот запрет можно?
Всем спасибо за участие.

ksa 03.03.2024 13:33

Цитата:

Сообщение от III
сейчас в браузере это отменили. Обойти этот запрет можно?

Нет.
Вам дай волю - вы достанете этими звуками и видосами...

Aetae 03.03.2024 16:13

Юзер если захочет может разрешить автозапуск для твоего сайта(слева у адресной строки кнопочка). А если не захочет - то и не надо.

III 03.03.2024 17:52

Да мне это надо не для сайта в интернете, а для автономной страницы. Пусть будет не audio controls, а простая обычная кнопка.

Aetae 03.03.2024 20:31

III, на локальной странице в FF ты точно также можешь разрешить автовоспроизведение. В хроме увы нет.

Простая обычная кнопка кликается button.click(). Но аудио это тебе не воспроизведёт.:)

III 04.03.2024 14:48

Спасибо, всё стало понятно. Значит программное нажатие на кнопку тут не сработает.

III 04.03.2024 17:55

Снова здравствуйте. Хотелось бы уточнить ещё такой вопрос по этой теме.
Речь опять же об автономной форме. Если сделать дополнительно страницу HTML в папке где основная страница, поместить туда кнопку, которая будет перенаправлять на основную страницу, примерно так
<button id="button">
  <i class="fas fa-volume-up"></i>
</button>
<button onclick="window.open('ДР.html','_self');">
. В этой новой странице, от этой же кнопки включается музыка. Всё остальное выполняется на основной странице. Такой вариант возможен? Если да, то подскажите скрипт как это сделать.
Всем спасибо.

Nexus 04.03.2024 21:17

По сути, единственное, что требуется от пользователя - кликнуть по странице, чтобы разрешить проигрывать аудио.
Если очень хочется запустить медиа на странице, то почему не сделать как-то так?

<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>

III 04.03.2024 23:01

Это практически тоже самое, что и нажать кнопку на audio controls. Мне надо, чтобы пользователь нажал один раз где-нибудь кнопку в результате всё заработало, страница открылась, музыка играет и все действия на странице выполняются согласно сценария. У меня страница сделана пипа открытки, хочется сделать так, чтобы пользователь не делал лишних манипуляций. Важно чтобы воспроизведение музыку начиналась сразу после открытия страницы.

Nexus 05.03.2024 00:01

Что-то я не догоняю, в чем разница между кнопкой на целевой странице и кнопкой на первой странице, которая будет открывать вторую?
Что там кнопка, что там. Единственное отличие в том, что первый вариант позволит проигрывать аудио, а второй - нет.

В любом случае, ваша задача не решаема способом, на котором вы настаиваете.

III 05.03.2024 08:46

Я рассчитывал на тот вариант, что если автоплей сейчас в браузерах отключен и воспроизведение звука можно включить только после нажатия на кнопку или какого-то иного действия на странице, то сделав дополнительную страницу (назовём Старт), включаю на ней нажатием кнопки воспроизведение звука и этой же кнопкой делаю переадресацию для открытия в другой вкладке, второй страницы (назовём её ДР). Естественно открыты две страницы, за счет первой происходит воспроизведение звука, а вторая (др), она после переадресации отображена на экране и отображает выполнение сценария. После того как отключили автоплей, я находил в интернете вариант сайта где на странице была, точно не помню, толи кнопка толи ссылка, нажав на которую открывалась точно так же страница и начинала звучать фоновая музыка, при этом никаких дополнительных действии не производилось. Правда в тот момент я не разбирался, как это там всё работает.

roland 05.03.2024 09:02

III, если отойти от технической стороны вопроса, мне тоже не до конца понятел смысл с позиции дизайна Вашего приложения:

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

Если это открытка, то почему просто не сделать оверлей с надписью "Показать открытку" или близкой по смыслу, скрывать его после нажатия, и показывать саму открытку вместе с аудиосопровождением?

III 05.03.2024 10:45

-Первоначально Вас интересовал вариант с одной страницей без клика. Если автоплей заблокирован, то этот вопрос отпадает.
-Потом Вы допустили вариант со второй страницей, но с кликом на первой. Уточняю, есть две страницы основная, там где выполняется основной сценарий, ДР. Вторая страница Старт, тут кнопка, которая запускает открытие ДР в другой вкладке и запускает воспроизведение звука на странице Старт. Это основной вариант для обсуждения.
- При этом Вы игнорируете вариант с одной страницей, но с тем же кликом.
Этот вариант отбрасываем т.к. у меня и так на странице есть
<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");
   }

надо теперь для этой кнопки назначить запуск музыки на странице Старт.
Вариант моей страницы во вложении.
Всем спасибо за участие. Жду новые варианты если моя хотелка осуществима.

Nexus 05.03.2024 15:14

Цитата:

Сообщение от III
Хочу сделать так, чтобы человек открыл страницу которую я ему скажу,
увидел "нажми меня" и всё заработало, как задумал автор.

И чем это отличается от предложенного мною варианта?
Тем, что на кнопке вместо "нажми меня" написано "Start", а под оверлеем вместо открытки кнопка управляющая воспроизведением музыки?

III 05.03.2024 17:42

Уважаемый Nexus, Вы наверное не понимаете суть моей проблемы, ну или скажем хотелки. Необходимо при открытии страницы "ДР", одновременное начало анимации и включения аудио. В Вашем же варианте, пока не нажмёшь на кнопку аудио не воспроизводится. У меня и так на странице "ДР" есть кнопка начала воспроизведения музыки.
Откройте моё вложение и убедитесь. Почему предлагал две страницы? На странице "Старт" кнопка которая должна делать переадресацию на открытие "ДР" в новой вкладке и включать аудио для воспроизведения аудио на странице "Старт". Для примера, если в интернете открыть две страницы на одной из которых воспроизводится аудио, а на другой нет, то при переключении страниц фоновая музыка всё рано звучит. Вот этот вариант я и хочу использовать. Как сделать переадресацию я знаю, а вот как к этой же кнопки прикрутить включение аудио сразу после переадресации, не знаю. Может быть такой возможности нет? Ваш вариант с кнопкой с кусочком из моей открытку во вложении.

Nexus 05.03.2024 18:47

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, но они слишком тяжелые, так что превью обойдется без них.

III 05.03.2024 19:50

Nexus, спасибо за участие в моей проблеме. Насчет кода, честно говоря, я почти профан, это всё заслуги участников форумов и полученные знания из разных источников в инете, я просто с миру по нитке и из этих ниток что-то тку. Сейчас занят, а завтра отвечу на ваше сообщение. Всего Вам хорошего.

III 06.03.2024 08:09

Вложений: 1
Nexus, ещё раз спасибо за рекомендации. Всё супер! Ваш вариант, я так понял, с блокировкой страницы, придумано отлично. Вот только плохо, что аудио зациклено. У меня аудио длится 3 минуты 15 сек. Если бы его отключить каким-то образом через это время или опять поставить блокировку на страницу или перезагрузить страницу, не знаю что лучше, то было бы вообще класс. Во вложении полный вариант того что у меня в итоге получилось. Спасибо большое за участие.

Nexus 06.03.2024 12:58

III,
Цитата:

Сообщение от III
Вот только плохо, что аудио зациклено.

найдите в скрипте строку
audio.loop = true;

и замените её на
audio.loop = false;


У меня в примере это строка 195

III 06.03.2024 14:50

Nexus, всё получилось как хотелось. Огромное спасибо. Уже пора присваивать статус не профессор а академик. Благодарю за терпеливое отношение к моей особе. Подарочек к 70-летию моего младшего дружка-рыбачка, я думаю будет неплохой. Долгих лет вам и крепкого здоровья.


Часовой пояс GMT +3, время: 14:43.