我有一系列页面,每个页面都显示一组视频。一种视频播放列表,如果你愿意的话。为了便于处理每个视频,我在它们上运行 mediaelement.js 插件并将 mediaElement 对象存储在一个数组中,如下所示:
var mediaArray = [];
$(".class").each(function (index) {
$(this).mediaelementplayer({
success: function (mediaElement, domObject) {
mediaArray[index] = mediaElement;
}
});
});
这非常适合让我在 mediaelement.js 播放器之外控制各种 mediaElement 对象。因此,例如,我可以让用户单击下一个视频的标题以切换到播放该视频。
我遇到麻烦的地方是当我尝试允许用户更改其中一个视频的音量,然后在他们开始播放下一个视频时保持该音量。
我可以轻松编写这样的函数:
setAllVolume = function (value) {
for (var i=0, il=mediaArray.length; i<il; i++) {
mediaArray[i].setVolume(value);
}
}
如果我在 mediaelement.js 控件之外有音量控制,那效果很好。(例如,如果我为通用音量控制构建 jQueryUI 滑块。)
我尝试的是为“changevolume”事件添加一个事件侦听器,并setAllVolume
像这样触发我的函数:
$(".class").each(function (index) {
$(this).mediaelementplayer({
success: function (mediaElement, domObject) {
mediaArray[index] = mediaElement;
mediaElement.addEventListener("volumechange", function () {
setAllVolume(mediaElement.volume);
});
});
正如您可能想象的那样,以这种方式设置音量会导致每个 mediaElement 触发其自己的“volumechange”事件,并setAllVolume
在级联失败堆中递归调用该函数,这会导致浏览器在一次又一次地搅动整个过程时挂起。
那么,有没有一种方法可以改变一个视频的音量,反映在其他视频中,而不会遇到这种递归?(我应该提到我使用的是 H.264 视频,而这个问题似乎只发生在使用 Flash 插件播放该格式的浏览器中。)