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

问题描述 投票:4回答:2

我写了一个页面,发现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>

我期望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错过了事件,并向前冲。

javascript html5 firefox events
2个回答
6
投票

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

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

目前qazxsw poi,video.readyState在firefox中出现的不仅仅是qazxsw poi,而在chrome和ie上,vid.readyState仍然是vid.addEventListener("loadedmetadata", getmetadata)

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

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

我改变了这样的代码来检查浏览器是否冲得太快而错过了'loadedmetadata'事件。

2

有关readyState的更多信息:qazxsw poi


0
投票

我遇到了同样的问题并得到了解决方案。我使用0事件而不是<!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> 事件,它对我有用。

在权威指南Javascript书中,它说https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState事件意味着:

第一次加载当前播放位置的数据,loadeddata已更改为loadedmetadata

loadeddata的意思是:

已加载readyState的媒体数据,但尚未加载足够的数据以允许媒体播放。对于视频,这通常意味着当前帧已加载,但下一帧尚未加载。此状态发生在声音或电影的结尾。它有HAVE_CURRENT_DATAHAVE_CURRENT_DATA属性。

我希望我的回答清楚地表明:

currentTime
© www.soinside.com 2019 - 2024. All rights reserved.