JS常用工具类

1.获取当前dom相对于document的偏移量

 1 const getOffset = el => {
 2     console.log(el);
 3     const {top, left} = el.getBoundingClientRect();
 4     const {scrollTop, scrollLeft} = document.body;
 5     return {
 6         top: top + scrollTop,
 7         left: left + scrollLeft
 8     };
 9 };
10 console.log(getOffset(document.querySelector('div')));
11 //{top: 200, left: 8}

 

2.禁止网页复制粘贴

1 document.querySelector('html').oncopy = () => false;
2 document.querySelector('html').onpaste = () => false;

 

3.去除字符串前面空格

1 const trimStart = str => str.replace(new RegExp('^([\\s]*)(.*)$'), '$2');
2 console.log(trimStart(' abc1'));
3 //abc

 

4.时间格式化

 1 Date.prototype.Format = function (fmt) {
 2     var o = {
 3         'M+': this.getMonth() + 1, //月份
 4         'd+': this.getDate(), //
 5         'h+': this.getHours(), //小时
 6         'm+': this.getMinutes(), //
 7         's+': this.getSeconds(), //
 8         'q+': Math.floor((this.getMonth() + 3) / 3), //季度
 9         S: this.getMilliseconds() //毫秒
10     };
11     if (/(y+)/.test(fmt)) {
12         fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
13     }
14     for (var k in o) {
15         if (new RegExp('(' + k + ')').test(fmt)) {
16             fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
17         }
18     }
19     return fmt;
20 };
21 console.log(new Date().Format('yyyy年MM月dd日 hh时mm分ss秒'));
22 //2020年08月09日 14时54分27秒
23 
24 console.log(new Date().Format('yyyy-MM-dd hh:mm:ss'));
25 //2020-08-09 14:54:27
26 
27 console.log(new Date().Format('yyyy-MM-dd'));
28 //2020-08-09
29 
30 console.log(new Date().Format('hh:mm:ss'));
31 //14:54:27
32 
33 console.log(new Date().Format('yyyy-MM'));
34 //2020-08
35 
36 console.log(new Date().Format('hh:mm'));
37 //14:54
38 
39 console.log(new Date().Format('MM-dd'));
40 //08-09

5.查询url参数

 1 String.prototype.urlQuery = function () {
 2     var url = this.split('?')[1].split('&');
 3     this.urlobj = {};
 4     for (var i = 0; i < url.length; i += 1) {
 5         var cell = url[i].split('=');
 6         var key = cell[0];
 7         var val = cell[1];
 8         this.urlobj['' + key + ''] = val;
 9     }
10     return this.urlobj;
11 };
12 var url = 'http://www/baidu.com?name=12&age=1000';
13 // 查询所有参数
14 console.log(url.urlQuery());
15 // {name: "12", age: "1000"}
16 // 查询某一个参数
17 console.log(url.urlQuery().name);

6.电话模糊处理

 1 function fn(option) {
 2     // 判断传入的手机号码位数,不符合则返回提示
 3     if (String(option.mobile).length > 11) {
 4         return '手机号码格式错误';
 5     } else {
 6         let newmobile = String(option.mobile).slice(0, option.start) + '*'.repeat(option.num) + String(option.mobile).slice(option.start + option.num, String(option.mobile).length);
 7         // 如果新的手机号位数过长,则返回固定11位手机号
 8         return newmobile.slice(0, 11);
 9     }
10 }
11 console.log(fn({mobile: 13012345678, start: 3, num: 3}));
12 //130***45678

 

7.rgb转换为16进制

 1 function colorRGBtoHex(color) {
 2     var rgb = color.split(',');
 3     var r = parseInt(rgb[0].split('(')[1]);
 4     var g = parseInt(rgb[1]);
 5     var b = parseInt(rgb[2].split(')')[0]);
 6     var hex = '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
 7     return hex;
 8 }
 9 console.log(colorRGBtoHex('rgb(0,0,0)'));
