多个音频html:当前播放时自动停止其他

Posted

技术标签:

【中文标题】多个音频html:当前播放时自动停止其他【英文标题】:multiple audio html : auto stop other when current is playing 【发布时间】:2020-12-04 20:23:54 【问题描述】:

我在一个页面上有 2 个音频实例。处理音频播放和暂停不是问题。问题是当音频正在播放并且我点击另一个播放时,我无法让另一个音频实例停止播放图标修改

任何帮助将不胜感激:)谢谢

$('section .play').click(function()
    var $this = $(this);

    // starting audio
    var audioID = "sound" + $(this).attr('id');

    $this.toggleClass('active');
    if($this.hasClass('active'))
        $("#" + audioID).trigger('play');       

     else 
        $("#" + audioID).trigger('pause');
      
    
);
section 
    display: block;
    margin-bottom: 30px;
    padding: 0 20px;
    text-align: center;
    width: 200px;
    height: 200px;
    position: relative;

 
 section .btn 
    background: #ccc;
border: 0 none;
cursor: pointer;
display: block;
height: 60px;
line-height: 60px;
position: absolute;
width: 200px;
z-index: 100;
bottom: 0;
text-align: center;
 
  section .btn:after 
    content: "play";
    
 

section .btn.active:after 
    content: "pause";
    
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section><img src="https://unsplash.it/g/300?image=29"   />
<p class="play btn" id="7"></p>
<p><audio id="sound7">
<source src="https://room1015.com/img/cms/MP3/Hanging-out-in-room-1015.mp3" type="audio/mpeg" />
</audio></p>
</section>
<section><img src="https://unsplash.it/g/300?image=29"   />
<p class="play btn" id="6"></p>
<p><audio id="sound6">
    <source src="https://room1015.com/img/cms/MP3/HOLLYROSE.mp3" type="audio/mpeg" />
</audio></p>
</section>

【问题讨论】:

【参考方案1】:

我会遍历每个.play 按钮并检测音频何时暂停(或停止),如果是,则暂停/停止正在播放的所有可能音频,然后开始播放与按下的play 按钮匹配的音频。

有了这个,您将不需要 ID,因此您的 html 将不那么混乱。

此解决方案适用于页面中任意数量的音频

注意 - 我还添加了一个 Pure JS 解决方案。

//pure JS Version

const playButton = document.querySelectorAll('section .play')

playButton.forEach(el => 
  const currentAudio = el.nextElementSibling.querySelector('audio')

  el.addEventListener('click', e => 
    if (currentAudio.paused) 
      document.querySelectorAll('audio').forEach(el => el.pause())
      currentAudio.play()
      playButton.forEach(el => el.classList.remove('active'))
      e.currentTarget.classList.add('active')
     else 
      e.currentTarget.classList.remove('active')
      currentAudio.pause()
    
  )
)

//jQuery Version
//const playButton = $('section .play')

//playButton.each((_, el) => 
//  const currentAudio = $(el).next().find('audio')[0]

//  $(el).on('click', e => 
//    if (currentAudio.paused) 
//    $('audio').each((_, el) => el.pause())
//      currentAudio.play()
//      playButton.removeClass('active')
//      $(e.currentTarget).addClass('active')
//    
//    else 
//        e.currentTarget.classList.remove('active')
//        currentAudioJs.pause()
//     
//  )
//)
section 
  display: block;
  margin-bottom: 30px;
  padding: 0 20px;
  text-align: center;
  width: 200px;
  height: 200px;
  position: relative;


section .btn 
  background: #ccc;
  border: 0 none;
  cursor: pointer;
  display: block;
  height: 60px;
  line-height: 60px;
  position: absolute;
  width: 200px;
  z-index: 100;
  bottom: 0;
  text-align: center;


section .btn:after 
  content: "play";


section .btn.active:after 
  content: "pause";
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section>
  <img src="https://unsplash.it/g/300?image=29"   />
  <p class="play btn"></p>
  <p>
    <audio>
      <source src="https://room1015.com/img/cms/MP3/Hanging-out-in-room-1015.mp3" type="audio/mpeg" />
    </audio>
  </p>
</section>
<section>
  <img src="https://unsplash.it/g/300?image=29"   />
  <p class="play btn"></p>
  <p>
    <audio>
      <source src="https://room1015.com/img/cms/MP3/HOLLYROSE.mp3" type="audio/mpeg" />
</audio>
  </p>
</section>

【讨论】:

以上是关于多个音频html:当前播放时自动停止其他的主要内容,如果未能解决你的问题,请参考以下文章

多个 HTML5 音频播放器。单击另一个音频实例时停止播放其他音频实例

正在播放当前音频以及如何在单击同一按钮时暂停所有其他音频

如何停止使用 jQuery 播放其他音频元素

在Android中,当我播放音频并转到其他活动时,音频回来后不会停止

Javascript 音频不会停止并同时播放多个音轨

如何禁用音频(流)html5元素的自动播放