在Windows 7和Linux(Ubuntu 13.10)上的Chrome 31中,video元素的事件处理程序已注册为canplay(以及oncanplay,只是为了确保),却从未触发。当我检查DOM节点时,没有oncanplay属性。 规范称它应该存在。有人知道Chrome何时或是否支持此事件吗?
在Windows 7和Linux(Ubuntu 13.10)上的Chrome 31中,video元素的事件处理程序已注册为canplay(以及oncanplay,只是为了确保),却从未触发。当我检查DOM节点时,没有oncanplay属性。 规范称它应该存在。有人知道Chrome何时或是否支持此事件吗?
Chrome 支持 canplay
事件。你没有看到它是因为检查器只显示在所有元素上都具有的属性,而不仅仅是媒体元素。它也不显示loadedmetadata
,durationchange
等,但 Chrome 绝对支持这些。
我没有看到你的代码,但我猜测你会看到事件触发(假设你正确监听了它)的一个可能原因是你错过了该事件。除非你频繁跳过视频,否则canplay
只会触发一次。所以如果事件在你添加监听器之前触发,那就太晚了。
相反,你可以像下面这样检查状态...
//assume you've already set up the video variable to point to your video element
if (video.readyState >= video.HAVE_FUTURE_DATA) {
console.log('video can play!');
} else {
video.addEventListener('canplay', function () {
console.log('video can play!');
}, false);
}
根据您想要实现的目标,您可能希望无论如何都要附加事件侦听器。如果缓冲数据不足,视频的readyState
可能会恢复,并且canplay
可能会再次触发。
>= video.HAVE_ENOUGH_DATA
,如果想确保视频已经加载足够,以避免停顿!比如说,如果你不会在视频缓冲足够时就开始播放。 (用慢速连接测试服务器,以查看HAVE_FUTURE_DATA
和HAVE_ENOUGH_DATA
之间的区别。) - ToolmakerStevepreload="auto"
,因为我注意到在 Windows / Firefox 上,流会在触发canPlay
事件之前被suspend
/ 这对我解决了类似的问题。 - potench