zoukankan      html  css  js  c++  java
  • js通用函数封装

    function getRandomInt(min,max) {
      return Math.floor(Math.random() * (max - min + 1) + min)
      // return Math.floor(Math.random() * (max + 1))
    }

    // 洗牌函数(数组打乱)

    function shuffle(arr) {
      let _arr = arr.concat();
      for (let i = 0; i < _arr.length; i++) {
        let j = getRandomInt(0,i);
        let t = _arr[i];
        _arr[i] = _arr[j];
        _arr[j] = t;
      }
      return _arr;
    }

    // 函数防抖(节流)

    function debounce(func, delay, immediate = true) {
      let timer;
    
      return function (...args) {
        if (timer) clearTimeout(timer);
    
        // 默认立即执行方法,延后执行的话,会让人感觉有卡顿
        if (immediate) {
          // 定义现在是否能执行
          let now = !timer;
          if (now) func.apply(this, args);
          // 不论timeout有没有值,都重新给timeout新添加一个定时器
          // 等待wait时间后,将timeout设为null,代表可以继续执行次function
          timer = setTimeout(() => {
            timer = null;
          }, delay);
        } else {
          // 如果不是立即执行此函数,则在等待 delay 延迟时间后执行方法
          timer = setTimeout(() => {
            func.apply(this, args);
          }, delay);
        }
      }
    }

    配合自定义指令使用

    Vue.directive('debounce', {
      bind(el, binding) {
        let execFunc;
    
        if (binding.value instanceof Array) {
          // 函数传参
          const [func, time = 500, immediate = true] = binding.value;
          execFunc = Util.debounce(func, time, immediate);
        } else {
          // 函数不传参
          execFunc = Util.debounce(binding.value, 500, true);
        }
    
        el.addEventListener('click', execFunc);
      }
    });

    页面使用

    <template>
      <div>
        <div class="btn" v-debounce="() => handleClick()">点击按钮</div>
      </div>
    </template>
    
    <script>
      export default {
        name: "index",
        methods: {
          handleClick() {
            console.log('handleClick')
          }
        }
      }
    </script>
    
    <style scoped lang="scss">
      .btn {
         300px;
        height: 80px;
        line-height: 80px;
        text-align: center;
        color: white;
        background-color: #30BC75;
      }
    </style>


    // jsonp封装

    import jsonp from 'jsonp'
    
    // 转换url地址参数
    const param = (param) => {
      let url = ''
      for (let key in param) {
        let value = param[key] ? param[key] : '';
        url += `&${key}=${encodeURIComponent(value)}`;
      }
      return url ? url.substring(1) : '';
    }
    
    // data是url地址的参数
    export default (url,data,options) => {
      url += (url.indexOf('?') < 0 ? '?' : '&') + param(data);
    
      return new Promise((resolve, reject) => {
        jsonp(url,options,(err,data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        });
      });
    }

    // 确保函数只被调用一次

    function once (fn) {
      let called = false
      return function () {
        if (!called) {
          called = true
          fn.apply(this, arguments)
        }
      }
    }
    randomStr() {
      return Math.random().toString(36).substr(2);
    }

    // 判断数据类型
    // 在任何值上调用Object原生的toString方法,都会返回一个[object NativeConstructorName]格式的字符串

    function isType(type) {
      // return Object.prototype.toString.call() === `[object ${type}]`;
      return function (args) {
        return Object.prototype.toString.call(args) === `[object ${type}]`;
      }
    }
    var isNumber = isType('Number');
    console.log(isNumber('1')); // false

     // 倒计时

     function toTwo(value) {
        return (value >= 10 ? '' : '0') + value;
      }
     // 此处可以传值(毫秒数),这里目前写死1分钟倒计时
    function tocoundown(countdown) { var time = 60; var intervalId; return function() { intervalId = setInterval(() => { if (time <= 0) { clearInterval(intervalId); } else { setcountdowns(--time); } },1000); } } function setcountdowns(time) { let str = ''; if (time > 0) { let minute = toTwo(Math.floor(time / 60 % 60)), seconds = toTwo(Math.floor(time % 60)); str = `${minute}:${seconds}`; } else { str = '00:00'; } console.log(str); return str; } tocoundown()();

    // 相对地址变成绝对地址

     // 1、
    var relative2absolute = function (url, base) { if (!base) { base = location.protocol + location.host; } return new URL(url, base).href; }
    // 2、
    var relativetoabsolute = function (url, base) { var ele = document.createElement('a'); ele.href = (base || '') + url; return ele.href; }

    深拷贝

      function deepClone(obj) {
        let objClone = Array.isArray(obj) ? [] : {};
    
        if (obj && typeof obj === 'object') {
          for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
              if (obj[key] && typeof obj[key] === 'object') {
                objClone[key] = deepClone(obj[key])
              } else {
                objClone[key] = obj[key]
              }
            }
          }
        }
        return objClone
      }
    
      var obj = {
        name: '张三',
        meal: '男',
        age: 20,
        an: {
          msg: 'hello'
        }
      }
      var newObj = deepClone(obj);
      newObj.name = '李四';
      console.log(newObj); // {name: "李四", meal: "男", age: 20, an: {…}}
      console.log(obj); // {name: "张三", meal: "男", age: 20, an: {…}}
  • 相关阅读:
    2017 业余程序员的回顾
    而立将近,可有不惑
    谈谈转行
    吃干抹净提上裤子就甩
    Autosizer应用程序窗口控制工具
    AutoCAD2007专业版
    Revit中如何添加水平仰视平面视图
    Revit中绘制带坡度管道
    Revit自定义快递访问工具栏
    Revit利用对正工具快速修改风管对齐方式
  • 原文地址:https://www.cnblogs.com/ltog/p/14234415.html
Copyright © 2011-2022 走看看