Javascript 如何知道是什么原因导致html视频开始播放?

Javascript 如何知道是什么原因导致html视频开始播放?,javascript,google-chrome-extension,html5-video,dom-events,Javascript,Google Chrome Extension,Html5 Video,Dom Events,有一个HTML视频标签。我想知道它什么时候开始播放: 是自动播放引起的吗? 这是因为在JavaScript中调用play造成的吗? 是用户点击播放按钮造成的吗? 我想处理仅由用户操作引起的播放事件,这是上述三种情况中的第三种情况 我当前的解决方案: function videoEventHandler(ev) { var videoElem = ev.target; if (!videoElem.controls) { // no controls in vide

有一个HTML视频标签。我想知道它什么时候开始播放:

是自动播放引起的吗? 这是因为在JavaScript中调用play造成的吗? 是用户点击播放按钮造成的吗? 我想处理仅由用户操作引起的播放事件,这是上述三种情况中的第三种情况

我当前的解决方案:

function videoEventHandler(ev) {
    var videoElem = ev.target;
    if (!videoElem.controls) {
        // no controls in video, means events can't be caused by user actions
        return true;
    }

    switch (ev.type) {
        case 'play':
            if (videoElem.autoplay && !videoElem.hasPaused) {
                // first play event in autoplay video, muse be caused by autoplay
                return true;
            }
            // deal with play event caused by user actions
            return true;

        case 'pause':
            ev.target.hasPaused = true;
            // deal with pause event caused by user actions
            return true;
    }
}
问题:我的解决方案无法处理以下情况:

它不知道是否由JavaScript调用play导致播放事件 它不知道视频引起的暂停事件是否结束 请注意:我不能在游戏中添加标志,因为它是在网页中调用的。这个网页不是我写的,我无法更改它。我正在写一个Chrome扩展

有人能帮我吗


这是一个非常具体的问题,可能会让人困惑。如果我的问题让你困惑,请留下评论,我会尽量解释得更清楚。非常感谢。

当您从javaScript调用播放时,只需将元素中的一个属性设置为true,以指定它是由javaScript启动的。在侦听播放事件时,您可以检查该变量以了解它是否是从javaScript播放的

在调用play之前:

video.playedFromJavascript=true;
video.play(); 
正在播放的侦听器:

if (videoElem.playedFromJavascript==true) {
                // play event caused by javascript
videoElem.playedFromJavascript=false; // resetting it to false once captured
       }

我们已结束在视频结束时触发的事件。使用此事件可了解由视频引起的暂停事件是否已结束。

您可以尝试隐藏默认控件并创建自己的控件。这样,您将只获得有关用户操作的信息

据我所知,由于autoplay标志设置为true,用户按下播放按钮和视频开始播放之间没有区别

正如政府所说:

“自动播放”属性是一个布尔属性。当存在时,用户 代理将尽快自动开始播放媒体资源 因为它可以不停地这样做

请记住,如果连接速度较慢,用户可以在自动播放标志下开始播放之前按下播放按钮


要确定播放结束时间,可以使用事件或尝试检查播放持续时间和当前时间属性的位置。

我无法创建自己的视频控件。如前所述,我正在编写一个Chrome扩展,无法更改网页

我得到的最佳解决方案并不完美:

请注意:这个答案并不完美。它不知道JavaScript中自动播放和调用播放引起的播放事件之间的区别


对不起,我忘了说,这个网页不是我写的,我不能更改它。我正在编写一个Chrome扩展,如果该站点提供独立于视频元素的播放按钮,该怎么办?这基本上是一个用户操作,即使视频是由播放代码启动的。@wOxxOm你是对的。似乎并不是每个场景都有一个完美的解决方案。我只想涵盖大多数情况。
function videoEventHandler(ev) {
    var videoElem = ev.target;
    if (!videoElem.controls) {
        // no controls in video, means events can't be caused by user actions
        return true;
    }

    switch (ev.type) {
        case 'play':
            if (videoElem.autoplay && !videoElem.hasPaused) {
                // first play event in autoplay video, muse be caused by autoplay
                return true;
            }
            // deal with play event caused by user actions
            return true;

        case 'pause':
            ev.target.hasPaused = true;
            var self = this;
            Util.setTimeout(function() {
                // we don't record pause event followed by ended, because it is caused by video reaches end
                if (!videoElem.hasEnded) {
                    // deal with pause event caused by user actions
                }
                videoElem.hasEnded = false;
            }, 50);
            return true;
        case 'ended':
            videoElem.hasEnded = true;
            return true;
    }
}