修改CKplayer.js 源码解决移动端浏览器全屏不能限制快进的问题
原文地址:https://www.cnblogs.com/jying/p/9642445.html,转载请说明出处。
最近项目需要播放视频且限制未观看部分的快进功能,找了两款js插件ckplayer和jwplayer,由于ckplayer是国内大牛开发的,中文文档比较官方,而且主要是文档说可以禁用拖动,就直接使用了ckplayer,没有测试jwplayer,待日后有时间再学习~~
ckplayer的使用文档见官方网站:http://www.ckplayer.com ,当前CKplayer.js版本为X
由于本人项目使用的是 angular1.* 版本,所以封装了一个directive使用ckplayer,详情可以查看我的另一篇博文:https://www.cnblogs.com/jying/p/9519557.html
目标:限制未观看过的视频部分快进
默认:修改ckplayer.js中 timeScheduleAdjust:5 (该值表示是否可调节调节栏,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动)或 player.changeConfig('config','timeScheduleAdjust',5)
问题:timeScheduleAdjust 设置为5后在pc端能限制点击鼠标和拖动不播放未观看的视频部分,但在移动端浏览器播放会自动全屏,自带浏览器无法限制不播放未观看过的部分。
解决历程:
ckplayer 有个属性 mobileCkControls:false ,用于控制是否在移动端显示ckplayer 控制栏,默认是false,设置该值为 true 后在移动端确实显示ckplayer风格的控制栏,效果如下图

但是该控制栏在移动端点击全屏按钮无法全屏!!!而在IOS浏览器中点击播放视频默认的是全屏播放,于是想大不了都不要全屏了,是否可以限制在浏览器中的全屏?查资料想解决移动端播放自动全屏的问题,首先查到的是在前端控件中添加 webkit-playsinline playsinline x5-playsinline x-webkit-airplay="allow" ,然而查看ckplayer.js 默认是添加了这些属性的(可以在ckplayer.js 中查找关键字 <video 定位查看)
很显然在微信端有什么特殊代码控制了可以不默认全屏播放,继续查资料了解到在APP中(Obj-C代码)设置以下代码可以控制移动端不默认全屏播放
webview.allowsInlineMediaPlayback = YES;
可以推断微信APP设置了该属性,而移动端浏览器(移动端Safari,chrome)没有,但是我这个项目是网站啊,没有APP,所以它这个 webview.allowsInlineMediaPlayback = YES 我设置不了啊!!!
如果设置 mobileCkControls:false或不设置该属性,则使用移动端默认的控制栏风格,在IOS微信中是可以播放不全屏的,也可以点击右下角控制全屏播放(如下图这样,原因如上微信设置了 webview.allowsInlineMediaPlayback = YES),

