【问题标题】:Differentiate between audio start and audio play(after a pause) in HTML5 <audio>区分 HTML5 <audio> 中的音频开始和音频播放(暂停后)
【发布时间】:2020-02-18 10:32:09
【问题描述】:

如何在音频/视频开始时添加监听器?

我可以这样做:

$audio.on("play", function() {
    console.log("audio played");
});

其中 $audio 是代表单个 DOM 音频元素的 jQuery 对象。

但是当我们恢复视频时它也会运行。我希望它只在启动时运行。

我可以做到的一种方法是:

$audio.on("play", function() {
  if(this.currentTime === 0) {
      console.log("audio started);
  }
});

但是当我们开始播放/暂停音频时,它会运行多次。

有没有更好的方法来做到这一点?侦听器应仅在音频开始和音频重放时工作,当用户手动将搜索栏拖到源的开头时。

【问题讨论】:

  • var started=false; - 剩下的留给你自己计算
  • 您使用currentTime 的方法有效:jsfiddle.net/RoryMcCrossan/8g4sfj62 我不确定问题出在哪里。即使用户手动将音频跟踪到源的开头,您是否只想触发一次“开始”事件?
  • @freedomn-m 我可以在同一页面上拥有 n 个玩家。所以,不想维护这些变量。
  • @RoryMcCrossan 是的,它工作正常。我只是假设假设用户在一秒钟内多次单击播放/暂停。所以,我一直在寻找只在媒体启动而不是播放时才有效的东西。
  • @ankur_rajput 请-edit您的问题。试着清楚地说明你真正想要什么。目前看来你完全糊涂了。

标签: javascript jquery html html5-video html5-audio


【解决方案1】:

将标志存储到目标元素的data-* 属性中:

const $audio = $('.audio');
$audio.on("play", function() {
  
  if ($(this).data('once-played')) return; // Do nothing if data exists.
  
  // Your code here
  console.log("Audio started for the first time");

  // Finally, add a flag.
  $(this).data('once-played', true);
});
<audio class="audio" src="http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg" autoplay controls loop></audio>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • @ankur_rajput 完全正确。无论您播放/重播视频多少次,Console.log 都只会记录一次(好吧,除非您清楚地刷新页面) - 这完全基于您的问题:“但是当我们恢复时它也会运行视频。我希望它只在启动时运行"
  • 是的,但我希望它在每次视频开始/重播时都能正常工作。
  • @ankur_rajput 比if(this.currentTime === 0) { 有什么问题?你在你的问题中说“但是当我们开始播放/暂停视频时,这将运行多次” - 因此我的答案是它现在的样子。
  • 那么检查 currentTime == 0 not 到底有什么作用呢?开始然后立即暂停(所以 currentTime 仍然 = 0,这甚至可能吗?)和开始,看一点,倒带,然后重新开始有什么区别? 确切地您希望它何时触发以及确切地您不希望它何时触发?你的问题+cmets很困惑。
  • pause 上添加额外检查 - 如果 currentTime != 0 则 $(this).data('once-played', false);(可能改写 once-played 以匹配此内容,但概念相同)跨度>
【解决方案2】:

实际上,这听起来可能令人困惑,因为我的印象是,如果我们在几秒钟内完成,currentTime 仍有可能返回 0。但是在阅读了@freedomn-m、@roko-c-buljan、@rory-mccrossan cmets 之后,我知道当我们立即播放-暂停-播放视频时,currentTime 永远不可能返回 0。

现在,假设我想跟踪用户观看视频的次数。这些要求可能听起来很奇怪,但通过观看我只意味着开始/重播。如果用户手动将搜索栏拖到源的开头,则不算数。

这是我最终使用您的所有观点实现它的方式:

const $audio = $('.audio');
$audio.on("play", function() {

  if ($(this).data('once-played')) return; // Do nothing if data exists.

  // Your code here
  console.log("Audio started/replayed");

  // Finally, add a flag.
  $(this).data('once-played', true);
});

$audio.on("ended", function() {
  $(this).data('once-played', false);
});

【讨论】:

  • 但如果在"ended" 上将数据重置为false - 这对于您在已编辑 问题 中所说的再次没有意义“听众应该只处理音频开始和音频重播,而不是当用户手动将搜索栏拖到源的开头时” - 听什么?仍然很难理解你在追求什么,但$audio.on("ended", function() { 不支持问题文本。有时解释你正在构建什么以及请求是什么比从零碎开始一个问题更有帮助。 :|
猜你喜欢
  • 2014-08-21
  • 2011-08-09
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2015-09-03
  • 2015-04-03
  • 2017-03-12
相关资源
最近更新 更多