Как остановить предыдущий звук, который был вызван тем же нажатием клавиши? - PullRequest
1 голос
/ 13 июля 2020

Вот полный код

<!DOCTYPE html>

<html>
    <head>
        <title>My drums</title>
        <style>
            .container {
                background-color: green;
                    display: flex;
                justify-content: center;
                    align-items: center;
                        height: 100vh;
            }

            * {
                box-sizing: border-box;
                margin: 0;
                padding: 0;
            }

            .button {
                background-color: aqua;
                border: 5px solid black;
                padding: 1rem 3rem;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
                align-items: center;
            }

            .button.selected {
                transform: scale(1.2);
                border-color: yellow;
            }
        </style>
    </head>

    <body>
        <div class='container'>
            
        </div>

        <script>
            const buttons = [
                { letter: 'A', effect: 'CLAP', key:'KeyA', audio: 'clap' },
                { letter: 'S', effect: 'HIHAT', key:'KeyS', audio: 'hihat' },
                { letter: 'D', effect: 'KICK', key:'KeyD', audio: 'boom'},
                { letter: 'F', effect: 'OPENHAT', key:'KeyF', audio: 'kick' },
                { letter: 'G', effect: 'BOOM', key:'KeyG', audio: 'openhat' },
                { letter: 'H', effect: 'RIDE', key:'KeyH', audio: 'ride' },
                { letter: 'J', effect: 'SNARE', key:'KeyJ', audio: 'snare' },
                { letter: 'K', effect: 'TOM', key:'KeyK', audio: 'tink'},
                { letter: 'L', effect: 'TIM', key:'KeyL', audio: 'tom' }
            ];

            let container = '';

            buttons.forEach(item => {
                container += `
                    <div class="button" data-key=${item['key']}>
                        <h3>${item['letter']}</h3>
                        <p>${item['effect']}</p>
                    </div>

                    <audio src="sounds/${item['audio']}.wav" data-key=${item['key']}></audio>
                `;
            });

            

            document.querySelector('.container').innerHTML = container;

            window.addEventListener('keydown', e => {

                const audio = document.querySelector(`div[data-key="${e.code}"]`);
                if (!audio) return;
                audio.className += ' selected';

                playable = document.querySelector(`audio[data-key="${e.code}"]`);
                if (playable) playable.play();
            });

            window.addEventListener('keyup', e => {
                const audio = document.querySelector(`div[data-key="${e.code}"]`);
                if (!audio) return;
                audio.className = 'button';
            })
        </script>
    </body>
</html>

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

Я пробовал делать sound.pause() на keyup, но он немедленно отключает звук, когда я отпускаю клавишу. Я не хочу этого.

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