10 //#000000

 

8.对象扁平化

 1 const flatten = function (obj) {
 2     var result = {};
 3     function recurse(src, prop) {
 4         var toString = Object.prototype.toString;
 5         if (toString.call(src) == '[object Object]') {
 6             var isEmpty = true;
 7             for (var p in src) {
 8                 isEmpty = false;
 9                 recurse(src[p], prop ? prop + '.' + p : p);
10             }
11             if (isEmpty && prop) {
12                 result[prop] = {};
13             }
14         } else if (toString.call(src) == '[object Array]') {
15             var len = src.length;
16             if (len > 0) {
17                 src.forEach(function (item, index) {
18                     recurse(item, prop ? prop + '.[' + index + ']' : index);
19                 });
20             } else {
21                 result[prop] = [];
22             }
23         } else {
24             result[prop] = src;
25         }
26     }
27     recurse(obj, '');
28     const _ = [];
29     Object.keys(result).forEach(item => {
30         _.push(`${item}=${result[item]}`);
31     });
32 
33     return _.join('&');
34 };
35 
36 console.log(flatten({a: {b: {c: {d: 1, e: 2}, f: 3}, h: 5}, g: 4}));
37 // a.b.c.d=1&a.b.c.e=2&a.b.f=3&a.h=5&g=4

 9.防抖

const debounce = (func, wait = 3000, immediate = true) => {
            let timeout = null;
            return function () {
                let context = this;
                let args = arguments;
                if (timeout) clearTimeout(timeout);
                if (immediate) {
                    var callNow = !timeout; //true
                    timeout = setTimeout(() => {
                        timeout = null;
                    }, wait); //定时器ID
                    if (callNow) func.apply(context, args);
                } else {
                    timeout = setTimeout(function () {
                        func.apply(context, args);
                    }, wait);
                }
            };
        };

10.节流

// 时间戳方案
        function throttle(fn, wait = 2000) {
            var pre = Date.now();
            return function () {
                var context = this;
                var args = arguments;
                var now = Date.now();
                if (now - pre >= wait) {
                    fn.apply(context, args);
                    pre = Date.now();
                }
            };
        }
        // 定时器方案
        function throttle(fn, wait = 3000) {
            var timer = null;
            return function () {
                var context = this;
                var args = arguments;
                if (!timer) {
                    timer = setTimeout(function () {
                        fn.apply(context, args);
                        timer = null;
                    }, wait);
                }
            };
        }

 11.使用iframe下载文件

const exportFile = ({ url, params }) => {
    if (url) {
        var _iframe = document.getElementById('download-file');
        if (_iframe) {
            document.body.removeChild(_iframe);
        }
        var _iframe = document.createElement('iframe');
        _iframe.style.display = 'none';
        _iframe.id = 'download-file';
        if (params) {
            _iframe.src = `${url}?${parseParams(params)}`;
        } else {
            _iframe.src = url;
        }
        document.body.appendChild(_iframe);
    }
};

12.将参数转化为url拼接格式

const parseParams = params => {
    if (params && typeof params == 'object') {
        let str = '';
        Object.keys(params).forEach(key => {
            str += `${key}=${params[key]}&`;
        });
        return str.substring(0, str.length - 1);
    }
};

13.获取文件后缀

cosnt getFileExt = fileName => {
    //获取最后一个.的位置
    var index = fileName.lastIndexOf('.');
    //获取后缀
    var ext = fileName.substr(index + 1);
    return ext;
};

14.获取url中的文件名

// url = 'http://xxxx/xxx/xx/file.png'
const getFileName = url => {
    let num = url.lastIndexOf('/') + 1;
    let name = url.substring(num);
    return name;
};

15.判断文件类型是否符合

const getFileType = (ext, target = ['xls', 'xlsx']) => {
    return target.indexOf(ext.toLowerCase()) !== -1;
};

16.是否以指定名称开头

