javascript - hur man bryter instansen av föregående låt?


Jag gör en ljudspelare i reactjs som ser ut så här

, låd-uppspelningen renderas i map-funktionen och när man klickar på någon lådlåda börjar den spelas, men problemet är att när man klickar på nästa låt för att byta spår ändras ljudets src-värde men den tidigare låten slutade inte spela,

någon hjälp?

function playMusic(audio: HTMLAudioElement) {}

function handleMusicPlayer(index: number) {

    let audio = new Audio(props.musicData[index].track.preview_url);
    audio.play();
    playMusic(audio);

    if (musicMinimize) {
        props.onPlay(false);
        setmusicMinimize(false);
        setTimeout(() => {
            setmusicMinimize(true);
            props.onPlay(true);
        }, 1000);
    } else {
        props.onPlay(false);
        setmusicMinimize(true);
    }
    
    props.onCurrent({
        image: props.musicData[index].track.album.images[0].url,
        name: props.musicData[index].track.name,
        track: props.musicData[index].track.preview_url
    });

}

funktionen handleMusicPlayer ska köras när lådboxen klickas, och funktionen playMusic ska kontrollera uppspelningen av nuvarande och nästa låt

Svar #1

Du kan lösa det genom att stoppa all ljud på den sidan innan du startar ett nytt:

Här är ett exempel;

const player = document.getElementById('player');
player.addEventListener('click', (event) => {
var myId    = event.target.getAttribute('href');
var audio   = document.getElementById(myId);
document.querySelectorAll('audio').forEach(sound => {
sound.pause();
});
audio.play();
})
<audio id="myAudio" src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"></audio>
<audio id="myAudiotwo" src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3"></audio>


<p>Click the buttons to play or pause the audio.</p>
<div id='player'>
<button  href="myAudio" type="button">Play Audio</button>
<button  href="myAudiotwo" type="button">Play Audio</button>
</div>

Svar #2

const ref = useRef(new Audio());

ref.current.pause()

ref.current = new Audio("new_song");

ref.current.play()