addEventListener("loadedmetadata",fun)无法正常运行,Firefox错过了事件

Cat*_*let 5 javascript firefox events html5

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

我正在尝试修复一个旧软件的错误.在加载视频和页面时,软件尝试在页面上绘制一些播放器控制器.它在Chrome和IE上运行良好,但无法在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>
Run Code Online (Sandbox Code Playgroud)

我期望firefox(41.0.1)用("The vid")和("视频加载的元数据")提醒两次,但事实并非如此.这些代码在chrome 45和IE11上正确运行.这两个浏览器中的两个用我预期的("The vid")和("视频加载的元数据")提醒两次.

这是firefox的bug吗?我该如何避免这个问题?


我只是累了vid.addEventListener("canplay", getmetadata);,得到了同样的结果.似乎问题是'addEventListener'


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

似乎addEventListener跳过观看"loadedmetadata"和"canplay",我不知道为什么.


我刚试过.oncanplay和.onloadedmetadata,发现它不是addEventListener,但事件导致了这个问题.

虽然某些事情(例如alert())扰乱了加载,但Firefox无法获得该事件.因此,如果视频在此刻出现'On Loadedmetadata'或'On Canplay',那么firefox就没有赶上它.之后,视频被加载元数据或canplay.这是属性,而不是事件.Firefox错过了事件,并向前冲.

Cat*_*let 7

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

在加载页面时,firefox是如此之快,以至于赶紧匆忙而且正在等待某些东西.

目前vid.addEventListener("loadedmetadata", getmetadata),vid.readyState比2firefox 更多,而在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>
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能可以通过将“addEventListener”移动到readyState条件下的else中来改进,以便仅在视频对象未准备好时添加它。不过很好的解决方案! (2认同)