JavaScript代码片段

A. 技巧类

过滤数组空值

                        
    // 过滤 空字符串 null undefined 0 false
    let arr = ['apple', null, 'milk', undefined, 'bread', '', 0, false];
    let list = arr.filter(Boolean);
                        
                    

数组结构获取第一项的属性值

                        
    // 获取下标为0的age
    let people = [
        { name: "a", age: 20},
        { name: "b", age: 22},
        { name: "c", age: 60}
    ];
    let [{age}] = people;
    // 20
                        
                    

快速获取时间戳

                        
    //以下5种方法等价

    +new Date();

    +new Date;

    new Date() * 1;

    new Date().valueOf();

    new Date().getTime();
                        
                    

取整

                        
    ~~2.33;  //2
    2.33 | 0; //2
    2.33 >> 0; //2
                        
                    

保留2位小数不进行四舍五入

                        
    Number(parseFloat(2.345).toFixed(3).slice(0, -1)); //2.34
                        
                    

两个整数交换数值

                        
    var a = 1, b = 2;
    a ^= b;
    b ^= a;
    a -= b;
                        
                    

获取随机布尔值

                        
    const randomBoolean = () => Math.random() >= 0.5;
                        
                    

对象深拷贝

                        
    // 方法1 有缺陷 方法等会丢失
    newObj = JSON.parse(JSON.stringify(obj));

    // 方法2
    function clone (obj) {
        if(obj === null) return null;
        if(typeof obj !== 'object') return obj;
        if(obj.constructor === Date) return new Date(obj);
        if(obj.constructor === RegExp) return new RegExp(obj);
        var newObj = new obj.constructor ();  //保持继承链
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
                var val = obj[key];
                newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
            }
        }
        return newObj;
    }
                        
                    

判断对象的属性是否存在

                        
    // 方法1
    console.log(!!myObj['someProperty']); // true 但无法判断 {}、[]

    // 方法2
    console.log('someProperty' in myObj); // true  但原型链上也会判断

    // 方法3
    console.log(myObj.hasOwnProperty('someProperty')); // true 继承自Object,不考虑原型链
                        
                    

合并对象

                        
    // ES5
    const obj = Object.assgin({}, obj1, obj2);

    // ES6
    const obj = {...obj1, ...obj2};
                        
                    

合并数组

                        
    // ES5
    const arr = arrA.concat(arrB);

    // ES6
    const arr = [...new Set([...arrA, ...arrB])];
                        
                    

取随机字符串

                        
    Math.random().toString(16).substring(2); // 13位
    Math.random().toString(36).substring(2); // 11位
                        
                    

反转字符串

                        
    str.split('').reverse().join('');
                        
                    

字符串替换成星号

                        
    '风起云涌'.replace(/.(?=.)/g, '*');  //***涌

    phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2"); //131****5678
                        
                    

手机号格式

                        
    /**
    * [手机号格式化]
    * @param  {string | number} phone 手机号
    * @param  {string} symbol 分隔符,默认 -
    * 13012345678 => 130-1234-5678
    */
    let formatMobile = (phone, symbol = '-') => {
        if (typeof phone === 'number') {
            phone = phone.toString();
        }
        
        return phone.replace(/(\d{3})(\d{4})(\d{4})/, '$1'+ symbol +'$2'+ symbol + '$3');
    }
                        
                    

数字格式化

                        
    // 4位分隔 1234 5678 9123 123
    val.replace(/\s/, '').replace(/([0-9]{4})(?=[0-9])/g, '$1 ');
                        
                    

匿名函数自执行

                        
    ( function() {}() );
    ( function() {} )();
    [ function() {}() ];

    ~ function() {}();
    ! function() {}();
    + function() {}();
    - function() {}();

    delete function() {}();
    typeof function() {}();
    void function() {}();
    new function() {}();
    new function() {};

    var f = function() {}();

    1, function() {}();
    1 ^ function() {}();
    1 > function() {}();
                        
                    

