angular - 单击Angular中的另一个音频标签时如何暂停HTML5音频标签?
问题描述
如果播放另一个音频,我想暂停播放音频。我有这个
<ul class="music-list">
<li *ngFor="let song of Songs">
<div class="music-panel">
<div class="music-image">
<img src="{{ song.song_image }}" alt="music-img">
</div>
<div class="music-detail">
<span class="date-remind">Season 1 / 10 September 2018</span>
<h4>{{ song.song_title | titlecase }}</h4>
<div class="music-play">
<audio controls>
<source src="{{ song.audio_file }}" type="audio/mpeg">
</audio>
</div>
</div>
</div>
</li>
</ul>
请帮忙。谢谢
解决方案
您需要获取视图中所有元素的引用,然后循环向它们抛出运行暂停方法
@ViewChildren('audio') audioElms :ElementRef[];
现在在模板上绑定音频播放事件的方法
<audio controls #audio (play)="paly(audio)">
<source src="{{ song.audio_file }}" type="audio/mpeg">
</audio>
播放方法将循环抛出音频元素并暂停
onPaly(elm:HTMLAudioElement) {
this.audioElms.forEach(({nativeElement:e})=>{
if (e !== elm) {
e.pause();
}
})
}
查看完整的演示 演示
更新以获得更好的性能
如果我们每次都有很多元素保持循环通过主题只是暂停之一是一种低性能的方式。
简单地说,我们将保存当前播放的音频元素的引用,并在播放另一个元素时停止
private currentPlayedElem: HTMLAudioElement = null;
onPaly(elm: HTMLAudioElement) {
if (this.currentPlayedElem && this.currentPlayedElem !== elm ) {
this.currentPlayedElem.pause();
}
this.currentPlayedElem = elm;
}
推荐阅读
- html - 如何使用一个导航文件
- ios - 如何在 ios UITextfield 中显示完整的占位符文本?
- google-cloud-composer - 无法在 Cloud Composer 中安装 PyPi 包
- java - Appium driver.currentActivity() 导致 java.net.SocketException
- sql - 将 STUFF 与 DATE 一起使用
- c - 理解同一范围内的声明
- angular - 如何使用 Jasmine 测试多个顺序调用
- javascript - Dom 使用 JavaScript 遍历 Dom 但事件未命中 Html 元素
- html - 粗体标签打破了 div?
- xml - 仅保留列入白名单的元素和/或属性