在包含多个音频文件的页面上获取当前播放的 <audio> 文件

Posted

技术标签:

【中文标题】在包含多个音频文件的页面上获取当前播放的 <audio> 文件【英文标题】:Get the currently played <audio> file on a page with multiple audio files 【发布时间】:2018-11-20 19:06:43 【问题描述】:

我在一个页面上有多个音频文件,我希望通过 JQuery 获取正在播放的音频文件。

这是我尝试过的,但它只得到第一个:

 var audio = document.querySelector('audio');
      audio.addEventListener('play', function()  
        console.log($(this));            
 );

我是否可以只获取当前正在播放的页面上的音频文件?

【问题讨论】:

【参考方案1】:

解决此问题的一种方法是查询文档中的所有音频元素,然后遍历这些元素以找到ispasued 不真实的第一个实例:

function getCurrentlyPlayingAudio() 

  for(const audio of document.querySelectorAll('audio')) 

    if(!audio.paused) 
      return audio;
     
    

  // return undefined if no such audio element found

本方案使用原生querySelectorAll()方法查询音频元素,因此不依赖jQuery。

要在音频元素开始播放后查询“当前正在播放的音频元素”,您可以按以下方式使用建议的方法:

document.querySelectorAll('audio').forEach(audio => 

    audio.addEventListener('play', () => 

        const currentPlaying = getCurrentlyPlayingAudio();
        console.log('current playing audio:', currentPlaying);
    );
);

【讨论】:

谢谢,很遗憾,当我播放音频时,此功能无法运行。我希望每次播放音频时都运行此功能,并且应该能够获得正在播放的 元素。 @Steve 不客气 - 只是扩展了答案。这有帮助吗? 谢谢。我也稍微改变了我原来的答案,并且奏效了。不过我接受你的回答。非常感谢。【参考方案2】:

谢谢,

我也稍微改变了我原来的答案,这很有效。

var audList = document.getElementsByTagName("audio");

      for (var i = 0; i < audList.length; i++) 
          audList[i].addEventListener("play", onPlay, false);
          audList[i].addEventListener("ended", onEnded, false);
      
      function onPlay(e) 
          console.log(e.target.id + " Well hello there!");
          console.log($(this));

      ;
      function onEnded(e) 
          console.log(e.target.id + " Left this audio.");
      ;

【讨论】:

以上是关于在包含多个音频文件的页面上获取当前播放的 <audio> 文件的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在不使用相同音频 ID 的情况下播放从数据库中获取的多个音频文件

如何在同一页面中播放多个音频文件?

使用当前音频 javascript 创建播放/暂停功能

多个音频,当当前正在使用 javascript 播放时自动停止其他

切换播放/暂停按钮(多个音频)