数组去重

                        
    // 方法1
    [...new Set([1, "1", 2, 1, 1, 3])];  //[1, "1", 2, 3]

    // 方法2
    function unique (arr) {
        let map = new Map();
        let arr1 = [];
        for (let i = 0, len = arr.length; i < len; i++) {
            if (map.has(arr[i])) { // 判断是否存在该key值
                map.set(arr[i], true);
            } else {
                map.set(arr[i], false);
                arr1.push(arr[i]);
            }
        }
        return arr1;
    }
                        
                    

取出两个数组中不同元素

                        
    function getArrDifference(arr1, arr2) {
        return arr1.concat(arr2).filter(function(v, i, arr) {
            return arr.indexOf(v) === arr.lastIndexOf(v);
        });
    }
                        
                    

取出两个数组中相同元素

                        
    function getArrEqual(arr1, arr2) {
        let newArr = [];
            for (let i = 0; i < arr2.length; i++) {
                for (let j = 0; j < arr1.length; j++) {
                    if(arr1[j] === arr2[i]){
                        newArr.push(arr1[j]);
                    }
            }
        }
        return newArr;
    }
                        
                    

去掉两个数组中相同元素,得到新数组

                        
    var arr1 = [a, b, c,];
    var arr2 = [a, b, c, d];
    let list = arr2.filter(items => {
        if (!arr1.includes(items)) {
            return items;
        }
    })
                        
                    

取出一个数组中的最大值和最小值

                        
    var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
    Math.max.apply(Math, numbers);  //122205
    Math.min.apply(Math, numbers);  //-85411
                        
                    

数组中两个值交换位置

                        
    function swapArr(arr, index1, index2) {
        arr[index1] = arr.splice(index2, 1, arr[index1])[0];
        return arr;
    }
                        
                    

数组中将某个值置顶

                        
    function toFirst(fieldData, index) {
        if (index != 0) {
            fieldData.unshift(fieldData.splice(index, 1)[0]);
        }
    }
                        
                    

数组中将某个值上移一个位置

                        
    function upGo(fieldData, index) {
        if(index != 0) {
            fieldData[index] = fieldData.splice(index - 1, 1, fieldData[index])[0];
        } else {
            fieldData.push(fieldData.shift());
        }
    }
                        
                    

数组中将某个值下移一个位置

                        
    function downGo(fieldData, index) {
        if (index != fieldData.length - 1) {
            fieldData[index] = fieldData.splice(index + 1, 1, fieldData[index])[0];
        } else {
            fieldData.unshift( fieldData.splice(index, 1)[0]);
        }
    }
                        
                    

判断数组中是否有重复元素

                        
    // 方法1 正则
    // 验证重复元素,有重复返回true;否则返回false
    function isRepeat(a) {
        return /(\x0f[^\x0f]+)\x0f[\s\S]*\1/.test("\x0f"+a.join("\x0f\x0f") +"\x0f");
    }

    // 方法2 通过字符串查找
    function isRepeat() {
        var ary = new Array("111", "22", "33", "111");
        var s = ary.join(",") + ",";
        for (var i = 0; i < ary.length; i++) {
            if (s.replace(ary[i] + ",", "").indexOf(ary[i] + ",") > -1) {
                alert("数组中有重复元素:" + ary[i]);
                break;
            }
        }
    }

    // 方法3 通过数组排序,比较临近元素
    function isRepeat() {
        var ary = new Array("111", "22", "33", "111");
        var nary = ary.sort();
        for (var i = 0; i < ary.length; i++) {
            if (nary[i] == nary[i + 1]) {
                alert("数组重复内容:" + nary[i]);
            }
        }
    }

    // 方法4 通过哈希(推荐)
    function isRepeat(arr) {
        var hash = {};
        for (var i in arr) {
            if (hash[arr[i]]){
                return true; 
            }
            hash[arr[i]] = true;
        }
        return false;
    }
                        
                    