const isAppointName = (name, fullName) => {
    if (name && fullName) {
        const nameLen = name.length;
        return fullName.substr(0, nameLen) === name;
    }
};
isAppointName(test,test123)
//true

17.数组中根据某个属性排序

const compareByProp = prop => {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
            val1 = Number(val1);
            val2 = Number(val2);
        }
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }
    };
};

18.生成UUID

const generateUUID = () => {
    var d = new Date().getTime();
    if (window.performance && typeof window.performance.now === 'function') {
        d += performance.now(); //use high-precision timer if available
    }
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = (d + Math.random() * 16) % 16 | 0;
        d = Math.floor(d / 16);
        return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
    });
    return uuid;
};

19.将file转为blob

const fileToBlob = file => {
    return new Promise(resolve => {
        resolve(window.URL.createObjectURL(file));
    });
};

20.将file转为base64

const fileToBase64 = file => {
    return new Promise(resolve => {
        let fileReader = new FileReader();
        fileReader.readAsDataURL(file);
        fileReader.onload = () => {
            resolve(fileReader.result);
        };
    });
};

21.将base64转为file

       // base64转file
     const  base64Tofile = (base64, filename) => {
            var arr = base64.split(','),
                mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]),
                n = bstr.length,
                u8arr = new Uint8Array(n);
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new File([u8arr], filename, { type: mime });
        },

22.将file地址转为base64

const fileUrlToBase64 = src => {
    function getBase64Image(img, width, height) {
        var canvas = document.createElement('canvas');
        canvas.width = width ? width : img.width;
        canvas.height = height ? height : img.height;
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
        var dataURL = canvas.toDataURL();
        return dataURL;
    }
    return new Promise(resolve => {
        const image = new Image();
        image.crossOrigin = '';
        image.src = src;
        image.onload = function () {
            resolve(getBase64Image(image));
        };
    });
};

23.是否是空对象

const isEmptyObject = obj => {
    return Object.keys(obj).length === 0;
};

 24.压缩图片

  const compressImg = ({ width, quality = 0.7, file, maxSize }) => {
            const _this = this;
            // 最大接受图片尺寸 2M
            maxSize = maxSize || 2 * 1024 * 1024;
            return new Promise(async (resolve, reject) => {
                if (!file) {
                    reject(new Error('img 不存在'));
                } else {
                    // 获取图片类型
                    let imgType = file.type;
                    // 获取图片名称
                    let imgName = file.name;
                    // 获取图片base64
                    let base64 = await this.fileToBase64(file);
                    let image = new Image();
                    image.src = base64;
                    image.onload = function () {
                        // 获得长宽比例
                        const scale = this.width / this.height;
                        //创建一个canvas
                        const canvas = document.createElement('canvas');
                        //获取上下文
                        const context = canvas.getContext('2d');
                        //获取压缩后的图片宽度,如果width为-1,默认原图宽度
                        canvas.width = width ? width : this.width;
                        canvas.height = width ? parseInt(width / scale) : this.height;
                        //把图片绘制到canvas上面
                        context.drawImage(image, 0, 0, canvas.width, canvas.height);
                        //压缩图片,获取到新的base64Url
                        const newBase64 = canvas.toDataURL(imgType, quality);
                        //将base64转化成文件流
                        const resultFile = _this.base64Tofile(newBase64, imgName);
                        let blobSrc = '';
                        if (resultFile.size > maxSize) {
                            _this.compressImg({ file: resultFile }).then(file => resolve(file));
                        } else {
                            // 压缩图片 获取到新的blob地址
                            canvas.toBlob(
                                function (blob) {
                                    blobSrc = URL.createObjectURL(blob);
                                    resolve({ resultFile, blobSrc, newBase64 });
                                },
                                imgType,
                                quality
                            );
                        }
                    };
                }
            });
        }

 

posted @ 2020-08-31 16:07  半糖也甜吖  阅读(545)  评论(0编辑  收藏  举报