在移动端浏览器中点击播放后仍然是默认全屏,但不管是不是默认全屏,全屏后无法限制未观看部分的拖动是根本问题,经过官网实例index.html 发现拖动后有个start和ended,于是查找源码eventSeeking,尝试在其中修改添加如下代码,控制移动端全屏播放时拖动后回到拖动起始位置。
//监听视频seek开始事件
var eventSeeking = function (event) {
if (document.body.clientWidth < 768) {//移动端
var nowP = thisTemp.time / thisTemp.V.duration;
if (thisTemp.timeSliderLeftTemp < nowP) {
thisTemp.timeSliderLeftTemp = nowP;
}
// console.log("点击的时间点位thisTemp.V.currentTime = ", thisTemp.V.currentTime);
// console.log("当前时间点位thisTemp.time = ", thisTemp.time);
// console.log("百分比this.timeSliderLeftTemp = ", thisTemp.timeSliderLeftTemp);
// console.log("总时长:", thisTemp.V.duration);
var nowprocess = thisTemp.V.currentTime / thisTemp.V.duration;
if (thisTemp.timeSliderLeftTemp < 1) {
if (thisTemp.V.currentTime > thisTemp.time && nowprocess > thisTemp.timeSliderLeftTemp) {
console.log("您点击的超出播放位置了", nowprocess);
thisTemp.V.currentTime = thisTemp.V.duration * thisTemp.timeSliderLeftTemp;
}
}
}
thisTemp.sendJS('seek', 'start');
};
以上,问题解决!
补充一个问题解决:设置timeScheduleAdjust 后,pc端使用左右键仍然可以跳过限制继续快进快退,右键解决思路如下,左键雷同。ckplayer.js源码查找函数checkSlideLeft,添加以下代码:
case 5:
//console.log("timesliderleftTemp = ", this.timeSliderLeftTemp);
// console.log("滑块位置sliderleft = ", sliderLeft, "总长度 refer = ", refer, "点击的位置:", newX);
if (!this.timeSliderLeftTemp) {
this.timeSliderLeftTemp = sliderLeft / refer;
} else {
var timeSliderMax = sliderLeft / refer;
if (timeSliderMax > this.timeSliderLeftTemp) {
this.timeSliderLeftTemp = timeSliderMax;
}
}
if (newX > this.timeSliderLeftTemp * refer) {
return false;
}
break;
修改CKplayer.js 源码解决移动端浏览器全屏不能限制快进的问题的更多相关文章
- 修改gridfilters.js源码,往后台多传递一个参数,并设置NumericFilter、StringFilter默认提示信息
创作不易,转载请注明出处!!! 效果 修改:ext-extend.js源码 在最后面添加3行,重写方法 代码拷贝区 Ext.override(Ext.ux.grid.GridFilters, { me ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- 深入理解unslider.js源码
最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...
- basket.js 源码分析
basket.js 源码分析 一.前言 basket.js 可以用来加载js脚本并且保存到 LocalStorage 上,使我们可以更加精准地控制缓存,即使是在 http 缓存过期之后也可以使用.因此 ...
- vue.js源码精析
MVVM大比拼之vue.js源码精析 VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多 ...
- underscore.js源码研究(6)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- MVVM大比拼之avalon.js源码精析
简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高. 将原始对象用object.defineProperty重写,不需要用户像用knoc ...
- Spring IoC源码解决——工具篇Eclipse
题外话 对于Spring框架,平时都是点到为止,停留在会用的程度.一直以来都想深入学习下,刚好最近看到<Spring源码深度解析>,所以想随着书本深入学习一下. 如果用Maven 如果使用 ...
- underscore.js 源码
underscore.js 源码 underscore]JavaScript 中如何判断两个元素是否 "相同" Why underscore 最近开始看 underscore.js ...
随机推荐
- SpringBoot的学习【4.快速实现一个SpringBoo的应用】
1.引子 正常创建一个 Spring Boot 应用的顺序: 创建 Maven 项目 pom 文件导入依赖(参照 Spring 官方文档) 编写主程序 编写业务逻辑 但其实IDE( idea 和 Sp ...
- MVVM设计模式加RAC响应式编程
一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼. 每次做完项目过后,都会被自己庞大的ViewController代码吓坏,不管是什么网络请求.networking data ...
- Windows CMD 支持ls命令
/********************************************************************** * Windows CMD 支持ls命令 * 说明: * ...
- Python全栈之路----类型转换
显式转换 int(x [,base]) ⇒ 将x转换为一个十进制的整数 long(x [,base]) ⇒ 将x转换为一个十进制的长整数 float(x) ⇒ 将x转换为一个浮点数 str(objec ...
- Nginx安装详细指南
nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有g ...
- Mad LIbs小游戏
c1=input('请输入摄氏温度;') c2=float(c1)*9/5+32 print('摄氏温度转换成华氏温度是{}'.format(c2)) name1=input('请输入名字:') na ...
- Linux上的文件管理类命令(2)
Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示: wc 统计文件中的字节数.单词数.行数.并将统计结果显示输出 -c, --bytes 打印字节数 [root@qingchen ...
- ue4 C++ json数据的读写
这是改变恢复机制的json文件的例子 //写入 TSharedPtr<FJsonObject> RootObject = MakeShareable(newFJsonObject); T ...
- LeetCode - Maximum Frequency Stack
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- Intellij中部署Tomcat(详细版本-介绍了部署完之后的详细路径)
https://blog.csdn.net/HughGilbert/article/details/56424137 要点如下: 1. CATALINA_HOME即Tomcat的安装目录 2. CAT ...