阶段2:拆分为 ES Module + Rollup 构建,重写 README
- src/ 下拆分为入口/语言包/默认配置/主函数/工具模块,主函数整体搬入零改动 - rollup 打包 UMD(moeplayer.js + moeplayer.min.js),用户使用方式不变 - 库拷贝逻辑移至 scripts/copy-libs.js - README 重写:中文文档、快速开始、路线图、致谢原作者 - index.html 增加皮肤切换演示(默认/红色/西瓜)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* videoObjectDefault
|
||||
* 功能:静态变量,默认播放配置,当外部传递过来的配置有未包含在varsDefault里的,则使用varsDefault里的配置
|
||||
*/
|
||||
var videoObjectDefault= {
|
||||
container: '',//视频容器的ID
|
||||
volume: 0.8,//默认音量,范围0-1
|
||||
poster: '',//封面图片地址
|
||||
autoplay: false,//是否自动播放
|
||||
loop: false,//是否需要循环播放
|
||||
live: false,//是否是直播
|
||||
rotate:0,//视频旋转角度
|
||||
zoom:0,//默认缩放比例
|
||||
ad:null,//广告
|
||||
backLive:false,//显示返回直播按钮
|
||||
seek: 0,//默认需要跳转的秒数
|
||||
next: null,//下一集按钮动作
|
||||
loaded: '',//加载播放器后调用的函数
|
||||
plug: '',//使用插件
|
||||
duration:0,//视频总时间
|
||||
preview: null,//预览图片对象
|
||||
prompt: null,//提示点功能
|
||||
crossOrigin:'',//跨域请求字符
|
||||
video: null,//视频地址
|
||||
type:'',//视频类型
|
||||
playbackrate: 1,//默认倍速
|
||||
ended:null,//结束显示的内容
|
||||
webFull:false,//页面全屏按钮事件
|
||||
theatre:null,//剧场模式
|
||||
controls:false,//是否显示自带控制栏
|
||||
rightBar:null,//是否开启右边控制栏
|
||||
smallWindows:null,//是否启用小窗口模式
|
||||
smallWindowsDrag:true,//当处于小窗口模式时是否可拖动播放器
|
||||
screenshot:false,//截图功能是否开启
|
||||
timeScheduleAdjust:1,//是否可调节播放进度,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动
|
||||
logo:'',//logo
|
||||
menu:null,//右键菜单
|
||||
information:{//关于
|
||||
'Load:':'{loadTime} second',
|
||||
'Duration:':'{duration} second',
|
||||
'Size:':'{videoWidth}x{videoHeight}',
|
||||
'Volume:':'{volume}%',
|
||||
'Fps:':'{fps}fps',
|
||||
'Sudio decoded:':'{audioDecodedByteCount} Byte',
|
||||
'Video decoded:':'{videoDecodedByteCount} Byte'
|
||||
},
|
||||
track:null,//字幕
|
||||
title:'',//视频标题
|
||||
language:'',//语言包文件
|
||||
barHideTime:1500,//控制栏隐藏时间
|
||||
playbackrateOpen:true,//是否开启控制栏倍速选项
|
||||
playbackrateList:[0.75,1,1.25,1.5,2,4],//倍速配置值
|
||||
cookie:null,//开启cookie功能
|
||||
domain:null,//指定cookie保存的域
|
||||
cookiePath:'/',//指定cookie保存路径
|
||||
documentFocusPause:false,//窗口失去焦点后暂停播放
|
||||
mouseWheelVolume:2,//是否启用鼠标滚轮调节音量功能,0=不启用,1=启用,2=全屏时才启用
|
||||
keyVolume:2,//是否启用键盘控制音量调节,0=不启用,1=启用,2=全屏时才启用
|
||||
errorShow:true//是否显示错误信息
|
||||
};
|
||||
|
||||
export { videoObjectDefault };
|
||||
@@ -0,0 +1,9 @@
|
||||
/*
|
||||
* 软件名称:MoePlayer
|
||||
* 版本:X3
|
||||
* 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com)
|
||||
* 开源协议:MIT
|
||||
*/
|
||||
import moeplayerEmbed from './core/moeplayerEmbed.js';
|
||||
|
||||
export default moeplayerEmbed;
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* language
|
||||
* 功能:静态变量,包含播放器用到的默认语言包
|
||||
* 引入其它语言js后该变量将被替换成新引入的语言包
|
||||
*/
|
||||
var language={
|
||||
play:'%E6%92%AD%E6%94%BE',
|
||||
pause:'%E6%9A%82%E5%81%9C',
|
||||
refresh:'%E9%87%8D%E6%92%AD',
|
||||
full:'%E5%85%A8%E5%B1%8F',
|
||||
exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F',
|
||||
webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F',
|
||||
exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F',
|
||||
theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F',
|
||||
exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F',
|
||||
volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A',
|
||||
muted:'%E9%9D%99%E9%9F%B3',
|
||||
exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F',
|
||||
seek:'seek%EF%BC%9A',
|
||||
waiting:'%E7%BC%93%E5%86%B2',
|
||||
live:'%E7%9B%B4%E6%92%AD%E4%B8%AD',
|
||||
backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD',
|
||||
lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A',
|
||||
next:'%E4%B8%8B%E4%B8%80%E9%9B%86',
|
||||
screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE',
|
||||
smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD',
|
||||
playbackrate:'%E5%80%8D%E9%80%9F',
|
||||
playbackrateSuffix:'%E5%80%8D',
|
||||
track:'%E5%AD%97%E5%B9%95',
|
||||
noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95',
|
||||
definition:'%E6%B8%85%E6%99%B0%E5%BA%A6',
|
||||
switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A',
|
||||
closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A',
|
||||
closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A',
|
||||
second:'%E7%A7%92',
|
||||
details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85',
|
||||
copy:'%E5%A4%8D%E5%88%B6',
|
||||
copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81',
|
||||
smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF',
|
||||
smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD',
|
||||
screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...',
|
||||
screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD',
|
||||
loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE',
|
||||
loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE',
|
||||
close:'%E5%85%B3%E9%97%AD',
|
||||
down:'%E4%B8%8B%E8%BD%BD',
|
||||
p50:'50%25',
|
||||
p75:'75%25',
|
||||
p100:'100%25',
|
||||
timeScheduleAdjust:{
|
||||
prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8',
|
||||
prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B',
|
||||
prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B',
|
||||
prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9',
|
||||
prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86'
|
||||
},
|
||||
error:{
|
||||
noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF',
|
||||
supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8',
|
||||
videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8',
|
||||
loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5',
|
||||
emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF',
|
||||
screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5',
|
||||
ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF',
|
||||
noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8'
|
||||
}
|
||||
};
|
||||
|
||||
export { language };
|
||||
@@ -0,0 +1,64 @@
|
||||
import { isUndefined } from './type.js';
|
||||
|
||||
/*
|
||||
* cookie
|
||||
* 功能,操作cookie
|
||||
*/
|
||||
function cookie(name,value,domain,path){
|
||||
if(isUndefined(domain)){
|
||||
domain='';
|
||||
}
|
||||
if(isUndefined(path)){
|
||||
path='/';
|
||||
}
|
||||
var ckStr=';domain='+domain+';path='+path;
|
||||
if(location.protocol=='https'){
|
||||
ckStr+=';SameSite=None;Secure=true';
|
||||
}
|
||||
var set=function(name,value){
|
||||
var time = 360*24*60*60*1000;
|
||||
var exp = new Date();
|
||||
exp.setTime(exp.getTime() + time);
|
||||
try{
|
||||
document.cookie = name + '='+ escape (value) + ';expires=' + exp.toGMTString()+ckStr;
|
||||
}
|
||||
catch(event){console.error(event)}
|
||||
},
|
||||
get=function(name){
|
||||
var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)');
|
||||
if(arr=document.cookie.match(reg)){
|
||||
return unescape(arr[2]);
|
||||
}
|
||||
else{
|
||||
return null;
|
||||
}
|
||||
},
|
||||
del=function(name){
|
||||
var exp = new Date();
|
||||
exp.setTime(exp.getTime() - 1);
|
||||
var cval=get(name);
|
||||
if(cval!=null){
|
||||
document.cookie= name + '='+cval+';expires='+exp.toGMTString()+ckStr;
|
||||
}
|
||||
};
|
||||
if(!isUndefined(name) && !isUndefined(value)){
|
||||
if(value=='delete'){
|
||||
del(name);
|
||||
return null;
|
||||
}
|
||||
else{
|
||||
set(name,value);
|
||||
return get(name);
|
||||
}
|
||||
|
||||
}
|
||||
else if(!isUndefined(name) && isUndefined(value)){
|
||||
return get(name);
|
||||
}
|
||||
else if(!isUndefined(name)){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export { cookie };
|
||||
@@ -0,0 +1,220 @@
|
||||
import { valType, isUndefined } from './type.js';
|
||||
|
||||
/*
|
||||
* documentReady
|
||||
* 功能:判断页面加载完成
|
||||
* @fn:页面加载完成后执行的函数
|
||||
*/
|
||||
function documentReady(fn) {
|
||||
var isReady = false;
|
||||
var timer = null;
|
||||
var doReady = function() {
|
||||
if(timer) clearInterval(timer);
|
||||
if(isReady) return;
|
||||
isReady = true;
|
||||
if(valType(fn) == 'function') {
|
||||
fn();
|
||||
}
|
||||
};
|
||||
var bodyLoad = function() {
|
||||
timer = setInterval(function() {
|
||||
try {
|
||||
if(!isUndefined(document.readyState) && document.readyState == 'complete') {
|
||||
doReady();
|
||||
}
|
||||
} catch(event) {};
|
||||
}, 10);
|
||||
};
|
||||
var w3c = function() {
|
||||
|
||||
if(valType(fn) == 'function') {
|
||||
fn();
|
||||
}
|
||||
removeListener(window, 'load', w3c);
|
||||
};
|
||||
if(!isUndefined(document.body)){
|
||||
if(valType(fn) == 'function') {
|
||||
fn();
|
||||
}
|
||||
}
|
||||
else{
|
||||
try {
|
||||
addListener(window, 'load', w3c);
|
||||
} catch(event) {
|
||||
bodyLoad();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* checkJs
|
||||
* 功能:判断js是否已加载
|
||||
* @file:js文件路径
|
||||
*/
|
||||
function checkJs(file) {
|
||||
var scriptList = document.scripts;
|
||||
for (var i = 0; i < scriptList.length; i++) {
|
||||
if(scriptList[i].src==file){
|
||||
return scriptList[i];
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* getMaxZIndex
|
||||
* 功能:获取当前页面最大深度
|
||||
*/
|
||||
function getMaxZIndex() {
|
||||
var arr = document.all || document.querySelectorAll('*');
|
||||
var maxZ = -1;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
var temp = null;
|
||||
try {
|
||||
temp = window.getComputedStyle(arr[i], null).zIndex;
|
||||
} catch (event) {
|
||||
if (arr[i].style) {
|
||||
temp = arr[i].style.zIndex;
|
||||
}
|
||||
}
|
||||
if (temp != 'auto' && parseInt(temp) > maxZ) {
|
||||
maxZ = parseInt(temp);
|
||||
}
|
||||
}
|
||||
return maxZ;
|
||||
}
|
||||
|
||||
/*
|
||||
* getWindowSize
|
||||
* 功能:获取window的宽和高
|
||||
*/
|
||||
function getWindowSize() {
|
||||
return {
|
||||
width: window.innerWidth,
|
||||
height: window.innerHeight
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* prev
|
||||
* 功能:获取指定节点前一个同胞节点
|
||||
* @ele:要获取的节点
|
||||
*/
|
||||
function prev(ele) {
|
||||
var e = ele.previousSibling;
|
||||
if (e == null) { //测试同胞节点是否存在,否则返回空
|
||||
return null;
|
||||
}
|
||||
if (e.nodeType == 3) { //如果同胞节点为文本节点
|
||||
var t = prev(e);
|
||||
if (t && t.nodeType == 1) {
|
||||
return t;
|
||||
}
|
||||
} else {
|
||||
if (e.nodeType == 1) { //确认节点为节点节点才返回
|
||||
return e;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* next
|
||||
* 功能:获取指定节点下一个同胞节点
|
||||
* @ele:要获取的节点
|
||||
*/
|
||||
function next(ele) {
|
||||
var e = ele.nextSibling;
|
||||
if (e == null) { //测试同胞节点是否存在,否则返回空
|
||||
return null;
|
||||
}
|
||||
if (e.nodeType == 3) { //如果同胞节点为文本节点
|
||||
var t = next(e);
|
||||
if (t && t.nodeType == 1) {
|
||||
return t;
|
||||
}
|
||||
} else {
|
||||
if (e.nodeType == 1) { //确认节点为节点才返回
|
||||
return e;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* addListener
|
||||
* 功能:事件监听
|
||||
* @ele:监听对象,@e:事件名称,@f:返回事件函数
|
||||
*/
|
||||
function addListener(ele, e, f, t) {
|
||||
if (isUndefined(t)) {
|
||||
t = false;
|
||||
}
|
||||
if (ele.addEventListener) {
|
||||
try {
|
||||
ele.addEventListener(e, f, t);
|
||||
} catch (event) {}
|
||||
} else if (ele.attachEvent) {
|
||||
try {
|
||||
ele.attachEvent('on' + e, f);
|
||||
} catch (event) {}
|
||||
} else {
|
||||
ele['on' + e] = f;
|
||||
}
|
||||
if(isUndefined(ele.listenerList)){
|
||||
ele.listenerList=[];
|
||||
}
|
||||
ele.listenerList.push([e,f]);
|
||||
return ele;
|
||||
};
|
||||
|
||||
/*
|
||||
* removeListener
|
||||
* 功能:删除事件监听
|
||||
* @ele:监听对象,@e:事件名称,@f:返回事件函数
|
||||
*/
|
||||
function removeListener(ele, e, f, t) {
|
||||
if (isUndefined(t)) {
|
||||
t = false;
|
||||
}
|
||||
if (ele.removeEventListener) {
|
||||
try {
|
||||
ele.removeEventListener(e, f, t);
|
||||
} catch (e) {}
|
||||
} else if (ele.detachEvent) {
|
||||
try {
|
||||
ele.detachEvent('on' + e, f);
|
||||
} catch (e) {}
|
||||
} else {
|
||||
ele['on' + e] = null;
|
||||
}
|
||||
if(!isUndefined(ele.listenerList)){
|
||||
var temp=[];
|
||||
for(var i=0;i<ele.listenerList.length;i++){
|
||||
if(ele.listenerList[i][0]!=e || ele.listenerList[i][1]!=f){
|
||||
temp.push(ele.listenerList[i]);
|
||||
}
|
||||
}
|
||||
ele.listenerList=temp;
|
||||
}
|
||||
return ele;
|
||||
}
|
||||
|
||||
/*
|
||||
* documentHidden
|
||||
* 功能,监听页面切换到其它标签,执行fn函数
|
||||
*/
|
||||
function documentHidden(fn){
|
||||
if(!isUndefined(document.visibilityState)){
|
||||
fn(document.visibilityState === 'visible'?'show':'hidden');
|
||||
addListener(document,'visibilitychange',function(){
|
||||
fn(document.visibilityState === 'visible'?'show':'hidden');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export { prev, next, addListener, removeListener, getMaxZIndex, getWindowSize, documentReady, documentHidden, checkJs };
|
||||
@@ -0,0 +1,260 @@
|
||||
import { isUndefined, valType } from './type.js';
|
||||
|
||||
/*
|
||||
* formatSeconds
|
||||
* 功能:將秒转化成时分秒
|
||||
*/
|
||||
function formatSeconds(val) {
|
||||
if(isUndefined(val)) val=0;
|
||||
var result = parseInt(val);
|
||||
if(isUndefined(result)) result=0;
|
||||
if(result<0) result=0;
|
||||
var h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600),
|
||||
m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60)),
|
||||
s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60)),
|
||||
res = '';
|
||||
if(h !== '00') res += h+':';
|
||||
res += m+':'+s;
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* date
|
||||
* 功能:格式化的时间字符串
|
||||
*/
|
||||
function date(format, timestamp) {
|
||||
if(isUndefined(timestamp)){
|
||||
timestamp=new Date();
|
||||
}
|
||||
if(timestamp.toString().length<13) timestamp=timestamp*1000;
|
||||
var a, jsdate = ((timestamp) ? new Date(timestamp) : new Date());
|
||||
var pad = function(n, c) {
|
||||
if((n = n + '').length < c) {
|
||||
return new Array(++c - n.length).join('0') + n;
|
||||
} else {
|
||||
return n;
|
||||
}
|
||||
};
|
||||
var txt_weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
||||
var txt_ordin = {
|
||||
1: 'st',
|
||||
2: 'nd',
|
||||
3: 'rd',
|
||||
21: 'st',
|
||||
22: 'nd',
|
||||
23: 'rd',
|
||||
31: 'st'
|
||||
};
|
||||
var txt_months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
||||
var f = {
|
||||
// Day
|
||||
d: function() {
|
||||
return pad(f.j(), 2)
|
||||
},
|
||||
D: function() {
|
||||
return f.l().substr(0, 3)
|
||||
},
|
||||
j: function() {
|
||||
return jsdate.getDate()
|
||||
},
|
||||
l: function() {
|
||||
return txt_weekdays[f.w()]
|
||||
},
|
||||
N: function() {
|
||||
return f.w() + 1
|
||||
},
|
||||
S: function() {
|
||||
return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th'
|
||||
},
|
||||
w: function() {
|
||||
return jsdate.getDay()
|
||||
},
|
||||
z: function() {
|
||||
return(jsdate - new Date(jsdate.getFullYear() + '/1/1')) / 864e5 >> 0
|
||||
},
|
||||
|
||||
// Week
|
||||
W: function() {
|
||||
var a = f.z(),
|
||||
b = 364 + f.L() - a;
|
||||
var nd2, nd = (new Date(jsdate.getFullYear() + '/1/1').getDay() || 7) - 1;
|
||||
if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) {
|
||||
return 1;
|
||||
} else {
|
||||
if(a <= 2 && nd >= 4 && a >= (6 - nd)) {
|
||||
nd2 = new Date(jsdate.getFullYear() - 1 + '/12/31');
|
||||
return date('W', Math.round(nd2.getTime() / 1000));
|
||||
} else {
|
||||
return(1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Month
|
||||
F: function() {
|
||||
return txt_months[f.n()]
|
||||
},
|
||||
m: function() {
|
||||
return pad(f.n(), 2)
|
||||
},
|
||||
M: function() {
|
||||
return f.F().substr(0, 3)
|
||||
},
|
||||
n: function() {
|
||||
return jsdate.getMonth() + 1
|
||||
},
|
||||
t: function() {
|
||||
var n;
|
||||
if((n = jsdate.getMonth() + 1) == 2) {
|
||||
return 28 + f.L();
|
||||
} else {
|
||||
if(n & 1 && n < 8 || !(n & 1) && n > 7) {
|
||||
return 31;
|
||||
} else {
|
||||
return 30;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Year
|
||||
L: function() {
|
||||
var y = f.Y();
|
||||
return(!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0
|
||||
},
|
||||
//o not supported yet
|
||||
Y: function() {
|
||||
return jsdate.getFullYear()
|
||||
},
|
||||
y: function() {
|
||||
return(jsdate.getFullYear() + '').slice(2)
|
||||
},
|
||||
|
||||
// Time
|
||||
a: function() {
|
||||
return jsdate.getHours() > 11 ? 'pm' : 'am'
|
||||
},
|
||||
A: function() {
|
||||
return f.a().toUpperCase()
|
||||
},
|
||||
B: function() {
|
||||
// peter paul koch:
|
||||
var off = (jsdate.getTimezoneOffset() + 60) * 60;
|
||||
var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
|
||||
var beat = Math.floor(theSeconds / 86.4);
|
||||
if(beat > 1000) beat -= 1000;
|
||||
if(beat < 0) beat += 1000;
|
||||
if((String(beat)).length == 1) beat = '00' + beat;
|
||||
if((String(beat)).length == 2) beat = '0' + beat;
|
||||
return beat;
|
||||
},
|
||||
g: function() {
|
||||
return jsdate.getHours() % 12 || 12
|
||||
},
|
||||
G: function() {
|
||||
return jsdate.getHours()
|
||||
},
|
||||
h: function() {
|
||||
return pad(f.g(), 2)
|
||||
},
|
||||
H: function() {
|
||||
return pad(jsdate.getHours(), 2)
|
||||
},
|
||||
i: function() {
|
||||
return pad(jsdate.getMinutes(), 2)
|
||||
},
|
||||
s: function() {
|
||||
return pad(jsdate.getSeconds(), 2)
|
||||
},
|
||||
//u not supported yet
|
||||
|
||||
// Timezone
|
||||
//e not supported yet
|
||||
//I not supported yet
|
||||
O: function() {
|
||||
var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4);
|
||||
if(jsdate.getTimezoneOffset() > 0) t = '-' + t;
|
||||
else t = '+' + t;
|
||||
return t;
|
||||
},
|
||||
P: function() {
|
||||
var O = f.O();
|
||||
return(O.substr(0, 3) + ':' + O.substr(3, 2))
|
||||
},
|
||||
//T not supported yet
|
||||
//Z not supported yet
|
||||
|
||||
// Full Date/Time
|
||||
c: function() {
|
||||
return f.Y() + '-' + f.m() + '-' + f.d() + 'T' + f.h() + ':' + f.i() + ':' + f.s() + f.P()
|
||||
},
|
||||
//r not supported yet
|
||||
U: function() {
|
||||
return Math.round(jsdate.getTime() / 1000)
|
||||
}
|
||||
};
|
||||
|
||||
return format.replace(/([a-zA-Z])/g,function(t, s) {
|
||||
var ret='';
|
||||
if(t != s) {
|
||||
// escaped
|
||||
ret = s;
|
||||
} else if(f[s]) {
|
||||
// a date function exists
|
||||
ret = f[s]();
|
||||
} else {
|
||||
// nothing special
|
||||
ret = s;
|
||||
}
|
||||
return ret;
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* arrayToString
|
||||
* 功能,二维数组传化成字符串
|
||||
*/
|
||||
function arrayToString(arr) {
|
||||
var str='';
|
||||
if(!isUndefined(arr)){
|
||||
for(var i=0;i<arr.length;i++){
|
||||
var temp=arr[i];
|
||||
if(i>0){
|
||||
str+=',';
|
||||
}
|
||||
for(var y=0;y<temp.length;y++){
|
||||
if(y>0){
|
||||
str+=';';
|
||||
}
|
||||
if(valType(temp[y])=='number'){
|
||||
str+=parseInt(temp[y]*100);
|
||||
}
|
||||
else{
|
||||
str+=temp[y];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* stringToArray
|
||||
* 功能,字符串转化成二维数组
|
||||
*/
|
||||
function stringToArray(str) {
|
||||
var newArr=[];
|
||||
if(!isUndefined(str)){
|
||||
var arr=str.split(',');
|
||||
for(var i=0;i<arr.length;i++){
|
||||
var temp=arr[i].split(';');
|
||||
temp[1]=parseInt(temp[1])*0.01;
|
||||
temp[2]=parseInt(temp[2])*0.01;
|
||||
newArr.push(temp);
|
||||
}
|
||||
}
|
||||
return newArr;
|
||||
}
|
||||
|
||||
|
||||
export { formatSeconds, date, arrayToString, stringToArray };
|
||||
@@ -0,0 +1,186 @@
|
||||
import { standardization, isUndefined, valType } from './type.js';
|
||||
import { addListener } from './dom.js';
|
||||
|
||||
/*
|
||||
* ajax
|
||||
* 功能:ajax功能
|
||||
* @cObj:传递的参数,包含请求地址,请求类型,编码等
|
||||
*/
|
||||
function ajax(cObj) {
|
||||
var callback = null;
|
||||
var obj = {
|
||||
method: 'get',//请求类型
|
||||
dataType: 'json',//请求的数据类型
|
||||
charset: 'utf-8',
|
||||
async: true,//true表示异步,false表示同步
|
||||
url: '',
|
||||
data: null,
|
||||
success: null,
|
||||
error:null
|
||||
};
|
||||
obj = standardization(obj, cObj);
|
||||
if (isUndefined(obj['url'])) {
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* errorFun
|
||||
*功能:执行error
|
||||
*/
|
||||
var errorFun=function(info){
|
||||
if(!isUndefined(obj['error']) && valType(obj['error'])=='function'){
|
||||
obj['error'](info);
|
||||
}
|
||||
else{
|
||||
obj['success'](null);
|
||||
}
|
||||
};
|
||||
/*
|
||||
* successFun
|
||||
*功能:执行success
|
||||
*/
|
||||
var successFun=function(success){
|
||||
if(!isUndefined(obj['success']) && valType(obj['success'])=='function'){
|
||||
obj['success'](success);
|
||||
}
|
||||
};
|
||||
/*
|
||||
* createXHR
|
||||
*功能:用来为ajax函数提供支持
|
||||
*/
|
||||
var createXHR=function() {
|
||||
if (window.XMLHttpRequest) {
|
||||
return new XMLHttpRequest();
|
||||
} else if (window.ActiveXObject) {
|
||||
try {
|
||||
return new ActiveXObject('Microsoft.XMLHTTP');
|
||||
} catch(event) {
|
||||
try {
|
||||
return new ActiveXObject('Msxml2.XMLHTTP');
|
||||
} catch(event) {}
|
||||
}
|
||||
}
|
||||
};
|
||||
/*
|
||||
* formatParams
|
||||
* 功能:将对象转成地址字符串,为ajax函数提供支持
|
||||
* @obj:传递一个对象
|
||||
*/
|
||||
var formatParams=function(obj) {
|
||||
var arr = [];
|
||||
for (var key in obj) {
|
||||
arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
|
||||
}
|
||||
return arr.join('&');
|
||||
};
|
||||
if (valType(cObj) != 'object') {
|
||||
if(!isUndefined(obj['error'])){
|
||||
obj.error(event);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (obj.dataType === 'json' || obj.dataType === 'text' || obj.dataType === 'html' || obj.dataType === 'xml') {
|
||||
var xhr = createXHR();
|
||||
callback = function() {
|
||||
//判断http的交互是否成功
|
||||
if (xhr.status === 200) {
|
||||
if (obj.dataType === 'json') {
|
||||
try {
|
||||
successFun(eval('(' + xhr.responseText + ')')); //回调传递参数
|
||||
}
|
||||
catch(event) {
|
||||
successFun(null);
|
||||
}
|
||||
} else {
|
||||
successFun(xhr.responseText); //回调传递参数
|
||||
}
|
||||
}
|
||||
else {
|
||||
errorFun({code:xhr.status,message:xhr.statusText});
|
||||
}
|
||||
};
|
||||
obj.data = formatParams(obj.data); //通过params()将名值对转换成字符串
|
||||
if (obj.method === 'get' && !isUndefined(obj.data)) {
|
||||
if (obj.data != '') {
|
||||
if (obj.url.indexOf('?') == -1) {
|
||||
obj.url += '?' + obj.data
|
||||
} else {
|
||||
obj.url += '&' + obj.data;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (obj.async === true) { //true表示异步,false表示同步
|
||||
addListener(xhr,'readystatechange',function(event){
|
||||
if (this.readyState === 4 && callback != null) { //判断对象的状态是否交互完成
|
||||
callback(); //回调
|
||||
}
|
||||
});
|
||||
}
|
||||
xhr.open(obj.method, obj.url, obj.async);
|
||||
if (obj.method === 'post') {
|
||||
try{
|
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||
xhr.setRequestHeader('charset', obj['charset']);
|
||||
xhr.send(obj.data);
|
||||
}
|
||||
catch(event){
|
||||
callback();
|
||||
}
|
||||
}
|
||||
else {
|
||||
try{
|
||||
xhr.send(null); //get方式则填null
|
||||
}
|
||||
catch(event){
|
||||
callback();
|
||||
}
|
||||
}
|
||||
if (obj.async === false) { //同步
|
||||
callback();
|
||||
}
|
||||
|
||||
}
|
||||
else if (obj.dataType === 'jsonp') {
|
||||
var oHead = document.getElementsByTagName('head')[0];
|
||||
var oScript = document.createElement('script');
|
||||
var callbackName = 'callback' + new Date().getTime();
|
||||
var params = formatParams(obj.data) + '&callback=' + callbackName; //按时间戳拼接字符串
|
||||
//拼接好src
|
||||
oScript.src = obj.url.split('?') + '?' + params;
|
||||
//插入script标签
|
||||
oHead.insertBefore(oScript, oHead.firstChild);
|
||||
//jsonp的回调函数
|
||||
window[callbackName] = function(json) {
|
||||
if(!isUndefined(obj['success']) && valType(obj['success'])==='function'){
|
||||
obj['success'](json);
|
||||
}
|
||||
oHead.removeChild(oScript);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* dataURLtoBlob
|
||||
* 功能,base64转blob
|
||||
*/
|
||||
function dataURLtoBlob(dataurl) {
|
||||
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
||||
while (n--) {
|
||||
u8arr[n] = bstr.charCodeAt(n);
|
||||
}
|
||||
return new Blob([u8arr], { type: mime });
|
||||
}
|
||||
|
||||
/*
|
||||
* getApp
|
||||
* 功能,获取平台类型是否是iphone
|
||||
*/
|
||||
function getApp(){
|
||||
var u = navigator.userAgent.toLowerCase();
|
||||
if(u.indexOf('iphone')>-1){
|
||||
return 'iphone';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export { ajax, dataURLtoBlob, getApp };
|
||||
@@ -0,0 +1,26 @@
|
||||
import { isUndefined } from './type.js';
|
||||
|
||||
/*
|
||||
* getPath
|
||||
* 功能:获取该js文件所在路径
|
||||
*/
|
||||
function getPath(siz) {
|
||||
var scriptList = document.scripts,
|
||||
thisPath = scriptList[scriptList.length - 1].src;
|
||||
for (var i = 0; i < scriptList.length; i++) {
|
||||
var scriptName = scriptList[i].getAttribute('name') || scriptList[i].getAttribute('data-name');
|
||||
var src = scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/') + 1, scriptList[i].src.lastIndexOf('.'));
|
||||
if ((scriptName && (scriptName == 'moeplayer' || scriptName == 'moeplayer.min')) || (scriptList[i].src && (src == 'moeplayer' || src == 'moeplayer.min'))) {
|
||||
thisPath = scriptList[i].src;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var path=thisPath.substring(0, thisPath.lastIndexOf('/js/') + 1);
|
||||
if(!isUndefined(siz)){
|
||||
path+=siz+'/';
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
export { getPath };
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* standardization
|
||||
* 功能:将对象Object标准化,将n对象替换进o对象
|
||||
* @o:标准化对象,@n:外部传递对象
|
||||
*/
|
||||
function standardization(o, n) { //n替换进o
|
||||
var h = {};
|
||||
var k;
|
||||
for (k in o) {
|
||||
h[k] = o[k];
|
||||
}
|
||||
for (k in n) {
|
||||
if(k in h){
|
||||
h[k] = n[k];
|
||||
}
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
/*
|
||||
* mergeObj
|
||||
* 功能:将新对象合并到原对象中,需要确保原对像里有对应的值并且类型一样
|
||||
* @o:原对象,@n:新对象
|
||||
*/
|
||||
function mergeObj(o,n){
|
||||
var h = {};
|
||||
var k;
|
||||
for (k in o) {
|
||||
h[k] = o[k];
|
||||
}
|
||||
for (k in n) {
|
||||
if(k in h){
|
||||
switch(valType(h[k])){
|
||||
case 'object':
|
||||
if(valType(n[k])=='object'){
|
||||
h[k] = mergeObj(h[k],n[k]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if(valType(h[k])==valType(n[k])){
|
||||
h[k] = n[k];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
/*
|
||||
* valType
|
||||
* 功能:判断变量类型
|
||||
*/
|
||||
function valType(val) {
|
||||
if(typeof val==='undefined') return 'undefined';
|
||||
var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase();
|
||||
if(str.substr(0,4)=='html' && (str.substr(-7)=='element' || str.substr(-8)=='document' || str=='window')){
|
||||
str='htmlobject';
|
||||
}
|
||||
if(str=='htmlcollection' || str=='nodelist'){
|
||||
str='htmlarray';
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* isUndefined
|
||||
* 功能:判断变量是否存在或值是否为undefined
|
||||
*/
|
||||
function isUndefined(val) {
|
||||
try {
|
||||
return valType(val)==='undefined' || val === undefined || val === null || (valType(val)==='number' && isNaN(val));
|
||||
} catch (event) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* decodeURIString
|
||||
* 功能,解码中文
|
||||
*/
|
||||
function decodeURIString(obj){
|
||||
for(var k in obj){
|
||||
if(valType(obj[k])=='string' && obj[k]){
|
||||
try{
|
||||
obj[k]=decodeURI(obj[k]);
|
||||
}
|
||||
catch(event){}
|
||||
}
|
||||
if(valType(obj[k])=='object'){
|
||||
obj[k]=decodeURIString(obj[k]);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
export { standardization, mergeObj, valType, isUndefined, decodeURIString };
|
||||
Reference in New Issue
Block a user