W. connoisseurs! In front of me, the problem of realizing the playback of the track list on a click became unbreakable. Immediately make a reservation - I'm new, therefore, do not be surprised at my possible crutches.
I spent a huge amount of time on what would have been done so that when I clicked on any track link, the playing track would stop and immediately launch the one that was clicked. Alas, I did not succeed. At this stage, I need to first stop the current track and only then I can start any other. I hope to help the enlightened in this matter. Here is my code:

var musicLinksArr = [ "https://api.soundcloud.com/tracks/316952238/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952236/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952235/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952230/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952227/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952225/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952223/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175412/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175410/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175407/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175405/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175403/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175399/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175395/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb" ]; var musicStream = new Audio(); $(".tracks-list ul li div a").on("click", function() { var selectorId = this.id; var numberFilter = /\d+/g; var trackIndex = selectorId.match(numberFilter); if (musicStream.paused === true) { let currentTrack = trackIndex; musicStream.src = musicLinksArr[currentTrack]; musicStream.play(); } else { musicStream.pause(); } }); 
 li { list-style-type: none; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="tracks-list"> <ul> <li> <div> <a href="#n0" class="track" id="musicPlay0">From Sorrow To Joy</a> </div> </li> <li> <div> <a href="#n1" class="track" id="musicPlay1">Higfly</a> </div> </li> <li> <div> <a href="#n2" class="track" id="musicPlay2">Not Forget</a> </div> </li> <li> <div> <a href="#n3" class="track" id="musicPlay3">Fall Of Phaeton</a> </div> </li> <li> <div> <a href="#n4" class="track" id="musicPlay4">Prevaling Sense</a> </div> </li> <li> <div> <a href="#n5" class="track" id="musicPlay5">Tender Sense</a> </div> </li> <li> <div> <a href="#n6" class="track" id="musicPlay6">Desperate Sense</a> </div> </li> </ul> </div> 

A link to Peng with this example: https://codepen.io/Metalspell/pen/rojroO

  • one
    Frankly speaking, I didn’t really understand what it means with the ability to stop / restart the player’s play / stop and simultaneously start a new track ? And most importantly, should there be a case of simultaneous playback of more than one track? If not, then it’s better to use only one audio element on the page, and when clicking on the corresponding track, just set a new src for it and start it again. If you are interested in this option, I can write in the answer. - Oleg
  • I will try to explain in more detail. The ability to simultaneously play more than one track is excluded. It is assumed that one track can be launched by clicking and its stop by repeated clicking on it. When playing a specific track, when you click on another, the current playback should stop, and the track on which the click is made to start. - Dmitry Borgir
  • With great pleasure I would have looked at the implementation you proposed. - Dmitry Borgir

2 answers 2

Do not use the <a></a> tag anywhere and how horrible. This is a link and use it as a link.

Sorry I do not like JQ , the answer is in the usual JS .

Further in the comments in the code I will describe what's what.

 //======добавляСм удаляСм класс Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ³Ρ€Π°Π΅Ρ‚ == Π½Π°Ρ‡Π°Π»ΠΎ function changeClass(elem) { return elem.classList.contains('active') ? elem.classList.remove('active') : elem.classList.add('active'); } function removeClass(elem) { for (let index of elem) { index.classList.remove('active') } } //================= ΠΊΠΎΠ½Π΅Ρ† =================== var musicLinksArr = [ "https://api.soundcloud.com/tracks/316952238/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952236/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952235/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952230/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952227/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952225/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/316952223/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175412/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175410/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175407/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175405/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175403/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175399/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb", "https://api.soundcloud.com/tracks/344175395/stream?client_id=LvWovRaJZlWCHql0bISuum8Bd2KX79mb" ]; const musicStream = new Audio(); // ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΡƒΡ‡Ρƒ элСмСнтов Π² html, Π° просто // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. let elem = document.createElement('li'); // На основС количСства Ρ‚Ρ€Π΅ΠΊΠΊΠΎΠ² (массив musicLinksArr) // ΠΌΡ‹ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΡ‚ самый созданный элСмСнт (elem) musicLinksArr.forEach((s, i) => { let trecks = elem.cloneNode(true); trecks.classList.add('trecks'); trecks.innerHTML = 'Trecks' + i; document.querySelector('.tracks-list ul').appendChild(trecks); }) const button = document.querySelectorAll('button'); const li = document.querySelectorAll('li'); li.forEach((s, i) => { s.addEventListener('click', () => { if (musicStream.src !== musicLinksArr[i] && musicStream.paused) { // условиС Ссли Π΄ΠΎΡ€ΠΎΠΆΠΊΠΈ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΈ ΠΌΡƒΠ· Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ===== musicStream.src = musicLinksArr[i]; musicStream.play(); changeClass(s); console.log('ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·'); //=========================================== } else if (musicStream.src === musicLinksArr[i] && !musicStream.paused) { // условиС, Ссли Π΄ΠΎΡ€ΠΎΠΆΠΊΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΈ ΠΌΡƒΠ· ΠΈΠ³Ρ€Π°Π΅Ρ‚ ===== musicStream.pause(); changeClass(s) console.log('ΠŸΠ°ΡƒΠ·Π°'); //=========================================== } else if (musicStream.src === musicLinksArr[i] && musicStream.paused) { // условиС, Ссли Π΄ΠΎΡ€ΠΎΠΆΠΊΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΈ ΠΌΡƒΠ· Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ===== musicStream.play(); changeClass(s) console.log('ПослС ΠΏΠ°ΡƒΠ·Ρ‹'); //=========================================== } else if (musicStream.src !== musicLinksArr[i] && !musicStream.paused) { // условиС, Ссли Π΄ΠΎΡ€ΠΎΠΆΠΊΠΈ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΈ ΠΌΡƒΠ· ΠΈΠ³Ρ€Π°Π΅Ρ‚ ===== removeClass(li); musicStream.src = musicLinksArr[i]; musicStream.play(); changeClass(s) console.log('Новый Ρ‚Ρ€Π΅ΠΊ'); //=========================================== } }) }) 
 .tracks { background-color: grey; margin: 5px; padding: 5px; cursor: pointer; } .active { background-color: brown; } 
 <div class="tracks-list"> <ul></ul> </div> 

  • @Arthur, Thank you ... - Air
  • always please) - Arthur
  • Thank you for your attention. Having looked through your code, I, alas, did not understand how I could finish it, so that I could stop playing (stop / pause) Regarding the link tag - I’ll take into account) - Dmitry Borghir
  • You explain how you want to turn off or pause ... - Air
  • Clarify - turn off - Dmitri Borgir

An implementation with one audio element:

 <style> li:hover{ width: 100px; background: gold; cursor: pointer; } </style> <audio id=audio src="sound1.mp3" controls></audio> <ul> <li id="sound1.mp3">sound1</li> <li id="sound2.mp3">sound2</li> <li id="sound3.mp3">sound3</li> <li id="sound4.mp3">sound4</li> <li id="sound5.mp3">sound5</li> </ul> <script> var last = ""; var alles_li = document.getElementsByTagName("li"); for(var i = 0; i < alles_li.length; i++){ alles_li[i].onclick = function(){ if(this.id != last)audio.src = last = this.id; if(audio.paused){audio.play()}else{audio.pause()}; } } </script> 

  • My code does not function at all. - Dmitri Borgir
  • I drove this option to the hosting, here is the link On the example of sonnd2, you can see how it works. If everything was normal, there should be no problems with this code, but apparently some unstable browsers have gone now, and besides the lack of autoplay, there is still a plug-in audio file found out, in other cases there is no unknown reason. - Oleg
  • Therefore, sound1, 3 and 4 cause an error Uncaught (in promise) DOMException: despite the fact that there is no error in the code, and all the audio files are complete. At the same time, on LAN, it all works fine for me. - Oleg