javascript - 从事件监听器更新全局变量

标签 javascript global-variables video.js event-listener

我正在尝试收集页面上所有视频的时间并将它们添加到数组中。这是代码:

var allvideos = $('video');
var times = [];
for ( i=0; i < allvideos.length; i++ ) {
    allvideos[i].addEventListener('loadedmetadata', function() {
        videoDuration = this.duration;
        times.push(videoDuration);
    });
};

如果我在 EventListener 中 console.log(times) ,它会按预期工作,但如果我在 for 循环之后记录它,它是空的。我不明白这是为什么。有人可以帮忙吗,请解释一下原因?非常感谢。

我正在使用 jQuery 和 Video.js。

最佳答案

想想你的代码是如何执行的:

  1. 创建times数组
  2. 设置事件监听器
  3. 使用console.log输出times数组中的值
  4. 调用事件监听器并将其推送到 times 数组

它没有显示 times 数组中的 videoDuration 的原因是 times 在该时间点为空。您必须等到所有事件监听器都被调用后才能输出数组中的值。

<小时/>

如果您想在调用所有事件监听器后输出数组,则可以执行以下操作:

for (var i = 0; i < allvideos.length; i++) {
    allvideos[i].addEventListener('loadedmetadata', function() {
        times.push(this.duration);

        if (times.length === allvideos.length) {
            console.log(times);
        }
    });
};

关于javascript - 从事件监听器更新全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24124230/

相关文章:

javascript - JQuery - 将 JS 转换为 JQuery 以生成允许解析 URL 参数的表

javascript - 标签的 jQuery 选择器

C++ 在全局变量不合适时保持计数

c++ - 为什么 `std::exit` 没有按预期触发析构函数?

javascript - 使用变量 Javascript 动态更改 gridTemplateColumns 重复值的任何方法

javascript - 基于日期字段的同位素过滤

javascript - Videojs 无法在 IE 9 及更高版本中工作

javascript - play() promise 未解决

matlab - 使用 Globals 而不是在 Matlab 中传递大型数组

mediaelement.js - 如何使 Popcorn.js 在 iPad 上与 Video.js 配合使用