欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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]';
  }
/**************************  变量类型检测  *************************/