【JavaScript】常用工具函数
程序员文章站
2024-01-10 14:54:01
...
/************************** 函数 **************************/
/*
函数节流:一个函数执行一次后,只有大于设定的执行周期后才会执行第二次。
有个需要频繁触发函数,出于优化性能角度,在规定时间内,只让函数触发的第一次生效,后面不生效。
*/
export function throttle(fn,delay){
var lastTime = 0; // 记录上一次函数触发的时间
return function(){
var nowTime = Date.now(); // 记录当前函数触发的时间
if (nowTime - lastTime > delay) {
fn.call(this); // 修正this指向问题
lastTime = nowTime; // 同步时间
}
}
}
/* 防抖函数:一个需要频繁触发的函数,在规定时间内,只让最后一次生效,前面的不生效。 */
export function debounce(fn,delay){
var timer = null; //记录上一次延时计时器
return function(){
clearTimeout(timer);
timer = setTimeout(function(){
fn.apply(this);
},delay)
}
}
/************************** 函数 **************************/
/************************** 正则表达式 **************************/
export function isPhone(val){
if(!(/^1[34578]\d{9}$/.test(val))){
return false
}
return true
}
export function isIdCard(val){
if(!(/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/.test(val))&&!(/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/.test(val))){
return false
}
return true
}
/************************** 正则表达式 **************************/
/************************** BOM工具函数 **************************/
/*
解析当前url,获得查询字符串参数
例如 http://baidu.com/web?num=1&age=19&job=engineer
返回args
args["num"] // 1
args["job"] // engineer
*/
export function getQueryString(){ //获取当前页面的请求参数
var qs = (location.search.length>0?location.search.substring(1):"");
var args = {};
var items = qs.length?qs.split("&"):[];
var item = null;
var name = null;
var value = null;
len = items.length;
for (var i = 0; i < len; i++) {
item = items[i].split("=");
name = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if (name.length) {
args[name] = value;
}
}
return args;
}
/*
检测滚动条是否滚动到底部
返回true 表示滚动到底部
返回false 表示未滚动到底部
调用方法: $(document).scroll(function() { scrollBottom(); });
*/
export function isScrollBottom(){
if (document.body.scrollHeight-document.body.scrollTop<=window.screen.availHeight) {
return true;
}
return false;
}
/*
检测浏览器是否装有特定插件
例如检测浏览器是否有Flash插件
hasPlugin("Flash")
返回true 表示有
返回false 表示没有
*/
export function hasPlugin(name){
name = name.toLowerCase();
for (var i = 0; i < navigator.plugins.length; i++) {
if (navigator.plugins[i].name.toLowerCase().indexOf(name)>-1) {
return true;
}
}
return false;
}
/*
检测IE中的插件
在IE中检测插件的唯一方式是使用专有的ActiveXObject类型,并尝试插件一个特定插件的实例
传入参数必须是插件的COM标识符,例如Flash的标识符是ShockwaveFlash.ShockwaveFlash
*/
export function hasIEPlugin(name) {
try {
new ActiveXObject(name);
return true;
} catch (ex) {
return false;
}
}
/************************** BOM工具函数 **************************/
/************************** DOM工具函数 **************************/
/*动态加载js脚本*/
export function loadScript(url){
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
document.body.appendChild(script);
}
export function loadScriptString(code){
var script = document.createElement("script");
script.type = "text/javascript";
try {
script.appendChild(document.createTextNode(code));
} catch (ex) {
script.text = code;
}
document.body.appendChild(script);
}
/*动态加载样式*/
export function loadStyles(url){
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = url;
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);
}
export function loadStylesString(css){
var style = document.createElement("style");
style.type = "text/css";
try {
style.appendChild(document.createTextNode(css));
} catch (ex) {
style.styleSheet.cssText = css;
}
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);
}
/************************** DOM工具函数 **************************/
/************************** 日期时间类型工具函数 **************************/
/*@param date 时间戳*/
/*@param format 时间格式 'yyyy-MM-dd hh:mm:ss' */
/*@return 格式化日期时间描述 */
export function dateFormat(date,format){
if(!format || typeof format !== 'string'){
console.error('format is undefiend or type is Error');
return '';
}
date = date instanceof Date? date : (typeof date === 'number'|| typeof date === 'string')? new Date(date): new Date();
//解析
var formatReg = {
'y+': date.getFullYear(),
'M+': date.getMonth()+1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
}
for(var reg in formatReg){
if(new RegExp(reg).test(format)){
var match = RegExp.lastMatch;
format = format.replace(match, formatReg[reg]< 10 ? '0'+formatReg[reg]: formatReg[reg].toString() );
}
}
return format;
}
/*@param date 时间戳*/
/*@return 语义化的时间描述:'n月前'/'n周前'/'n天前'/'n小时前'/'n分钟前'/'刚刚' */
export function formatMsgTime(date){ //格式化时间戳
var result;
var timePublish = new Date(date);
var timeNow = Math.round(new Date().getTime()/1000);
var minute = 1 * 60;
var hour = minute * 60;
var day = hour * 24;
var month = day * 30;
var diffValue = timeNow - data;
var diffMonth = diffValue / month;
var diffWeek = diffValue / (7 * day);
var diffDay = diffValue / day;
var diffHour = diffValue / hour;
var diffMinute = diffValue / minute;
if (diffMonth > 3) {
result = timePublish.getFullYear() + "-";
result += timePublish.getMonth() + "-";
result += timePublish.getDate();
}
else if (diffMonth > 1) {
result = parseInt(diffMonth) + "月前";
}
else if (diffWeek > 1) {
result = parseInt(diffWeek) + "周前";
}
else if (diffDay > 1) {
result = parseInt(diffDay) + "天前";
}
else if (diffHour > 1) {
result = parseInt(diffHour) + "小时前";
}
else if (diffMinute > 1) {
result = parseInt(diffMinute) + "分钟前";
}
else {
result = "刚刚";
}
return result;
}
/************************** 日期时间类型工具函数 **************************/
/************************** 变量类型检测 **************************/
export function isNumber(value) {
return Object.prototype.toString.call(value) == '[object Number]'
}
export function isString(value) {
return Object.prototype.toString.call(value) == '[object String]'
}
export function isArray(value) {
return Object.prototype.toString.call(value) == '[object Array]'
}
export function isBoolean(value) {
return Object.prototype.toString.call(value) == '[object Boolean]'
}
export function isUndefined(value) {
return value === undefined
}
export function isNull(value) {
return value === null
}
export function isSymbol(value) {
return Object.prototype.toString.call(value) == '[object Symbol]'
}
export function isObject(value) {
return ( Object.prototype.toString.call(value) == '[object Object]'
||
// if it isn't a primitive value, then it is a common object
(
!isNumber(value) &&
!isString(value) &&
!isBoolean(value) &&
!isArray(value) &&
!isNull(value) &&
!isFunction(value) &&
!isUndefined(value) &&
!isSymbol(value)
)
)
}
//是否是一个空对象
export function isEmptyObject(obj) {
if(!isObject(obj)) {
return false
}
if(var key in obj) {
return false
}
return true
}
//是否是一个空数组
export function isEmptyArray(array) {
if(!isArray(array)) {
return false
}
return array.length > 0 ? false : true
}
export function isFunction(value) {
return Object.prototype.toString.call(value) == '[object Function]';
}
/************************** 变量类型检测 *************************/