【问题标题】:Chrome video element canplay event not firingChrome视频元素可以播放事件未触发
【发布时间】:2014-01-13 23:51:25
【问题描述】:

在 Windows 7 和 Linux (Ubuntu 13.10) 上的 Chrome 31 中,video 元素上的事件处理程序已注册为 canplay(和 oncanplay ,只是为了确保)永远不会触发。当我检查 DOM 节点时,没有 oncanplay 属性。 spec 说它应该存在。有谁知道 Chrome 何时或是否支持此事件?

【问题讨论】:

    标签: javascript google-chrome html5-video


    【解决方案1】:

    Chrome 确实支持canplay 事件。您没有看到它,因为检查器仅显示所有元素上的那些属性,而不仅仅是媒体元素。它也不显示 loadedmetadatadurationchange 等,但 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_DATAHAVE_ENOUGH_DATA 之间的区别。)
    • 但是,请注意 移动 设备可能永远不会“准备好”:stackoverflow.com/questions/11633929/…“iOS 上的 Safari 永远不会预加载。”
    • 没错。 HAVE_FUTURE_DATA 对应事件“canplay”,HAVE_ENOUGH_DATA 对应“canplaythrough”
    • 另一种选择是使用属性preload="auto",因为我注意到在触发canPlay 事件之前流将suspend / 这对我在Windows / Firefox 上遇到类似问题很有用
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2018-01-13
    • 2016-03-18
    • 2012-11-21
    相关资源
    最近更新 更多