在angularjs项目中播放视频,使用video.js编写进度条打点插件,无法获取视频已成功加载事件(在线等)

需要给视频播放做进度条打点的功能,如下图:

clipboard.png

视频播放使用video.js控件,整个项目环境使用angularjs搭建。
打点功能使用是为video.js扩展了一个插件,本身显示没有问题。

现在的问题是在页面打开或刷新时,由于视频加载速度比较慢,两个点的显示很容易出现在视频进度条初始化之前,会产生这样的显示效果:
clipboard.png

controller代码如下。

        var video = videojs('player', {
            controlBar: {
                volumeMenuButton: {inline: false} 
            } 
        });
        
        video.on('firstplay', function(){
            video.videoDot({
                init: true,
                angular: true,
                dotArray: [{
                    time: 300,
                    content: '巴拉巴拉小魔仙巴拉巴'
                }, {
                    time: 1800,
                    content: '小魔仙蜜汁舞步!'
                }]
            });
        });

监听的是video的firstplay事件,显然不合理。但是在videojs官网和源码中并没有找到合适的事件。
请问该如何修改这个错误?

阅读 9.5k
3 个回答

查了下资料,它还提供了这两个事件,把 firstplay 换成下面的试试看效果

loadedalldata

loadeddata

附下官网api文档,方便你以后查找:
http://docs.videojs.com/docs/...

最新的文档里,事件只有loadeddata, loadedalldata没有了。

补充一下,只监听loadeddata可以解决网速比较慢的时候出现的问题,然而网速飞快的时候仍然不可行。

最后暂时将两个事件同时监听作为解决方案。

video.on('loadeddata', function(){
    video.videoDot({
        init: true,
        angular: true,
        dotArray: [{
            time: 300,
            content: '巴拉巴拉小魔仙巴拉巴'
        }, {
            time: 1800,
            content: '小魔仙蜜汁舞步!'
        }]
    });
});
video.on('firstplay', function(){
    video.videoDot({
        init: true,
        angular: true,
        dotArray: [{
            time: 300,
            content: '巴拉巴拉小魔仙巴拉巴'
        }, {
            time: 1800,
            content: '小魔仙蜜汁舞步!'
        }]
    });
});

另外附上插件代码

;
(function($){
    $.videoDot = function(options){
        "use strict";

        var player         = this;
        var progressHolder = player.$('.vjs-progress-holder');
        var progressWidth  = progressHolder.clientWidth;
        
        var dotArray       = options.dotArray;
        var duration       = player.duration();
        
        var geneditDots    = function(){

            /* Dots Div */
            var dotDiv = player.$('.st-video-dotCon') || undefined;
            if(!dotDiv){
                dotDiv = document.createElement('div');
            }
            else{
                dotDiv.innerHTML = "";
            }
            dotDiv.setAttribute('class', 'st-video-dotCon');

            /* Dots */
            for(var i = 0; i < dotArray.length; i++){
                var dotEl = document.createElement('div');
                
                dotEl.setAttribute('class', 'st-video-dot');
                dotEl.style.left = (dotArray[i].time / duration * progressWidth - 3) + 'px';

                /* dotTip */
                var dotTip = document.createElement('div');
                dotTip.setAttribute('class', 'st-video-dotip');
                dotTip.innerHTML = dotArray[i].content;
                dotEl.appendChild(dotTip);

                dotDiv.appendChild(dotEl);
            }

            return dotDiv;
        }

        progressHolder.appendChild(geneditDots());
    };
    videojs.plugin('videoDot', $.videoDot);
})(stui);

判断是否已经渲染了打点div,存在的话就更新一下,不存在创建,保证同时只存在一个打点容器。


css打点部分,直接引入就可以。

.video-js{
    width: 100%;
    height: 100%;
}
.video-js .vjs-progress-control:hover .vjs-progress-holder{
    font-size: 1em;
}
.video-js .vjs-progress-control:hover .vjs-play-progress:after{
    visibility: hidden;
}
.video-js .vjs-control:before{
    line-height: 36px;
}
.st-video-dotCon{
    position: absolute;
    width: 100%;
    height: 100%;
    /* overflow: hidden; */
}
.st-video-dot{
    width: 6px;
    height: 100%;
    background-color: #ececec;
    position: absolute;
    overflow: visible;
    z-index: 1;
}
.st-video-dot:hover{
    cursor: pointer;
}
.st-video-dotip{
    width: 150px;
    display: none;
    min-height: 25px;
    padding: 5px;
    background-color: #fff;
    line-height: 25px;
    overflow-y: hidden;
    letter-spacing: 1px;
    color: #3d3d3d;
    position: absolute;
    top: -50px;
    left: -75px;
    border-radius: 5px;
    z-index: 1;
    font-family: "Microsoft YaHei";
}
.st-video-dot:hover .st-video-dotip{
    display: block;
}
.video-js .vjs-big-play-button{
    height: 3em;
    top: 50%;
    left: 50%;
    margin-left: -1.5em;
    margin-top: -1.5em;
    border-radius: 1.5em;
    line-height: 3em;
    font-size: 3.5em;
}
.assess-li i{
    color: #1dd2af;
}
.sc-td-teamer1 label{
    font-weight: normal;
    font-size: 0;
}
.sc-td-teamer1 label span{
    font-size: 14px;
}

好像多了一些,适当删掉就可以。

另外这个版本已经不用了,现在转用vue重构了一遍,感觉很爽。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题