HTML5视频 - 播放事件未触发

时间:2012-04-17 16:13:43

标签: html5 video javascript-events safari

我目前在Safari中遇到HTML5视频事件问题。我正在我的页面上播放一个视频。视频加载并正确播放。但是,比赛事件并不总是发生。如果用户:

  1. 点击播放
  2. 观看视频到底(已结束的事件发生)
  3. 再次点击播放
  4. 第二次点击时不会触发播放事件。如果我当时暂停/播放电影,则会触发正确的事件。

    如果视频已完成并且用户再次按下播放,如何才能触发视频标记的播放事件?

    **drawVidPlayer is called with the videos index as part of the page render
    
    function drawVidPlayer(vindex){
        var turl=vidList[vindex]['thumbUrl'];
        var vurl=vidList[vindex]['url'];
        var valias=vidList[vindex]['type'];
        destroyVidPlayer(); 
        $('#mediaspot').css('backgroundColor', '#000000');
        $('#mediaspot').show();
        $('#mediaspot').html('<video controls="controls" id="twnvideo" poster="'+turl+'" style="height:225px; width:460px;"><source src="'+vurl+'" type="video/ogg" /><source src="'+vurl+'" type="video/mp4" /><source src="'+vurl+'" type="video/webm" />Your browser does not support the video tag.</video>').appendTo('#wrap_media_vod');
        var velem=document.getElementsByTagName('video')[0];    
        velem.addEventListener('play', initVidTimer, false);
        velem.addEventListener('pause', killVidTimer, false);
        velem.addEventListener('ended', killVidTimer, false);
    }    
    function destroyVidPlayer(){
        var velem=document.getElementsByTagName('video')[0];
        if(velem!=undefined){
            velem.removeEventListener('play', initVidTimer);
            velem.removeEventListener('pause', killVidTimer);
            velem.removeEventListener('ended', killVidTimer);
        }
        $('#mediaspot').empty();
        $('#mediaspot').html('');
    }
    function initVidTimer(){
        if(activityTimer==null){
            external.OnUserActivity(19);
            activityTimer=setInterval(function(){
                external.WriteLog('activity timer running');
                external.OnUserActivity(19);
            }, 5000);
        }
    }
    function killVidTimer(){
        clearInterval(activityTimer);       
        activityTimer=null; // Kill keepAlive timer
        var velem=document.getElementsByTagName('video')[0];
        external.WriteLog(velem.ended);     
    }    
    

2 个答案:

答案 0 :(得分:2)

HTML5现在指定当播放位置到达结尾时,浏览器必须抛出timeupdatepausedended事件一个媒体文件,但规范并不总是那么清楚。因此,浏览器之间的这种行为是不一致的。有些人在文件结束时没有设置paused=true或触发paused事件。

在Safari问题中,当视频第二次开始播放时,paused仍然等于false - 因此浏览器没有理由触发play事件再次。

这可能不再是Safari 6中的一个问题,但它仍然在IE 9中出现。请查看来自longtailvideo.com的this chart中的结束事件列 - 他们概述了不一致的好。

使用几行代码很容易将此问题规范化 - 如下所示:

$("video").on("ended", function () {
    if (!this.paused) this.pause();
});

这会使视频处于暂停状态ended,因此它会在重播时正确抛出play事件。

你可以在IE 9中试试这个工作样本,或者看看我在这个jsfiddle上的意思:http://jsfiddle.net/PWnUb/

答案 1 :(得分:2)

我有同样的问题,我解决了一些jquery:

function videoend(){
     var duration = $("video").get(0).duration;
     var current = $("video").get(0).currentTime;

    if(current==duration){
        //Whatever you wanna do when video ends
    };
}

$(document).ready(function(){
    setInterval("videoend()", 200); //or any other time you wanna use
});

希望这有帮助。

相关问题