数据合并

                        
    // 根据某个字段合并,比如userid
    function mergeData(list) {
        let map = [];
        let dest = [];

        let arr = list;

        // 根据userid合并数据
        for (let i = 0; i < arr.length; i++){
            let ai = arr[i];
            if (!map[ai.userid]) {
                dest.push({
                    userid: ai.userid,
                    name: ai.name
                });
                map[ai.userid] = ai;
            } else {
                for (let j = 0; j < dest.length; j++){
                    let dj = dest[j];
                }
            }
        }
        return dest;
    }
                        
                    

合并数组中重复的值

                        
    function mergeArr(arr) {
        var newArr = [];
        arr.forEach((item) => {
            var dataItem = item;
            if (newArr.length > 0) {
                var filterValue = newArr.filter((v) => {
                    return v.type === dataItem.type;
                });
                if (filterValue.length > 0) {
                    newArr.forEach((n) => {
                        if (n.type === filterValue[0].type) {
                            n.num = filterValue[0].num + dataItem.num;
                        }
                    });
                } else {
                    newArr.push(dataItem);
                }
            } else {
                newArr.push(dataItem);
            }
        });
        return newArr;
    }
                        
                    

数值边界判断

                        
    //判断 index 是否小于0,小于则赋值为 0
    var index = 0;

    //简化前
    index--;
    if (index < 0) {
        index = 0;
    }

    //简化后
    index = Math.max(0, --index);
                        
                    
                        
    //判断 index 是否大于 len,大于则赋值为 len 的值
    var imgs = [1, 2, 3];
    var index = 0,
    len = imgs.length;

    //简化前
    index++;
    if (index > len) {
        index = len;
    }

    //简化后
    index = Math.min(len, ++index);
                        
                    

运行耗时计时

                        
    console.time('Timer'); //Timer是计时器名称,随便起
    var arr = [];
    for (var i = 0; i < 50; i++) {
      arr.push(i);
    }
    console.timeEnd('Timer');
                        
                    

输入框非空判断

                        
    // ES5
    if (value !== null && value !== undefined && value !== '') {
        //...
    }

    // ES6
    if (value??'' !== '') {
        //...
    }
                        
                    

判断给定的日期是否是工作日

                            
    const isWeekday = (date) => date.getDay() % 6 !== 0;
                            
                        

滚动到页面顶部

                            
    const goToTop = () => window.scrollTo(0, 0);
    goToTop();
                            
                        

B. 公共函数

Ajax封装

                        
    /**
     * [ajax Ajax方法]
     * @param  {object} opts [ajax配置]
     */
    ajax: function(opts) {
        var me = this;
        var o = $.extend({}, {
            url: '',
            type: 'GET',
            data: {},
            dataType: 'json',
            cache: false,
            async: false,
            success: function(response) {
                //200 成功
                if (response.code == '200') {
                    o.callback(response);
                } else {
                    if (typeof o.fail == 'function') {
                        o.fail(response);
                    } else {
                        me.toast(response.msg);
                    }
                }
            },
            fail: function(response) {
                me.toast(response.msg);
            }
        }, opts);

        return $.ajax({
            url: api + o.url,
            type: o.type,
            data: o.data,
            dataType: o.dataType,
            cache: o.cache,
            async: o.async,
            contentType: o.contentType,
            success: o.success
            fail: o.fail
        });
    }
                        
                    

获取url中参数

                        
    /**
     * [getQueryString 获取url中参数]
     * @param  {string} name [键名]
     * @return {string}      [键值]
     */
    getQueryString: function(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) {
            if (r[2].indexOf("%u") < 0) {
                r[2] = decodeURIComponent(r[2]).replace(/\\/g, "%");
            }
            return unescape(r[2]);
        }
        return null;
    }
                        
                    

