Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “如何区分两者”;“暂停”;事件-由单击“;暂停”;按钮,并由到达媒体片段结尾引起?_Javascript_Html_Html5 Video_Html5 Audio - Fatal编程技术网

Javascript “如何区分两者”;“暂停”;事件-由单击“;暂停”;按钮,并由到达媒体片段结尾引起?

Javascript “如何区分两者”;“暂停”;事件-由单击“;暂停”;按钮,并由到达媒体片段结尾引起?,javascript,html,html5-video,html5-audio,Javascript,Html,Html5 Video,Html5 Audio,如果用户想要停止HTML5媒体,例如通过单击“暂停”本机控件按钮,我们将获得“onpause”事件。 同时,如果媒体元素到达指定片段的末尾,它会自动触发相同的“onpause”事件。有可能把它们分开吗?在JQuery风格中 <video id="video1" src="url/video.webm#t=10,20" controls></video> <script type="text/javascript"> $(window).load(func

如果用户想要停止HTML5媒体,例如通过单击“暂停”本机控件按钮,我们将获得“onpause”事件。 同时,如果媒体元素到达指定片段的末尾,它会自动触发相同的“onpause”事件。有可能把它们分开吗?在JQuery风格中

<video id="video1" src="url/video.webm#t=10,20" controls></video>

<script type="text/javascript">
  $(window).load(function () { 
    $('#video1').on("manualpause", function () {
      alert("you paused this media manually!");
    });
    $('#video1').on("fragmentend", function () {
      alert("you've reached the end of the fragment! your media is now paused automatically!");
    });
  });
</script>

$(窗口).load(函数(){
$('#video1')。打开(“手动暂停”,功能(){
警报(“您手动暂停了此媒体!”);
});
$('#video1')。在(“fragmentend”,函数(){
警报(“您已到达片段末尾!您的媒体现在自动暂停!”);
});
});

我试图使用“ontimeupdate”事件,但遭到拒绝:我想在自动暂停(由到达片段结尾引起)发生时做出准确的反应。

只有在完整曲目完成时才会发出结束事件。播放片段时,它只会在片段末尾暂停曲目,因为曲目本身尚未结束(除非片段的结束时间恰好也是结尾)

媒体元素在运行时暂停,以进行用户交互 暂停属性为false,readyState属性为 拥有未来数据或拥有足够的数据且用户代理已达到 在媒体资源中,用户必须选择的点 继续的资源

只有在以下情况下,才会发生结束事件:

在以下情况下,媒体元素被称为已结束播放:

元素的readyState属性为HAVE_METADATA或更大,并且

要么:
  • 当前播放位置是媒体资源的结尾,并且
  • 播放方向为向前,并且
  • 媒体元素没有指定循环属性,或者媒体元素具有当前媒体控制器。
或:
  • 当前播放位置是最早可能的位置,并且
  • 播放方向是向后的。

要检测暂停事件是否由于片段结束而触发,可以将currentTime与片段结束时间进行比较(是的,理论上也有可能在这个时候按下暂停按钮,但这将与音频元素尽可能接近,除非事件本身具有揭示暂停来源的秘密属性,我不知道这一点)

由于我们处理的是浮点值,您需要使用ε来比较时间。假设您或其他方面有办法获得片段的结束时间,您可以执行以下操作:

function onPauseHandler(e) {
    var fragmentEndTime = ...;   // get/parse end-fragment into this var
    if (isEqual(this.currentTime, fragmentEndTime)) {
      // likely that fragment ended
    }
    else {
      // a manual pause
    }
}

function isEqual(n1, n2) {
   return Math.abs(n1 - n2) < 0.00001
}
Pausehandler(e)上的函数{ var fragmentEndTime=…;//获取/解析此变量中的结束片段 if(isEqual(this.currentTime,fragmentEndTime)){ //很可能那个片段结束了 } 否则{ //人工停顿 } } 函数相等(n1,n2){ 返回数学绝对值(n1-n2)<0.00001 }
我今天在搜索“为什么onpause在onended发生时也会触发”时遇到了这个问题。我想将onpause事件和OnOnOnEnded事件之间的逻辑分开

这是我对它的看法:

videoRef.onpause = (e) => {
  if (e.target.currentTime != e.target.duration) {
    // handleOnPause();
  }
}

我注册了
onpause
oneded
处理程序,在视频未结束时运行
onpause
代码。

从官方MDN文档中,显然有结束事件和暂停事件。这就是您要找的吗?播放完成时发送结束,播放完成时发送暂停ack已暂停。问题是到达媒体片段的结尾会触发“onpause”事件(而不是“ended”),我无法理解如何捕获这种特定的自动暂停。这两种情况下的事件是相同的,但其性质(从用户的角度看)不同!根据文档,播放完成时会抛出ended,因此应该在媒体结束时抛出ended,而不应该调用pause事件。您100%确定正在抛出pause事件吗?您可以试试$(“#video1”).bind('ended',function(){…?为什么您指的是“ended”?片段的结尾不是媒体的结尾!这并不意味着播放完成,而是意味着暂停!谢谢。这正是我在写“我试图利用‘ontimeupdate’事件”时的意思,但我不知道……这似乎是一个非常简单的黑客行为。也许我们需要检查媒体本身是否被点击(点击是否会导致“暂停”触发“onclick”?)。但如果没有更好的方法,我需要接受这一点…@lyricallywicked您可以在某些浏览器中使用(例如,在FF中工作,但在Chrome中不工作)这使得它不可靠,或者可能更好,为控件提供自定义按钮。实际上,这是一个更好的参考,因为当当前播放位置到达末尾[…]时,它在那里显示
,那么用户代理必须遵循以下步骤:
4.[…]并且媒体元素仍然结束了播放[…],且paused为false,将paused更改为true,并在媒体元素激发名为pause的简单事件。
。我喜欢您的解决方法,因此+1。