【发布时间】:2018-11-27 04:09:44
【问题描述】:
我已经尝试解决这个问题好几个小时了,但没有成功。 查看了在 stackoverflow 上提出的所有类似问题,但这些解决方案似乎都不适合我。
我正在循环播放一系列视频。我需要将每个视频插入到音频元素中,以快速获取其持续时间以及它出现在播放列表中的确切时间。
我原来是这样的:
// Set time in playlist for each video
for (let index=0; index<this.playlist.length; index++) {
var audio = document.getElementById('audio');
console.log('INDEX: ' + index);
self.playlist[index].timeInPlaylist = [];
self.playlist[index].duration = 0;
audio.setAttribute('src', self.playlist[index].bucketRef);
audio.addEventListener('canplaythrough', function(e){
videoDuration = Math.round(e.currentTarget.duration);
console.log("Duration of video number " + index + ": " +
videoDuration + " seconds");
self.playlist[index].duration = videoDuration;
self.playlist[index].timeInPlaylist[0] = playlistLength;
playlistLength = playlistLength + videoDuration;
self.playlist[index].timeInPlaylist[1] = playlistLength;
});
};
运行此代码保持索引不变,输出是数组中最后一个视频的长度,记录了 3 次。然后在深入研究之后,我意识到我需要某种类型的闭包,因为在循环中添加了事件侦听器。所以我做了一点重构,来到了这个当前版本:
function log(e, index) {
videoDuration = Math.round(e.currentTarget.duration);
console.log("Duration of video number " + index + ": " + videoDuration + " seconds");
self.playlist[index].duration = videoDuration;
self.playlist[index].timeInPlaylist[0] = playlistLength;
playlistLength = playlistLength + videoDuration;
self.playlist[index].timeInPlaylist[1] = playlistLength;
}
// Set time in playlist for each video
for (let index=0; index<this.playlist.length; index++) {
var audio = document.getElementById('audio');
console.log('INDEX: ' + index);
self.playlist[index].timeInPlaylist = [];
self.playlist[index].duration = 0;
audio.setAttribute('src', self.playlist[index].bucketRef);
debugger;
(function() {
var i = index;
audio.addEventListener("canplaythrough", function(e) { log(e, i); });
})();
};
这解决了我的索引问题;但是,我仍然只能获取数组中最后一个视频的持续时间。
非常感谢您的反馈。这个问题一直在杀死我。
【问题讨论】:
标签: javascript arrays loops closures addeventlistener