js工具类
2026-04-29 23:34:39
330
分类:javascript归档
js工具类
(function ($, window) {
/**
* 常用工具类
* Create By 黄飞 2017/07/04
* Update on 2018/07/20
*/
var apiUtil = {
debug: true, //调试模式
print: function (data) {
if (apiUtil.debug) console.log(data);
},
//动态添加js脚本
loadScript: function (url) {
var head = document.getElementsByTagName('head').item(0);
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
head.appendChild(oScript);
},
//动态加载css脚本
loadCss: function (url) {
var head = document.getElementsByTagName('head')[0];
var link = document.createElement('link');
link.type = 'text/css';
link.rel = 'stylesheet';
link.href = url;
head.appendChild(link);
},
//动态添加css代码
appendCss: function (code) {
var style = document.createElement('style');
style.type = 'text/css';
style.rel = 'stylesheet';
style.appendChild(document.createTextNode(code));
var head = document.getElementsByTagName('head')[0];
head.appendChild(style);
},
/**
* 动态加载Iframe
* @param {string} url 脚本地址
* @param {string} style 加载样式
* @param {function} callback 回调函数
*/
loadIframe: function (url, style, callback) {
var body = document.getElementsByTagName('body')[0];
var iframe = document.createElement('iframe');
iframe.src = url;
iframe.style = style || 'display:none;width:0px;height:0px;';
if (typeof(callback) == 'function') {
iframe.onload = iframe.onreadystatechange = function () {
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
callback();
iframe.onload = iframe.onreadystatechange = null;
}
};
}
body.appendChild(iframe);
},
//获取对象类型
getObjectType: function (obj) {
//tostring会返回对应不同的标签的构造函数
var toString = Object.prototype.toString;
var map = {
'[object Object]': 'object',
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
};
if (obj instanceof Element) {
return 'element';
}
return map[toString.call(obj)];
},
//获取地址栏参数
getUrlParam: function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]);
return null;
},
/**
* 构造类继承关系
* @param {Function} clazz 源类
* @param {Function} baseClazz 基类
*/
inherits: function (clazz, baseClazz) {
var clazzPrototype = clazz.prototype;
function F() {}
F.prototype = baseClazz.prototype;
clazz.prototype = new F();
for (var prop in clazzPrototype) {
clazz.prototype[prop] = clazzPrototype[prop];
}
clazz.prototype.constructor = clazz;
clazz.superClass = baseClazz;
},
//1.对象深拷贝(同$.extend(true,{},obj))
//2.数组深拷贝(同$.extend(true,[],obj))
clone: function (source) {
if (typeof source === 'object') {
var newObj = {};
for (let key in source) {
newObj[key] = apiUtil.clone(source[key]);
}
return newObj;
}
else if (typeof source === 'array') {
return source.slice(0);
}
else {
return source;
}
},
/**
* 对象递归合并覆盖(相比比$.extend()未实现多参数)
* @param {*} target 目标对象
* @param {*] source 拷贝对象
* @param {boolean} overlay 是否覆盖
* @returns {*} target
*/
assign: function (target, source, overlay) {
for (let key in target) {
if (typeof target[key] === 'object' && overlay) {
source[key] = apiUtil.assign(target[key], source[key], overlay);
}
}
Object.assign(target, source);//Object.assign()未多级合并,所以使用递归实现
return target;
},
/**
* 对象深拷贝
* @param {*} obj 拷贝对象
* @param {Boolean} deep 是否深拷贝
* @returns object
*/
deepCopy: function (obj, deep) {
var o = obj instanceof Array ? [] : {};
for (var k in obj) {
var val = obj[k];
if (deep && typeof val === "object") {
o[k] = deepCopy(val, deep);
} else {
o[k] = val;
}
}
return o;
},
/**
* 掺和类(Mixin Classes)将一个对象的方法复制到另一个类(无法复制对象的属性)
* @param {*} target 目标对象
* @param {*] source 拷贝对象
* @param {boolean} overlay 是否覆盖
* @returns target
*/
augment: function (target, source, overlay) {
target = 'prototype' in target ? target.prototype : target;
source = 'prototype' in source ? source.prototype : source;
for (var key in source) {
if (source.hasOwnProperty(key) && (overlay ? source[key] != null : target[key] == null)) {
target[key] = source[key];
}
}
return target;
},
//数组中对象根据键值排序(正序),用于类似echarts数据排序
ascSort: function (arr, sortName) {
return arr.sort(function (a, b) {
return a[sortName] - b[sortName];
});
},
//数组中对象根据键值排序(倒序)
descSort: function (arr, sortName) {
return arr.sort(function (a, b) {
return b[sortName] - a[sortName];
});
},
//数字千分位格式化,四舍五入保留小数
dataFormat: function (num, fix) {
fix = fix || 0;
try {
num = parseFloat(num).toFixed(fix) + '';
var re = /(-?\d+)(\d{3})/;
while (re.test(num)) {
num = num.replace(re, "$1,$2");
}
} catch (e) {
console.error(e);
} finally {
// num=parseFloat(num); //去掉后面的0
return num;
}
},
//数字千分位格式化,过万以万为单位,过亿以亿为单位,四舍五入保留小数
dataFormatUnit: function (num, fix) {
fix = fix || 0;
try {
var sign = ''; //正负号
if (num < 0) sign = '-';
num = Math.abs(num);
var result = '';
if (num < 10000) {
num = num.toFixed(fix);
result = apiUtil.dataFormat(num, fix);
}
else if (num >= 10000 & num < 100000000) {
num = (num / 10000).toFixed(fix);
result = apiUtil.dataFormat(num, fix) + '万';
}
else if (num >= 100000000) {
num = (num / 100000000).toFixed(fix);
result = apiUtil.dataFormat(num, fix) + '亿';
}
} catch (e) {
console.error(e);
} finally {
return sign + result;
}
},
//限制数字范围
dataLimit: function (num, min, max) {
if (num < min) num = min;
if (num > max) num = max;
return num;
},
//获取字符串长度,一个中文为两个长度
getStringLength: function (str) {
var len = 0;
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
len += 1;
}
else {
len += 2;
}
}
return len;
},
//字符串换行,一个中文为两个长度
stringWrap: function (str, num) {
var result = '';
var len = 0;
for (let i = 0; i < str.length; i++) {
result += str[i];
var c = str.charCodeAt(i);
var c2 = str.charCodeAt(i + 1);
var cn; //下一个字符串是字母或数字
if ((c2 >= 0x0001 && c2 <= 0x007e) || (0xff60 <= c2 && c2 <= 0xff9f)) {
cn = false;
}
else {
cn = true;
}
if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
//字母或数字
len += 1;
if (len % num == 0) {
result += '\n';
}
else if (cn && (len + 1) % num == 0) {
//下一个是汉字提前补位
len++;
result += '\n';
}
}
else {
//汉字由于是+2会出现跳过余数为整
len += 2;
if (len % num == 0) {
result += '\n';
}
else if ((len + 1) % num == 0) {
//差一位时提前补位
len++;
result += '\n';
}
}
}
return result;
},
//输入限制:只能输入某一类型且限制长度(现在只有数字类型)
inputLimit: function (ele, length, type) {
if (type == 'number') {
var $this = $(ele);
$this.val($this.val().replace(/\D/g, ''));
if ($this.val().length > length) {
$this.val($this.val().slice(0, length));
}
}
},
/*
* 格式化年月日时间
* @param fmt {String} 年月+时间:"yyyy-mm-dd hh:ii:ss"(可以只显示年月日或时间)
* return {String} 返回yyyy-mm-dd hh:ii:ss格式的字符串
*/
dateFormat: function (fmt,time) {
fmt = fmt || "yyyy-mm-dd hh:ii:ss";
let date;
if(time){
date = new Date(time);
}
else {
date=new Date();
}
var o = {
"m+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"i+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
},
//时间戳转时间
timestampToTime: function (timestamp) {
return apiUtil.dateFormat('',timestamp);
},
//时间转时间戳
timeToTimestamp: function (time) {
return Date.parse(time);
},
/**
* 秒数格式化为时分秒(最大单位为小时,一般用于歌曲电影时长)
* @param s 秒数
* @returns {*} 格式化后的时分秒
*/
sec_to_time: function (s) {
var t = '';
if (s > 3600) {
var hour = Math.floor(s / 3600);
var min = Math.floor(s / 60) % 60;
var sec = s % 60;
if (hour < 10) {
t = '0' + hour + ":";
} else {
t = hour + ":";
}
if (min <= 9) {
t += "0";
}
t += min + ":";
if (sec <= 9) {
t += "0";
}
t += sec.toFixed(0);
}
else {
var min = Math.floor(s / 60);
if (min < 10) min = '0' + min;
var sec = (s - Math.floor(s / 60) * 60).toFixed(0);
if (sec < 10) sec = '0' + sec;
t = min + ":" + sec;
}
return t;
},
/**
* 时间转为秒
* @param time 时间(00:00:00)
* @returns {string} 秒数
*/
time_to_sec: function (time) {
var s = '';
var hour = time.split(':')[0];
var min = time.split(':')[1];
var sec = time.split(':')[2];
s = Number(hour * 3600) + Number(min * 60) + Number(sec);
return s;
},
//将上传文件转为blob对象(二进制大对象)
getObjectURL: function (file) {
var url = window.URL.createObjectURL(file);
return url;
},
//判断有页面元素的图片是否全部加载完毕
imageAllLoad: function (images, callback) {
var index = 0;
$(images).each(function () {
$(this).load(function () {
index++;
if (index == $(images).length) return callback();
});
$(this).error(function () {
console.error("图片加载失败!");
});
});
},
//判断无页面元素的图片是否全部加载完毕(用于一些特殊场景,如图片帧动画)
imageAllLoad2: function (images, callback) {
var index = 0;
if (this.isArray(images)) {
$.each(images, function () {
var image = new Image();
image.src = this;
$(image).load(function () {
index++;
if (index == images.length) return callback();
});
$(image).error(function () {
console.error("图片加载失败!");
});
});
}
else {
var image = new Image();
image.src = images;
$(image).load(function () {
return callback();
});
$(image).error(function () {
console.error("图片加载失败!");
});
}
},
//元素是否在数组中(同$.inArray())
inArray: function (value, arr) {
var result = arr.indexOf(value);
if (result === -1) {
return false;
}
else {
return true;
}
},
//判断对象是否为空
isEmptyObj: function (obj) {
for (var key in obj) {
return false;
}
return true;
},
//对象转数组,并丢掉了键保留值
objToArray: function (obj) {
var arr = [];
for (var item in obj) {
arr.push(obj[item]);
}
return arr;
},
//数组转对象
arrayToObj: function (arr) {
var obj = {}
for (var key in arr) {
obj[key] = arr[key]
}
return obj;
},
//系统函数整理
//array.concat 连接两个数组
//array.join(separator) 把数组中的所有元素转换一个字符串。
//string.split(separator) 把一个字符串分割成字符串数组。
//object.create(obj) 克隆对象,貌似克隆对象不全,慎用。
//array.slice(start, end) 提取数组的某个部分,并以新的字符串返回被提取的部分
//string.slice(start, end) 提取字符串的某个部分,并以新的字符串返回被提取的部分
//jquery函数整理
//$.extend(true,{},obj) 对象深拷贝
//$.extend(true,[],obj) 数组深拷贝
//$.grep()过滤原始数组
}
/*原生对象原型扩展*/
//数组移除
Array.prototype.remove = function (val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
}
//数组去重
Array.prototype.unique = function () {
var res = [];
var json = {};
for (var i = 0; i < this.length; i++) {
if (!json[this[i]]) {
res.push(this[i]);
json[this[i]] = 1;
}
}
return res;
}
//计算类
apiUtil.Math = {
DEG2RAD: Math.PI / 180,
RAD2DEG: 180 / Math.PI,
/**
* http://www.broofa.com/Tools/Math.uuid.htm
* Generate a random uuid.
* length - the desired number of characters
* the number of allowable values for each character.
*/
uuid: function (len, radix) {
var CHARS = "0123456789abcdefghijklmnopqrstuvwxyz".split("");
var chars = CHARS, uuid = [], i;
radix = radix || chars.length;
if (len) {
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
}
else {
var r;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = "-";
uuid[14] = "4";
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random() * 16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join("");
},
//角度转弧度
degToRad: function (degrees) {
return degrees * _Math.DEG2RAD;
},
//弧度转角度
radToDeg: function (radians) {
return radians * _Math.RAD2DEG;
},
//获取两点的距离
getDistance: function (p1, p2) {
return Math.sqrt(Math.pow(Math.abs(p1.x - p2.x), 2) + Math.pow(Math.abs(p1.y - p2.y), 2));
}
}
//正则表达式验证
apiUtil.reg = {
//判断是否移动设备访问
isMobile: function () {
return /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(window.navigator.userAgent.toLowerCase());
},
//手机号验证
checkMobileNum: function (mobile) {
return /^1[3|5|7|8][0-9]\d{8}$/.test(mobile);
},
//账号验证
isAccount: function (value) {
return /^[a-zA-Z]\w{3,20}$/.test(value);
},
//密码验证
checkPassword: function (value) {
return /^[\@A-Za-z0-9\!\#\$\%\^\&\*\.\~]{6,20}$/.test(value);
},
}
//GET请求
apiUtil.get = function (url, data, success, error) {
_ajaxQuery(url, 'GET', data, success, error);
}
//GET请求,header有传递参数
apiUtil.getHeader = function (url, headers, data, success, error) {
_ajaxHeader(url, 'GET', headers, data, success, error);
}
//POST请求,请求参数在Query
apiUtil.post = function (url, data, success, error) {
_ajaxQuery(url, 'POST', data, success, error);
}
//POST请求,header有传递参数
apiUtil.postHeader = function (url, headers, data, success, error) {
_ajaxHeader(url, 'POST', headers, data, success, error);
}
//POST请求,请求参数在Body
apiUtil.postBody = function (url, data, success, error) {
_ajaxBody(url, 'POST', data, success, error);
}
//Header有请求参数,返回JSON
function _ajaxHeader(url, type, headers, data, success, error) {
$.ajax({
headers: headers,
url: url,
type: type,
dataType: 'JSON',
data: data,
timeout: 3000,
success: function (data) {
apiUtil.print(data);
if (success) return success(data);
},
error: function (e) {
console.error(e);
if (error) return error(e);
}
});
}
//请求参数在Query,返回JSON
function _ajaxQuery(url, type, data, success, error) {
$.ajax({
url: url,
type: type,
dataType: 'JSON',
data: data,
timeout: 3000,
success: function (data) {
apiUtil.print(data);
if (success) return success(data);
},
error: function (e) {
console.error(e);
if (error) return error(e);
}
});
}
//请求参数在Body,返回JSON
function _ajaxBody(url, type, data, success, error) {
$.ajax({
url: url,
type: type,
dataType: 'JSON',
contentType: 'application/json;charset=UTF-8',
data: JSON.stringify(data),
timeout: 3000,
success: function (data) {
apiUtil.print(data);
if (success) return success(data);
},
error: function (e) {
console.error(e);
if (error) return error(e);
}
});
}
//cookie操作
apiUtil.cookie = {
setCookie: function (name, value, days) {
var exp = new Date();
exp.setTime(exp.getTime() + days * 60 * 60 * 24 * 1000);
var cookie = name + "=" + encodeURIComponent(value) + ((days == null) ? "" : ";expires=" + exp.toGMTString()) + '; path=/';
document.cookie = cookie;
},
getCookie: function (name) {
var arr, reg = new RegExp("(^|)" + name + "=([^=]+)(?:;|$)");
if (arr = document.cookie.match(reg)) return decodeURIComponent(arr[2]);
else return null;
},
delCookie: function (name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString() + '; path=/';
},
clearCookie: function () {
var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
if (keys && keys.length > 0) {
for (var i = keys.length; i--;) {
delCookie(keys[i]);
}
}
},
};
//session操作
apiUtil.sessionStorage = {
saveData: function (key, data) {
key = 'data_' + key;
data = JSON.stringify(data);
sessionStorage.setItem(key, data);
},
readData: function (key) {
key = 'data_' + key;
return JSON.parse(sessionStorage.getItem(key));
},
removeData: function (key) {
key = 'data_' + key;
sessionStorage.removeItem(key);
}
};
//本地存储操作
apiUtil.localStorage = {
saveData: function (key, data) {
key = 'data_' + key;
data = JSON.stringify(data);
localStorage.setItem(key, data);
},
readData: function (key) {
key = 'data_' + key;
return JSON.parse(localStorage.getItem(key));
},
removeData: function (key) {
key = 'data_' + key;
localStorage.removeItem(key);
}
};
window.apiUtil = apiUtil;
})(jQuery, window);个人项目常用全局变量
//配置项
var confige={},
//运行程序
var app={},
//临时变量
var RAM = {
state: 1,
list: [],
};
//ui元素(初始化获取后使用)
var UI = {
bnt1: '',
btn2: '',
};