截取字符串

                        
    /**
     * [substring 截取字符串]
     * @param  {string} str  [待处理字符串]
     * @param  {number} len  [截取长度]
     * @param  {string} flow [超过截取长度显示符号]
     * @return {string}      [处理后字符串]
     */
    substring: function(str, len, flow) {
        str = $.trim(str);
        if (!str) return '';

        str = str.toString();
        var newStr = "",
            strLength = str.replace(/[^\x00-\xff]/g, "**").length,
            flow = typeof(flow) == 'undefined' ? '…' : flow;
        if (strLength <= len + (strLength % 2 == 0 ? 2 : 1)) return str;
        for (var i = 0, newLength = 0, singleChar; i < strLength; i++) {
            singleChar = str.charAt(i).toString();
            if (singleChar.match(/[^\x00-\xff]/g) != null) newLength += 2;
            else newLength++;

            if (newLength > len) break;
            newStr += singleChar;
        }

        if (strLength > len) newStr = $.trim(newStr) + flow;
        return newStr;
    }
                        
                    

HTML标签过滤

                        
    /**
     * [htmlFilter HTML标签过滤]
     * @param  {string} str [待处理字符串]
     * @return {string}     [处理后字符串]
     */
    htmlFilter: function(str) {
        str = str.replace(/<\/?[^>]*>/g, ''); //去除HTML tag
        str = str.replace(/[ | ]*\n/g, '\n'); //去除行尾空白
        str = str.replace(/\n[\s| | ]*\r/g, '\n'); //去除多余空行
        str = str.replace(/ /ig, '');//去掉 
        return str;
    }
                        
                    

