视频.JS - 一次在确切时间触发多个事件
Video.JS - Multiple events firing on exact time once
我正在开发一个Web应用程序,其中有一个视频元素。由于我有很好的经验,这是通过 VideoJS 脚本控制的。
但是,在我的应用程序上,有些时候视频需要暂停,直到用户播放(或脚本,它不相关),而不是之后。
我有什么
基本上 - 以及您需要的基本信息 - 我拥有的是一系列项目,比如说item_array
,其中包含对象。每个对象都有一个id
,一个media
对象,其中包含它的一些信息,包括一个src
,以及一个indications
数组 - 这将是暂停时间的对象。像这样:
var items_array = [
{
id: 1234,
media: {
id: 2345,
src: 'video_source.mp4',
duration: 302.56
},
indications: [
{
id: 1,
time: 65.380
},
{
id: 2,
time: 89.238
},
{
id: 3,
time: 123.765
}
]
}
]
当然,我有video
变量,它存储 VideoJS 引用,并且可以作为全局变量在整个代码中访问(也许知道这一点对您很有用)。
我需要什么
基本上,例如,我需要能够加载视频源并告诉脚本视频必须在 1:05.380、1:29.238 和 2:03.765 暂停。
暂停后,用户可以再次播放视频,并且在达到下一个时间标记之前不会再次暂停(至少通过脚本暂停)。
然后,用户可以指定要加载的新视频及其新的暂停点,因此应删除旧的暂停点并设置新的暂停点。
此外,除了暂停视频(例如显示消息等)之外,还需要执行其他操作。但是你没有必要知道这些 - 只是我必须能够编写一些在每个暂停点上要做的动作。
我尝试过什么
好吧,我一直在和timeupdate
玩.第一个问题是,这只会时不时地触发,因此video.currentTime() == NN.NNN
并不总是有效。
脚本video.currentTime() >= NN.NNN
也是不可能的,因为用户必须能够进一步播放暂停时间(是的,一旦到达事件就可以触发,但如果用户在时间线上跳过它,则视频不得暂停)。
因此,如果暂停时间在 1:05 并且用户从 0:45 跳到 1:25,则不得触发设置为 1:05 的暂停时间,因此视频不得暂停 - 所以之前写的行不能像我想要的那样工作。
提前感谢大家的时间和帮助!如果您需要任何进一步的信息,请问我,我会尽快提交!
此致敬意。
最后,我想出了一个可能的解决方案。当然,它的性能不是最好的,但它做到了它的意义。
我把它写在这里,也许有人会发现它很有用。
解决方案
我所做的是每次触发timeupdate
事件时触发自定义事件,因此我可以删除附加到此自定义事件的所有操作,而不会破坏 VideoJS 默认事件操作。
然后,我设置了一个 time_range
,这样我就可以在video.currentTime()
与所需的indication.time
之间进行比较,而不精确,但有一些空间可以发生。
最后,当它发生时,我暂停视频(并显示指示,我告诉您我需要执行的那些操作)并设置指示的新属性,has_shown
true
。
每次custom_timeupdate
我都会检查video.currentTime()
是否在我告诉您的时间范围内,以及该indication.has_shown
是否设置为false
。如果是这样,则触发该过程。如果没有,则不会发生任何反应(因此,如果已经显示指示,则不会再次暂停视频)。
但是,由于我希望它在用户返回到该点时再次显示它,因此我设置了最后一次检查,因此如果video.currentTime()
- 离该点有点远,则属性has_shown
设置为再次false
。
当然,对于我们拥有的每一indication
,都会这样做。
这里有代码:
var time_range = 0.125
video.on("timeupdate", function(){
video.trigger("indications_timeupdate")
})
function load_indications(indications){
/*
Function actions ...
*/
// If the video is defined, as we are loading them new, we set off old Indication timers
if(video !== undefined) video.off("indications_timeupdate")
$.each(indications, function(i, ind){
video.on("indications_timeupdate", function(){
if(video.currentTime() >= ind.time - time_range && video.currentTime() <= ind.time + time_range && !ind.has_shown){
video.pause()
ind.has_shown = true
}else if(video.currentTime() >= ind.time + time_range || video.currentTime() <= ind.time - time_range){
ind.has_shown = false
}
})
})
}
正如我所说,也许这不是最好的解决方案,但它是我能够想到的最好的解决方案。
感谢您抽出时间给所有试图为这个问题想出一种方法的人!
此致敬意。
- 存在每个时间元素的javascript事件
- Javascript:如何在onChange事件期间更改日期时间值
- 事件时间戳谷歌分析
- 时间和事件嵌入声云
- 节点.js在一定时间后发出事件
- 在 Node.Js 脚本中使用 Javascript 计时器在特定时间触发事件
- HTML 5 音频 :是否有在更改缓冲持续时间时触发的事件
- 时间间隔的 JavaScript 事件侦听器
- 完整的日历错误时间在点击事件谷歌日历
- AngularJS:跟踪在Web应用程序中花费的时间,然后在特定时间触发事件
- 用于查找基于时间的事件的最佳Javascript算法
- 在一小段时间的按键事件后,在angular js中进行get调用
- Vanilla Js:在一个事件中开始一段时间的循环,然后用第二个事件打破它?('mouseover'启
- 作为自动化测试的一部分,监控特定的js事件以及执行它们所需的时间
- 如何从服务器倒计时并在一段时间后触发事件
- 将事件附加到启动日期时间选取器
- 如何在HTML视频达到特定时间标记时触发事件
- HTML 5 画布按键按下时间事件
- Javascript/jQuery时间事件侦听器
- Jquery时间事件监听器停止/启动