javascript - 在angularjs项目中播放视频,使用video.js编写进度条打点插件,无法获取视频已成功加载事件(在线等)
迷茫
迷茫 2017-04-11 12:00:48
[JavaScript讨论组]

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

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

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

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官网和源码中并没有找到合适的事件。
请问该如何修改这个错误?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
ringa_lee

查了下资料,它还提供了这两个事件,把 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 p */
            var dotp = player.$('.st-video-dotCon') || undefined;
            if(!dotp){
                dotp = document.createElement('p');
            }
            else{
                dotp.innerHTML = "";
            }
            dotp.setAttribute('class', 'st-video-dotCon');

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

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

                dotp.appendChild(dotEl);
            }

            return dotp;
        }

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号