【问题标题】:Feature detect if user gesture is needed功能检测是否需要用户手势
【发布时间】:2015-09-18 13:39:17
【问题描述】:

有没有办法检测是否允许在没有用户手势的情况下对视频元素调用 play()? 在 Android Chrome 上会给出此警告:

Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.

因此,在 Chrome Android 上,需要用户手势才能开始播放视频,而桌面版 Chrome 则没有。 有没有办法检测我会得到哪种行为?

我希望我的应用程序的行为略有不同,具体取决于是否允许以编程方式调用 play。

我尝试使用Modernizr.videoautoplay,但它会检查元素上的autoplay 属性,这不是一回事。这会给 IE11 和 Edge 带来误报。

编辑:添加了an example。视频将在 Chrome 桌面和 Windows 8 或 10 上的 IE11 或 Edge(延迟 3 秒)中自动开始播放。对于 Chrome@Android,需要用户交互(单击按钮),并且可以在控制台中看到错误消息。

【问题讨论】:

  • 你能发布一个有这个错误的代码示例吗?
  • 嗨@Patrick 我已经用一个示例链接更新了这个问题。它有点复杂(将帧逐个添加到视频中)但可以看到问题
  • 嗨@oskbor,你解决了吗?
  • 不,没有找到检测方法
  • 我最终只是过滤了 var isMobile = false; if ((/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())) || (/Mobi/i.test(navigator.userAgent.toLowerCase( )))) isMobile = true;

标签: javascript html5-video modernizr feature-detection


【解决方案1】:

play 方法返回一个可以用来捕获错误的promise。

并非所有浏览器都遵循the specification,因此您必须先检查返回的内容是否是一个承诺。

var autoPlayAllowed = true;
var promise = document.createElement("video").play();
if(promise instanceof Promise) {
    promise.catch(function(error) {
        // Check if it is the right error
        if(error.name == "NotAllowedError") {
            autoPlayAllowed = false;
        } else {
            throw error;
        }
    }).then(function() {
        if(autoPlayAllowed) {
            // Allowed
        } else {
            // Not allowed
        }
    });
} else {
    // Unknown if allowed
}

【讨论】:

  • 我觉得这需要先检查window.Promise是否存在,否则在不支持promise的浏览器上会出现引用错误。
  • 这在 Chrome 70 上不起作用。如果没有在视频元素上设置源,则承诺会挂起并且无法解析。
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 2012-08-26
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多