HTML属性过滤

                        
    /**
     * [htmlAttrFilter HTML属性过滤]
     * @param  {string} str [待处理字符串]
     * @return {string}     [处理后字符串]
     */
    htmlAttrFilter: function(str) {
        str = str.replace(/style\=([\\]\")*[a-zA-Z0-9\s\-\:\;\'\,\#\u4e00-\u9fa5]+([\\]*\")*/g, ''); //过滤style属性
        return str;
    }
                        
                    

去掉所有的HTML标记

                        
    /**
     * [delHtmlTag 去掉所有的HTML标记]
     * @param  {string} str [待处理字符串]
     * @return {string}     [处理后字符串]
     */
    delHtmlTag: function(str) {
        var str = str.replace(/ /g, '');
            str = str.replace(//g, '...');
            str = str.replace(/<[\w\/"'=\s\.\(\)\{\}\-\+\\,\!:;&#%,。!?\u4e00-\u9fa5]*>/g, '');

        return str;
    }
                        
                    

时间转换日期

                        
    /**
     * [timeToDate 时间转换日期]
     * @param  {time|string} time 	[时间戳或其他时间格式]
     * @param  {string} 	 flag 	[格式化输出,默认ymd,[ymd|ymdhis|y|md]]
     * @param  {string} 	 symbol [分隔符号,默认 - ]
     * @return {string}      		[格式化时间]
     */
    timeToDate: function(time, flag, symbol) {
        symbol = symbol || '-';

        if (typeof time == 'string' && time.length == 10) {
            time = (time + '000') * 1
        }

        var date = new Date(time);

        var y = date.getFullYear(),
            m = date.getMonth() + 1,
            d = date.getDate(),
            h = date.getHours(),
            i = date.getMinutes(),
            s = date.getSeconds();

            m = m < 10 ? '0' + m : m;
            d = d < 10 ? '0' + d : d;
            h = h < 10 ? '0' + h : h;
            i = i < 10 ? '0' + i : i;
            s = s < 10 ? '0' + s : s;

        switch(flag) {
            case 'ymdhis':
                return y + symbol + m + symbol + d + ' ' + h +':' + i + ':' + s;

            case 'ymdhi':
                return y + symbol + m + symbol + d + ' ' + h +':' + i;

            case 'ymd':
                return y + symbol + m + symbol + d;

            case 'y':
                return y;

            case 'md':
                return m + symbol + d;

            case 'mdhi':
                return m + symbol + d + ' ' + h +':' + i;

            case 'dmy':
                return d + symbol + m + symbol + y;

            case 'his':
                return h +':' + i + ':' + s;

            case 'hi':
                return h +':' + i;

            default:
                return y + symbol + m + symbol + d;

        }
    }
                        
                    

补零

                        
    // 方法1
    /**
     * [zero 补零]
     * @param  {number} num  [值]
     * @return {string}      [补零后值]
     */
    zero: function(num) {
        return num < 10 ? '0' + num : num;
    }

    // 方法2
    let h = '8';
    `00${h}`.slice(-2)
                        
                    

设置/读取cookie

                        
    /**
     * [cookieHelper 设置cookie 读取cookie]
     * @param  {string} name    [键名]
     * @param  {string|number|boolean} value   [键值]
     * @param  {object} options [object]
     */
    cookieHelper: function(name, value, options) {
        if (typeof value != 'undefined') {
            options = options || {};
            if (value === null) {
                value = '';
                options.expires = -1;
            }
            var expires = '';
            if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
                var date;
                if (typeof options.expires == 'number') {
                    date = new Date();
                    date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
                } else {
                    date = options.expires;
                }
                expires = '; expires=' + date.toUTCString();
            }
            var path = options.path ? '; path=' + options.path : '',
                domain = options.domain ? '; domain=' + options.domain : '',
                secure = options.secure ? '; secure' : '';
            document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
        } else {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
    }
                        
                    

设置本地数据

                        
    /**
     * [设置本地数据] 使用localStorage,如不支持用Cookie
     * @param  {[string]} key   [键名]
     * @param  {[object]} value [键值]
     */
    setStorage: function(key, value) {
        if (window.localStorage) {
            localStorage.setItem(key, JSON.stringify(value));
        } else {
            document.cookie = key + '=' + JSON.stringify(value);
        }
    }
                        
                    

获取本地数据

                        
    /**
    * [获取本地数据] 使用localStorage,如不支持用Cookie
    * @param  {[string]} key [键名]
    * @return {[object]}     [json对象]
    */
    getStorage: function(key) {
        var value;
        if (window.localStorage) {
            value = localStorage.getItem(key);
        } else {
            var name = key + '=';
            var ca = document.cookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) === ' ') {
                    c = c.substring(1);
                }
                if (c.indexOf(name) !== -1) {
                    value = c.substring(name.length, c.length);
                }
            }
        }
        return JSON.parse(value);
    }
                        
                    

删除本地数据

                        
    /**
     * [删除本地数据] 使用localStorage,如不支持用Cookie
     * @param  {string} key [键名]
     */
    removeStorage: function(key) {
        if (window.localStorage) {
            localStorage.removeItem(key);
        } else {
            var oDate = new Date();
            oDate.setDate(oDate.getDate() - 1);
            document.cookie = key + ' = ' + '1' + ' ;expires = ' + oDate;
        }
    }
                        
                    

数据类型判断

                        
    /**
     * [JS数据类型判断]
     * @param  {string|number|boolean|object|array|regexp|null|undefined}
     */
    typeDetection: function(n) {
        if (typeof n === 'object') {
            return Object.prototype.toString.call(n);
        } else {
            return typeof n;
        }
    }

    typeDetection('vic');         //string
    typeDetection(123);           //number
    typeDetection(1.5);           //number
    typeDetection(-1.5);          //number
    typeDetection(NaN);           //number
    typeDetection(Infinity);      //number
    typeDetection(true);          //boolean
    typeDetection(false);         //boolean
    typeDetection(function(){});  //function
    typeDetection(undefined);     //undefined
    typeDetection(null);          //[object Null]
    typeDetection({});            //[object Object]
    typeDetection({a:'1', b:2});  //[object Object]
    typeDetection([]);            //[object Array]
    typeDetection(new Array());   //[object Array]
    typeDetection(new Date());    //[object Date]
    typeDetection(new RegExp());  //[object RegExp]
    typeDetection(/^a-z$/);       //[object RegExp]
                        
                    

base64转路径

                        
    /**
     * [base64转路径] 
     */
    function h5base64ToPath(base64) {
        base64 = base64.split(',');
        let type = base64[0].match(/:(.*?);/)[1];
        let str = atob(base64[1]);
        let n = str.length;
        let array = new Uint8Array(n);
        while (n--) {
            array[n] = str.charCodeAt(n);
        }
        return (window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type }));
    }
                        
                    

