• 自己收集的工作js库---2018-02-07


    今年工作进度到这里结束,整理一下今年收集的自用js库,后期会更新,代码已贴github=>https://github.com/lpg-kobe/personal-github

      

    /**
    * @param {long} //通用函数库
    * @param {onerror} //js错误调试
    * @author lpg 2017-11-02
    */

    window.onerror = function (errorMessage, scriptURI, lineNumber, columnNumber, errorObj) {
    console.log("错误信息:", errorMessage);
    console.log("出错文件:", scriptURI);
    console.log("出错行号:", lineNumber);
    console.log("出错列号:", columnNumber);
    console.log("错误详情:", errorObj);
    }

    var eventUtils = {//跨浏览器事件
    getEvent: function (event) {//获取事件
    return event ? event : window.event
    },
    addHandler: function (ele, type, handler) {//事件监听
    if (ele.addEventListener) {
    ele.addEventListener(type, handler)
    } else if (ele.attachEvent) {
    ele.attachEvent('on' + type, handler)
    } else {
    ele['on' + type]
    }
    },
    removeHandler: function (ele, type, handler) {//移除监听
    if (ele.removeEventListener) {
    ele.removeEventListener(type, handler)
    } else if (ele.attachEvent) {
    ele.detachEvent('on' + type, handler)
    } else {
    ele['on' + type]
    }
    },
    getTarget: function (event) {//事件目标
    if (event.target) {
    return event.target
    } else {
    return event.srcElement
    }
    },
    preventDefault: function (event) {//阻止默认事件
    if (event.preventDefault) {
    return event.preventDefault
    } else {
    return event.returnValue = false
    }
    },
    stopPropagation: function (event) {//阻止冒泡
    if (event.stopPropagation) {
    return event.stopPropagation
    } else {
    return event.cancelBubble = true
    }
    }
    }
    /*
    *通用ajax请求
    *需引入jq库支持
    */
    var xhr = {
    ajaxRequest(options = {
    type: 'Get'
    }) {//同步ajax
    var ajax = {
    type: options.type,
    url: options.url,
    data: options.data,
    dataType: 'json',
    xhrFields: {
    withCredentials: true
    },
    crossDomain: true
    };
    ajax.success = (result) => {
    console.log(result)
    };
    $.ajax(ajax)
    },
    async asyncRequest(options = {
    type: 'Get'
    }) {//异步ajax
    return new promise((resolve, reject) => {
    var ajax = {
    type: options.type,
    url: options.url,
    data: options.data,
    dataType: 'json',
    async: true,
    xhrFields: {
    withCredentials: true
    },
    crossDomain: true
    };
    ajax.success = (result) => {
    resolve(result);
    console.log(result)
    };
    ajax.error = (error) => {
    resolve(error)
    };
    $.ajax(ajax)
    })
    }
    }


    /**
    * @param {httpGet()}老版本http请求
    * @method => httpGet({'请求url','传输data','回调函数'})
    */


    function httpGet(services, data, callback) {
    var url = 'example';
    $.ajax({
    url: url,
    data: data,
    dataType: 'json',
    xhrFields: {
    withCredentials: true
    },
    crossDomain: true,
    success: function (data) {
    var info = data['data']['info'];//返回数据格式视情况而定
    if (data['ret'] == 200 && data['data']['code'] == 0) {
    callback(info);
    } else {
    if (data['data']['code'] == 700) {
    return;
    }
    var msg = data['data'] && data['data']['msg'] ? data['data']['msg'] : '';
    msg = msg == '' && data['msg'] ? data['msg'] : msg;
    //xhr.showmsg(msg);
    }
    },
    error: function (data) {

    }
    })
    }


    /* 封装ajax函数
    1 * @param 简易原生ajax
    2 * @param {string}opt.type http连接的方式,包括POST和GET两种方式
    3 * @param {string}opt.url 发送请求的url
    4 * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的
    5 * @param {object}opt.data 发送的参数,格式为对象类型
    6 * @param {function}opt.success ajax发送并接收成功调用的回调函数
    7 */
    function Ajax(opt) {
    opt = opt || {};
    opt.method = opt.method.toUpperCase() || 'POST';
    opt.url = opt.url || '';
    opt.async = opt.async || true;
    opt.data = opt.data || null;
    opt.success = opt.success || function () { };
    var xmlHttp = null;
    if (XMLHttpRequest) {
    xmlHttp = new XMLHttpRequest();
    }
    else {
    xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
    };
    var params = [];
    for (var key in opt.data) {
    params.push(key + '=' + opt.data[key]);
    }
    var postData = params.join('&');
    if (opt.method.toUpperCase() === 'POST') {
    xmlHttp.open(opt.method, opt.url, opt.async);
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
    xmlHttp.send(postData);
    }
    else if (opt.method.toUpperCase() === 'GET') {
    xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
    xmlHttp.send(null);
    }
    xmlHttp.onreadystatechange = function () {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
    opt.success(xmlHttp.responseText);
    }
    };
    }

    /**
    * 分页加载器
    * @type {Function}
    * 方法可扩展
    */

    function pagingLoad(options) { //分页加载
    if (!document.getElementById('load_txt')) {
    this.loadTxt = document.createElement('div');
    loadTxt.id = "load_txt";
    loadTxt.style.textAlign = "center";
    document.body.appendChild(loadTxt);
    };
    this.oPageLoad = {
    page: 1,
    el: options.el, //滚动的对象
    apiUrl: options.url,
    data: options.data || {},
    tailload: true,
    sucload: true,
    totalpage: options.totalpage, //总页数
    containArea: options.containArea, //内容区
    callback: options.callback
    };
    var _this = this;
    this.oPageLoad.el.onscroll = function () {
    var scrollTop = this.scrollTop, //滚动条距顶部的高度
    containHei = _this.oPageLoad.containArea.scrollHeight, //内容高度(scrollHeight)
    clientHei = this.clientHeight; //可视高度
    console.log('当前总页数' + _this.oPageLoad.totalpage, scrollTop, containHei, clientHei);
    if (_this.oPageLoad.page == _this.oPageLoad.totalpage && containHei - scrollTop - clientHei < 20) { //判断页码是否等于总页码且滚动条到达最底部
    if (_this.oPageLoad.tailload) {
    _this.loadTxt.innerHTML = "已全部加载完成";
    _this.oPageLoad.tailload = !_this.oPageLoad.tailload;
    return;
    } else {
    _this.loadTxt.innerHTML = "已全部加载完成";
    return;
    }
    };

    if (containHei - scrollTop - clientHei < 20 && _this.oPageLoad.sucload) {
    _this.oPageLoad.page++;
    _this.oPageLoad.sucload = !_this.oPageLoad.sucload;
    _this.loadTxt.innerHTML = "加载中...";
    console.log('loading...第' + _this.oPageLoad.page + '页');
    _this.oPageLoad.data["page"] = _this.oPageLoad.page;
    httpGet(_this.oPageLoad.apiUrl, _this.oPageLoad.data, function (data) {//请求加载
    commonArray = commonArray.concat(data);
    if (pagingLoadOption.containArea == document.getElementById('successList')) {//区分区块分区加载
    var $successData = template('success_list', {info: commonArray,timeFormat: timeFormat });
    $("#successList").html($successData);
    } else {
    var $inviteData = template('invite_list', {info: commonArray,timeFormat: timeFormat });
    $("#inviteList").html($inviteData);
    };
    _this.loadTxt.innerHTML = "";
    _this.oPageLoad.sucload = !_this.oPageLoad.sucload;
    });

    };

    };

    }

    /**
    * @param {function} 实用函数
    * @method => bVersion()判断浏览器内核信息EXP:if(bVersion.iwx)
    * @method => getExplore获取浏览器类型和版本,EXP:return Safari:9.0
    * @method => toArray(['1','2'],2)仿Array.shift()方法从头部清除数组指定长度并返回新数组
    * @method => initRun() 根据设备视口clientWidth宽度调节字体大小(基于750px宽度设计稿设置跟元素字体大小20px==1rem)
    * @method => getQueryString() 获取url链接中参数对应的值
    * @method => setStore(key, value) 本地存储key的value
    * @method => getStore(key, exp, name) 取存储的数据:key[名称]exp[过期时间]name[指定命名的变量]
    * @method => hasClass(ele,cls)判断element节点是否存在clasName('cls')
    * @method => addClass(ele,cls)在hasClass判断基础上添加clasName('cls')
    * @method => removeClass(ele,cls)在hasClass判断基础上移除clasName('cls')
    * @method => getCookie(name)获取名为name的cookie值cookName[0]为键名,cookName[1]为键值
    * @method => setCookie(name,value,days)设置过期时间戳expires为days名为name值为value的cookie
    * @method => removeCookie(name)重新设置过期的cookie即可移除
    * @method => randomColor生成随机颜色#xxxxxx
    * @method => randomNum生成指定范围的随机数(min-max)
    * @method => isPhoneNum(str)是否为手机号
    */

    var utils = {
    bVersion: function () {
    var u = navigator.userAgent;
    return { //移动终端浏览器内核信息
    trident: u.indexOf('Trident') > -1, //IE内核
    presto: u.indexOf('Presto') > -1, //opera内核
    webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
    mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端
    ios: !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
    android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
    iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器
    iPad: u.indexOf('iPad') > -1, //是否iPad
    iwx: /MicroMessenger/i.test(u),//是否微信
    iWeiBo: /Weibo/i.test(navigator.userAgent)//微博客户端
    };
    }(),

    getExplore: function () {//获取浏览器类型和版本
    var sys = {},
    ua = navigator.userAgent.toLowerCase(),
    s; (s = ua.match(/rv:([d.]+)) like gecko/)) ? sys.ie = s[1] : (s = ua.match(/msie ([d.]+)/)) ? sys.ie = s[1] : (s = ua.match(/edge/([d.]+)/)) ? sys.edge = s[1] : (s = ua.match(/firefox/([d.]+)/)) ? sys.firefox = s[1] : (s = ua.match(/(?:opera|opr).([d.]+)/)) ? sys.opera = s[1] : (s = ua.match(/chrome/([d.]+)/)) ? sys.chrome = s[1] : (s = ua.match(/version/([d.]+).*safari/)) ? sys.safari = s[1] : 0;

    // 根据关系进行判断
    if (sys.ie) return ('IE: ' + sys.ie)

    if (sys.edge) return ('EDGE: ' + sys.edge)

    if (sys.firefox) return ('Firefox: ' + sys.firefox)

    if (sys.chrome) return ('Chrome: ' + sys.chrome)

    if (sys.opera) return ('Opera: ' + sys.opera)

    if (sys.safari) return ('Safari: ' + sys.safari)

    return 'Unkonwn'
    },

    toArray(arr, len) {
    len = len || 0;
    var i = arr.length - len;
    var ret = new Array(i);
    while (i--) {
    ret[i] = arr[i + len];
    }
    console.log(ret);
    return ret
    },

    hasClass: function (ele, cls) {//true||false
    return (new RegExp('(\s|^)' + cls + '(\s|$)')).test(ele.className);
    },

    addClass: function (cls) {
    if (!hasClass(ele, cls)) {
    ele.className += '' + cls;
    }
    },

    removeClass: function (cls) {
    if (hasClass(ele, cls)) {
    var exp = new RegExp('(\s|^)' + cls + '(\s|$)');
    ele.className = ele.className.replace(exp, ' ');
    }
    },

    getCookie: function (name) {
    var cookArr = document.cookie.replace(/s/g, "").split(';');
    for (var i = 0, len = cookArr.length; i < len; i++) {
    var cookName = cookArr[i].split('=');
    if (cookName[0] == name) {
    return decodeURIComponent(cookName[1]);
    }
    };
    return '';
    },

    setCookie: function (name, value, days) {
    var date = new Date();
    date.setDate(date.getDate() + days);
    document.cookie = name + '=' + value + ';expires=' + date;
    },

    removeCookie: function (name) {
    //设置过期cookie会自动移除
    setCookie(name, '1', -1)
    },

    randomColor: function () {
    return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(- 6);
    },

    rendomNum: function (min, max) {
    return Math.floor(Math.random() * (max - min) + min);
    },

    isPhoneNum: function (str) {
    return /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/.test(str)
    },

    copy: function (event) {//有选择性使用
    var input = document.createElement('input');
    input.type = "text";
    input.value = "contain to copy";
    event.currentTarget.appendChild(input);
    input.select();
    document.execCommand('copy', false, null);
    },

    initRun: function () {//响应式字体大小
    var _this = this,
    resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
    _this.fontAdapt();
    window.onresize = function () {
    _this.fontAdapt();
    }
    },

    fontAdapt: function () {//div-width(375px)=>(html(20px)=>1rem)==(html(80px)=>html((80/2)px)=2rem)
    var w = document.documentElement.clientWidth,
    fz = w * 20 / 375;//375为基准视图宽度,为设计稿宽度/2; 20为自定义根字体像素大小
    document.getElementsByTagName(html)[0].style.fontSize = fz + 'px';
    },

    getQueryString: function (key) { //正则获取url后面的参数值'?service=&name=name'=>name
    const reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)");
    const result = window.location.search.substr(1).match(reg);
    return result ? decodeURIComponent(result[2]) : null;
    },

    setStore(key, value) { //localStorage存储数据 key[名称]value[数据]=>(配合store.min.js使用)
    const storeTime = new Date().getTime();
    value['setKeyTime'] = storeTime;
    store.set(key, value);
    },

    getStore(key, exp, name) { //取存储的数据:key[名称]exp[过期时间]name[指定命名的变量]
    const getKeyData = store.get(key);
    exp && getKeyData && (new Date().getTime() - getKeyData.setKeyTime > exp) && store.remove(key) && (name && (name = store.get(key)));
    return getKeyData;
    },

    showmsg(msg) {//提示框
    const $formMsg = document.getElementById('form-msg');
    if ($formMsg == null || $formMsg == "") {
    const tipEle = document.createElement("div");
    tipEle.className = "tc form-msg";
    tipEle.id = "form-msg";
    tipEle.innerHTML = msg;
    document.body.appendChild(tipEle);
    } else {
    $formMsg.style.display = "block";
    $formMsg.innerHTML = msg;
    }
    setTimeout(() => {
    document.getElementById('form-msg').style.display = "none";
    }, 1000);
    }
    }
    utils.initRun();

    /**
    * localStorage兼容性处理
    */
    if (!window.localStorage) {
    Object.defineProperty(window, "localStorage", new (function () {
    var aKeys = [], oStorage = {};
    Object.defineProperty(oStorage, "getItem", {
    value: function (sKey) { return sKey ? this[sKey] : null; },
    writable: false,
    configurable: false,
    enumerable: false
    });
    Object.defineProperty(oStorage, "key", {
    value: function (nKeyId) { return aKeys[nKeyId]; },
    writable: false,
    configurable: false,
    enumerable: false
    });
    Object.defineProperty(oStorage, "setItem", {
    value: function (sKey, sValue) {
    if (!sKey) { return; }
    document.cookie = escape(sKey) + "=" + escape(sValue) + "; path=/";
    },
    writable: false,
    configurable: false,
    enumerable: false
    });
    Object.defineProperty(oStorage, "length", {
    get: function () { return aKeys.length; },
    configurable: false,
    enumerable: false
    });
    Object.defineProperty(oStorage, "removeItem", {
    value: function (sKey) {
    if (!sKey) { return; }
    var sExpDate = new Date();
    sExpDate.setDate(sExpDate.getDate() - 1);
    document.cookie = escape(sKey) + "=; expires=" + sExpDate.toGMTString() + "; path=/";
    },
    writable: false,
    configurable: false,
    enumerable: false
    });
    this.get = function () {
    var iThisIndx;
    for (var sKey in oStorage) {
    iThisIndx = aKeys.indexOf(sKey);
    if (iThisIndx === -1) { oStorage.setItem(sKey, oStorage[sKey]); }
    else { aKeys.splice(iThisIndx, 1); }
    delete oStorage[sKey];
    }
    for (aKeys; aKeys.length > 0; aKeys.splice(0, 1)) { oStorage.removeItem(aKeys[0]); }
    for (var iCouple, iKey, iCouplId = 0, aCouples = document.cookie.split(/s*;s*/); iCouplId < aCouples.length; iCouplId++) {
    iCouple = aCouples[iCouplId].split(/s*=s*/);
    if (iCouple.length > 1) {
    oStorage[iKey = unescape(iCouple[0])] = unescape(iCouple[1]);
    aKeys.push(iKey);
    }
    }
    return oStorage;
    };
    this.configurable = false;
    this.enumerable = true;
    })());
    } else {
    return window.localStorage
    }

    /**
    * 原生js仿jq常用API操作DOM
    * @type {Object}
    * @method $(".selector").method()
    * @method {.css}=>$(".selector").css({Obj})
    * @return this
    */

    //$ selector
    function $(selector) {
    return document.querySelector(selector)
    }
    //hide()
    Object.prototype.hide = function () {
    this.style.display = "none";
    return this;
    };
    //show()
    Object.prototype.show = function () {
    this.style.display = "block";
    return this;
    };
    //hasClass()
    Object.prototype.hasClass = function (cName) {
    return !!this.className.match(new RegExp("(\s|^)" + cName + "(\s|$)"));
    }
    //addClass()
    Object.prototype.addClass = function (cName) {
    if (!this.hasClass(cName)) {
    this.className += " " + cName;
    }
    return this;
    }
    //removeClass()
    Object.prototype.removeClass = function (cName) {
    if (this.hasClass(cName)) {
    this.className = this.className.replace(new RegExp("(\s|^)" + cName + "(\s|$)"), " ");
    }
    return this;
    }
    //parent()
    Object.prototype.parent = function () {
    return this.parentNode;
    }
    //next()
    Object.prototype.next = function () {
    return this.nextElementSibling;
    }
    //prev()
    Object.prototype.prev = function () {
    return this.previousElementSibling;
    }
    //siblings()
    Object.prototype.siblings = function () {
    var chid = this.parentNode.children;
    var eleMatch = [];
    for (var i = 0, l = chid.length; i < l; i++) {
    if (chid[i] != this) {
    eleMatch.push(chid[i]);
    }
    }
    return eleMatch;
    }
    //css()
    Object.prototype.css = function (cssObj) {
    var cssStr = '';
    function objToCssStr(cssObj) {
    for (var k in cssObj) {
    cssStr += k + ':' + cssObj[k] + ';'
    };
    return cssStr
    };
    this.style.cssText = objToCssStr(cssObj);
    }

    /**
    * @desc 判断原生类型
    * @return {Boolean}
    */

    function isObject(obj) {//Object or not
    return Object.prototype.toString.call(obj) === '[object Object]'
    }

    function isNumber(num) {//Number or not
    return Object.prototype.toString.call(num) === '[object Number]'
    }

    function isString(str) {//String or not
    return Object.prototype.toString.call(str) === '[object String]'
    }

    function isArray(arr) {//Array or not
    return Object.prototype.toString.call(arr) === '[object Array]'
    }

    function isBoolean(boolean) {//Boolean or not
    return Object.prototype.toString.call(boolean) === '[object Boolean]'
    }

    function isFunction(fn) {//Function or not
    return Object.prototype.toString.call(fn) === '[object Function]'
    }

    function isRegExp(reg) {//RegExp or not
    return Object.prototype.toString.call(reg) === '[object RegExp]'
    }

    function looseEqual(a, b) {//check two parameter is looslyEqual or not(===)
    if (a === b) { return true }
    var isObjectA = isObject(a);
    var isObjectB = isObject(b);
    if (isObjectA && isObjectB) {
    try {
    var isArrayA = Array.isArray(a);
    var isArrayB = Array.isArray(b);
    if (isArrayA && isArrayB) {
    return a.length === b.length && a.every(function (e, i) {
    return looseEqual(e, b[i])
    })
    } else if (!isArrayA && !isArrayB) {
    var keysA = Object.keys(a);
    var keysB = Object.keys(b);
    return keysA.length === keysB.length && keysA.every(function (key) {
    return looseEqual(a[key], b[key])
    })
    } else {
    /* istanbul ignore next */
    return false
    }
    } catch (e) {
    /* istanbul ignore next */
    return false
    }
    } else if (!isObjectA && !isObjectB) {
    return String(a) === String(b)
    } else {
    return false
    }
    };
  • 相关阅读:
    javascript之createElement事件
    rgb颜色列表
    欧美很好听的调调
    转:JMeter--使用代理录制Web性.能测试脚.本
    转:使用 JMeter 完成常用的压力测试
    转: 理解 JMeter 聚合报告(Aggregate Report)
    转:jmeter实践
    转:支付漏洞的三种常见类型
    转:LoadRunner获取毫秒及字符串替换实现
    转:Windows平台配置Appium+Java环境
  • 原文地址:https://www.cnblogs.com/lpggo/p/8427423.html
Copyright © 2020-2023  润新知