javascript - addEventListener ("loadedmetadata",有趣)没有正确运行,Firefox 错过事件

标签 javascript html firefox events

我写了一个页面,发现 addEventListener("loadedmetadata",fun) 在 firefox 上运行不正确

我正在尝试修复一个旧软件的错误。在加载视频和页面时,该软件尝试在页面上绘制一些播放器 Controller 。它在 Chrome 和 IE 上运行良好,但无法绘制一些播放器 Controller 在 Firefox 上。我尝试调试几天,直到发现问题可以像这样简化:

<!DOCTYPE html> 
<html> 
<body> 

<video id="myVideo" width="320" height="176" controls>
  <source src="video.mp4" type="video/mp4">

  Your browser does not support HTML5 video.
</video>

<script>
var vid = document.getElementById("myVideo");
alert("The vid");
vid.addEventListener("loadedmetadata", getmetadata);

function getmetadata()
{
alert("Meta data for video loaded");
}

</script> 

<p>test</p>

</body> 
</html>

我原以为 firefox(41.0.1) 会用 ("The vid") 和 ("Meta data for video loaded") 提醒两次,但它没有。 这些代码在 chrome 45 和 IE11 上正确运行。这两个浏览器都像我预期的那样用 ("The vid") 和 ("Meta data for video loaded") 警告两次。

是火狐的bug吗?我怎样才能避免这个问题?


我只是厌倦了 vid.addEventListener("canplay", getmetadata); 并得到了相同的结果。 看来问题是关于“addEventListener”


视频已加载。我可以使用 vid.play 播放它。我还使用 console.log(vid) 来查看 DOM 是否正确,结果是。

addEventListener 似乎跳过了 watching "loadedmetadata"和 "canplay",我不知道为什么。


我刚刚尝试了 .oncanplay 和 .onloadedmetadata ,发现不是 addEventListener ,而是 Event 导致了这个问题。

虽然某些东西(例如 alert())干扰了加载,但 Firefox 无法获取事件。因此,如果此时视频显示为“On Loadedmetadata”或“On Canplay”,则 Firefox 不会 catch 它。之后,视频加载元数据或可以播放。这是属性,而不是事件。Firefox 错过了事件,并向前冲。

最佳答案

最后我使用 console.log(vid.readyState) 并找到了解决方案。

在加载页面时,firefox 的速度非常快,以至于在 chrome 和 ie 等待某些东西时它匆匆忙忙地赶了过来。

此时 vid.addEventListener("loadedmetadata", getmetadata) , vid.readyState 在 firefox 中超过 2 ,而在 chrome 和 ie 中, vid.readyState 仍然是 0

readyState 0 表示“没有关于媒体资源的信息”。

readyState 2 表示'当前播放位置有数据可用,但还不足以实际播放超过一帧',与'loadedmetadata'相同。它不是一个事件,而是一个属性。

我像这样更改了代码,以检查浏览器是否冲得太快而错过了事件“loadedmetadata”。

<!DOCTYPE html> 
<html> 
<body> 

<video id="myVideo" width="320" height="176" controls>
  <source src="video.mp4" type="video/mp4">


  Your browser does not support HTML5 video.
</video>

<script>
var vid = document.getElementById("myVideo");
alert("The vid");
vid.addEventListener("loadedmetadata", getmetadata);

if (vid.readyState >= 2) {
      getmetadata();
    }

function getmetadata()
{
alert("Meta data for video loaded");
}

</script> 

<p>test</p>

</body> 
</html>

有关 readyState 的更多信息:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState

关于javascript - addEventListener ("loadedmetadata",有趣)没有正确运行,Firefox 错过事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116067/

相关文章:

javascript - 想为我的挖矿功能添加更多滴

javascript - 对 json 数据进行分组并对值求和

javascript - 使用 WebRTC 使 node.js 应用程序成为 PEER

javascript - 分割数组

javascript - 如何删除数据表中本地存储中表中的特定行

php - 根据 codeigniter 中数据库中选择的其他下拉菜单选项填充下拉菜单

Javascript 在 HTML 中不起作用

javascript - 当用户告诉浏览器打印页面时是否可以显示警报?

java - 无法使用 Java sqlite jdbc 从 Firefox 读取表

javascript - 了解 JavaScript 中的 'Yield' 关键字?