图片下载

                        
function download(url, name) {
    // 不跨域时下载
    var link = document.createElement('a');
    link.download = ''; // 设置下载的文件名
    link.style.display = 'none';
    link.href = url; // 设置下载路径
    document.body.appendChild(link); // 触发点击
    link.click();
    document.body.removeChild(link); // 移除节点
}
                        
                    

跨域图片下载

                        
function download(url, name) {
    // 跨域时下载
    const img = new Image;
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    img.onload = function() {
        canvas.width = this.width;
        canvas.height = this.height;
        ctx.drawImage(this, 0, 0);

        const elt = document.createElement('a');
        elt.setAttribute('href', canvas.toDataURL('image/png'));
        elt.setAttribute('download', name);
        elt.style.display = 'none';
        document.body.appendChild(elt);
        elt.click();
        document.body.removeChild(elt);
    };
    img.crossOrigin = 'anonymous';
    img.src = url;
}
                        
                    

C. 验证类

手机号验证

                        
    /**
     * [checkMobile 手机号验证]
     * @param  {string|number} val [待验证手机号]
     * @return {boolean}     [true | false]
     */
    checkMobile: function(val) {
        return /^(1[3456789][0-9])\d{8}$/.test(val);
    }
                        
                    

QQ号验证

                        
    /**
     * [checkQQ QQ号验证]
     * @param  {string|numver} val [待验证QQ号]
     * @return {boolean}     [true | false]
     */
    checkQQ: function(val) {
        return /^[1-9]\d{4,10}$/.test(val);
    }
                        
                    

微信号验证

                        
    /**
     * [checkWechat 微信号验证]
     * @param  {string} val [待验证微信号]
     * @return {boolean}     [true | false]
     */
    checkWechat: function(val) {
        return /^[a-zA-Z][\w\-]{5,19}$/.test(val);
    }
                        
                    

电子邮箱验证

                        
    /**
     * [checkEmail 电子邮箱验证]
     * @param  {string} val [待验证邮箱]
     * @return {boolean}     [true | false]
     */
    checkEmail: function(val) {
        return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+\.+([\w.])*[a-zA-Z]{1,3}$/.test(val);
    }
                        
                    

身份证号验证

                        
    /**
     * [checkCardNo 身份证号验证]
     * @param  {string} val [待验证身份证号]
     * @return {boolean}     [true | false]
     */
    checkCardNo: function(val) {
        return /^[1-8](\d{16})[0-9xX]$/.test(val);
    }
                        
                    

id验证

                        
    /**
     * [checkId id验证]
     * @param  {string|number} val [待验证id]
     * @return {boolean}     [true | false]
     */
    checkId: function(val) {
        return /^[1-9]+\d*$/.test(val);
    }
                        
                    

中文验证

                        
    /**
     * [checkZh 中文验证]
     * @param  {string|number} val [待验证id]
     * @return {boolean}     [true | false]
     */
    checkZh: function(val) {
        return /\u4e00-\u9fa5/.test(val);
    }
                        
                    

图片类型验证

                        
    /**
     * [checkImageType 图片类型验证]
     * @param  {string|number} val [待验证图片类型]
     * @return {boolean}     [true | false]
     */
    checkImageType: function(val) {
        return /^image\/jpe?g|png$/i.test(val);
    }
                        
                    

