阶段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:
王阳
2026-07-21 11:16:25 +08:00
parent 5609532c80
commit 159603341e
19 changed files with 15507 additions and 7406 deletions
File diff suppressed because it is too large Load Diff
+62
View File
@@ -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 };
+9
View File
@@ -0,0 +1,9 @@
/*
* 软件名称:MoePlayer
* 版本:X3
* 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com)
* 开源协议:MIT
*/
import moeplayerEmbed from './core/moeplayerEmbed.js';
export default moeplayerEmbed;
+69
View File
@@ -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 };
+64
View File
@@ -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 };
+220
View File
@@ -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是否已加载
* @filejs文件路径
*/
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 };
+260
View File
@@ -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 };
+186
View File
@@ -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 };
+26
View File
@@ -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 };
+99
View File
@@ -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 };