身份证严格验证

                        
    /**
     * [身份证严格验证]
     * @param  {string} val [18位身份证号码]
     * @return {boolean}     [true|false]
     */
    strictIdNumber: function (val) {
        var str,
            result = 0;

        val = val.toUpperCase();

        if (val.length === 18) {
            var map1 = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            var map2 = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

            str = val + '';
            for (var i = 0, len = str.length; i < (len - 1); i++) {
                result += str[i] * map1[i];
            }

            if (map2[(result % 11)] !== str[len - 1]) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    }
                        
                    

D. 业务类

弹窗操作

                        
    // 弹窗操作
    tools: function() {
        // 关闭消息框
        $('body').on('click', '.mask-alert .btn-close', function() {
            $(this).closest('.mask').remove();
        });

        // 关闭确认框
        $('body').on('click', '.mask-confirm .btn-cancel', function() {
            $(this).closest('.mask').remove();
        });
    }
                        
                    

当前遮罩层统计

                        
    /**
     * [countMaskNum 当前遮罩层统计]
     */
    countMaskNum: function() {
        return ($('.mask').length) + 15000 + 1;
    }
                        
                    

toast 提示框

                        
    /**
     * [toast 提示框]
     * @param  {string} msg   [提示消息]
     * @param  {number} times [消失时间,毫秒]
     */
    toast: function(msg, times) {
        var id = this.countMaskNum(),
            times = times || 2000,
            html = `<div id="maskToast${id}" class="mask-toast" style="z-index:${id};">'${msg}</div>`;

        $('body').append(html);

        setTimeout(function() {
            $('body').find('#maskToast' + id).remove();
        }, times);
    }
                        
                    

alert 消息框

                        
    /**
     * [alert 消息框]
     * @param  {string} msg [消息内容]
     */
    alert: function(msg) {
        var id = this.countMaskNum();
        var html = `<div class="mask" style="z-index:${id};">
                        <section class="mask-alert">
                            <div class="alert-title">系统消息<a class="iconfont btn-close"></a></div>
                            <div class="alert-content">${msg}</div>
                            <div class="alert-btns">
                                <a class="btn btn-confirm btn-close">确定</a>
                            </div>
                        </section>
                    </div>`;

        $('body').append(html);
    }
                        
                    

confirm 确认框

                        
    /**
     * [confirm 确认框]
     * @param  {string}   msg      [消息内容]
     * @param  {Function} callback [回调函数]
     */
    confirm: function(msg, callback) {
        var id = this.countMaskNum();
        var html = `<div class="mask" style="z-index:${id};">
                        <section class="mask-confirm">
                            <div class="alert-title">系统消息<a class="iconfont btn-cancel"></a></div>
                            <div class="alert-content">${msg}</div>
                            <div class="alert-btns">
                                <a class="btn btn-cancel">取消</a>
                                <a class="btn btn-confirm">确定</a>
                            </div>
                        </section>
                    </div>`;

        $('body').append(html);

        // 确认确认框
        $('body').off('click.confirm');
        $('body').on('click.confirm', '.mask-confirm .btn-confirm', function() {
            $(this).closest('.mask').remove();
            callback();
        });
    }
                        
                    

图片等比缩放

                        
    /**
     * [imgRevision 图片等比缩放]
     * @param  {jQ Object} $img   [img对象]
     */
    imgRevision: function($img) {
        $img.load(function(){
            var width = $(this).width(),
                height = $(this).height(),
                w = $(this).parent().width(),
                h = $(this).parent().height();

            if (width/height > w/h) {
                $(this).width(w);
                $(this).css('margin-top', -1/2 * ($(this).height() - h));
            } else {
                $(this).height(h);
                $(this).css('margin-left', -1/2 * ($(this).width() - w));
            }
        });
    }
                        
                    

countdown 倒计时

                        
    /**
     * [countdown 倒计时]
     * @param  {jQ Object}  $btn   [按钮]
     * @param  {Number} 	time   [倒计时秒数]
     * @param  {String} 	txt    [倒计时结束文案]
     */
    countdown: function($btn, time, txt) {
        var t = time || 60;
            txt = txt || '再次发送';

        var timer = setInterval(function() {
            t--;
            if (t < 0) {
                clearInterval(timer);
                $btn.html(txt).removeClass('disabled');
                return;
            }

            $btn.html(t + '秒');
        }, 1000);
    }
                        
                    

数据比较 返回有修改的数据

                        
    // 编辑数据比较,返回真正修改的数据
    _diffData (data, oldData) {
        let newData = {};
        for (let key in data) {
            for (let k in oldData) {
                if (key == k) {
                    if (this.data[key] != this.oldData[k]) {
                        newData[key] = this.data[key];
                    }
                }
            }
        }
        return newData;
    }