Javascript常用总结

一、Ajax 封装


    /**
     * 一、1.1 封裝AJAX函數
     * @param {*} option 必须,请求参数
     * option
     * ajaxType:必须,请求类型,GET/POST
     * urlStr:必须,接口URL
     * ajaxData:必须,GET时候为null,POST的时候为Object{ key:value }
     * @param {*} success 必须,成功回调函数
     * @param {*} error 必须,失败回调函数
     */

    function nativeAjax(option, success, error) {
        // 定义domain,方便环境切换
        /*
         *window.location.host在IE中有兼容性
         */
        var domain = 'https://' + window.location.host + '/';
        // var domain='http://' + window.location.host + '/';
        var url = domain + option.urlStr;
        var type = option.ajaxType;
        var data = option.ajaxData;
        var xhrRequest = null;
        if (window.XMLHttpRequest) {
            xhrRequest = new XMLHttpRequest();
        } else {
            xhrRequest = new ActiveXObject('Microsoft.XMLHTTP')
        }
        var str = null;
        xhrRequest.open(type, url, true);
        if (type === "POST" && data != null) {
            xhrRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
            for (var key in data) {
                str += '&' + key + '=' + data[key];
                str = str.slice(1);
            }
        }
        xhrRequest.onreadystatechange = function() {
            if (xhrRequest.readyState == 4) {
                if (xhrRequest.status == 200) {
                    // 1.1、格式化返回的数据
                    var responseData = JSON.parse(xhrRequest.responseText);
                    // 1.2、这里操作数据--------
                    success(responseData);
                } else {
                    // 1.3、没成功返回HTTP状态码
                    error(xhrRequest.status);
                }
            }
        }
        xhrRequest.send(str);
    }
    // Example、POST:定義請求參數
    var postOption = {
        ajaxType: "POST",
        urlStr: "/info",
        ajaxData: {
            "HTTP_USER_TOKEN": token,
            "HTTP_USER_UID": pfid,
        }
    }
    nativeAjax(postOption, function(data) {
        console.log(data);
    }, function(error) {
        console.log(error);
    });
    //    Example、GET:定义请求参数
    var getOption = {
        ajaxType: "GET",
        urlStr: "/good_list",
        ajaxData: null
    }
    nativeAjax(getOption, function(data) {
        console.log(data);
    }, function(error) {
        console.log(error);
    });


    /**
     * 一、1.2  使用Promise 封裝簡單的Ajax函數
     *  es6: Promise(resolve,reject) 
     *     @param {resolve,reject} 2個參數都是回調函數,
     *     resolve 類似:success 回調
     *     rejcect 類似:error 回調
     * 
     **/

    const Ajax = (method, url, data) => {
        let xhrRequest = null
        if (window.XMLHttpRequest) {
            xhrRequest = new XMLHttpRequest()
        } else {
            xhrRequest = new ActiveXObject('Microsoft.XMLHTTP')
        }

        return new Promise((resolve, reject) => {
            let str = null
            xhrRequest.open(method, url, true)

            if (method === "POST" && data != null) {
                xhrRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8")
                for (var key in data) {
                    str += '&' + key + '=' + data[key]
                    str = str.slice(1)
                }
            }

            xhrRequest.onreadystatechange = function() {
                if (xhrRequest.readyState == 4) {
                    if (xhrRequest.status == 200) {
                        resolve(xhrRequest.responseText)
                    } else {
                        reject(xhrRequest.status)
                    }
                }
            }

            xhrRequest.send(str)
        })
    }

    module.exports = Ajax


    Ajax("GET", "sss/cccas/ddd").then(response => {
        if (response) {
            // 成功了
        }
    }).catch(error => {
        console.log(error)
    })

二、判断是否是IOS


    function isIos() {
        var u = navigator.userAgent,
            app = navigator.appVersion;
        //ios终端
        var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
        return isiOS;
    }

三、关于原生JS操作className


    /**
     * 1:是否含有某个class,返回:true/false
     * 2:没有指定的className就追加指定的className
     * 3:有指定的className就删除指定的className
     * @param {*} elem 必须,原生DOM 
     * @param {*} cls 必须,String,指定的className
     */
    // 1、是否函数指定的className
    function hasClass(elem, cls) {
        return elem.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
    }
    // 2、没有就追加指定className
    function addClass(elem, cls) {
        if (!hasClass(elem, cls)) {
            elem.className += " " + cls;
        }
    }
    // 3、有就移除指定className
    function removeClass(elem, cls) {
        if (hasClass(elem, cls)) {
            var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
            elem.className = elem.className.replace(reg, "");
        }
    }

四、DOM操作


    // 4.1封装指定符号获取DOM
    window.$ = HTMLElement.prototype.$ = function(selector) {
        return (this == window ? document : this).querySelectorAll(selector);
    }
    // 4.2根据ID获取指定DOM
    function getEleId(id) {
        return document.getElementById(id);
    }
    // 4.3 向指定DOM追加HTML,id,html都是必须
    function pushHtml(id, html) {
        return document.getElementById(id).innerHTML = html;
    }

五、封装綁定事件


    /**
     * @param {*} type 必须,绑定事件类型
     * @param {*} selector 必须,nodeName / className / id
     * @param {*} callback 必须,绑定成功后的回调,继续操作DOM
     */
    function on(type, selector, callback) {
        document.addEventListener(type, function(e) {
            e.preventDefault();
            e.stopPropagation();
            if (selector == e.target.tagName.toLowerCase() || selector == e.target.className || selector == e.target.id) {
                callback(e);
            }
        })
    }
    // Example
    on("click", "btn", function() {
        console.log("给btn按钮绑定了点击事件")
    })

六 、原生JS获取之前(prevAll)或者之后(nextAll)的所有兄弟元素


    /**
     * 
     *     类似JQ的 prevAll和nextAll
     */
    HTMLElement.prototype.prevAll = function() {
        var parent = this.parentElement;
        var children = parent.children;
        var arr = [];
        for (var i = 0; i < children.length; i++) {
            var previous = children[i];
            if (previous == this) {
                break;
            }
            arr.push(previous);
        }
        return arr;
    }

    HTMLElement.prototype.nextAll = function() {
        var parent = this.parentElement;
        var children = parent.children;
        var arr = [];
        for (var i = children.length - 1; i >= 0; i--) {
            var nexts = children[i];
            if (nexts == this) {
                break;
            }
            arr.unshift(nexts);
        }
        return arr;
    }
    // Example
    var temp = function(dom) {
        console.log("prevAll=", dom.prevAll());
        console.log("nextAll=", dom.nextAll());
    }

七、获取URL中指定某个参数的值


    /**
     * 
     * @param {*} strParame 必须,string,返回指定的值
     * 
     */
    function getUrlParameter(strParame) {
        var args = new Object();
        var query = location.search.substring(1);
        var pairs = query.split("&");
        for (var i = 0; i < pairs.length; i++) {
            var pos = pairs[i].indexOf('=');
            if (pos == -1) continue;
            var argname = pairs[i].substring(0, pos);
            var value = pairs[i].substring(pos + 1);
            value = decodeURIComponent(value);
            args[argname] = value;
        }
        return args[strParame];
    }
    // Example    "dsaldlas.csadja.com/fhlfh.html?key=10&id=hello";
    var key = getUrlParameter("key"); //10
    var id = getUrlParameter("hello"); //10

九、简单的加密和解密


    /**
     * 
     * @param {*} str 必须,string,要加密的对象 
     * @param {*} xor 必须,加密解密的计算参数
     * @param {*} hex 必须,加密解密的计算参数
     */
    // 加密
    function encrypto(str, xor, hex) {
        if (typeof str !== 'string' || typeof xor !== 'number' || typeof hex !== 'number') {
            return;
        }
        let resultList = [];
        hex = hex <= 25 ? hex : hex % 25;
        for (let i = 0; i < str.length; i++) {
            // 提取字符串每个字符的ascll码
            let charCode = str.charCodeAt(i);
            // 进行异或加密
            charCode = (charCode * 1) ^ xor;
            // 异或加密后的字符转成 hex 位数的字符串
            charCode = charCode.toString(hex);
            resultList.push(charCode);
        }
        let splitStr = String.fromCharCode(hex + 97);
        let resultStr = resultList.join(splitStr);
        return resultStr;
    }
    //解密
    function decrypto(str, xor, hex) {
        if (typeof str !== 'string' || typeof xor !== 'number' || typeof hex !== 'number') {
            return;
        }
        let strCharList = [];
        let resultList = [];
        hex = hex <= 25 ? hex : hex % 25;
        // 解析出分割字符
        let splitStr = String.fromCharCode(hex + 97);
        // 分割出加密字符串的加密后的每个字符
        strCharList = str.split(splitStr);
        for (let i = 0; i < strCharList.length; i++) {
            // 将加密后的每个字符转成加密后的ascll码
            let charCode = parseInt(strCharList[i], hex);
            // 异或解密出原字符的ascll码
            charCode = (charCode * 1) ^ xor;
            let strChar = String.fromCharCode(charCode);
            resultList.push(strChar);
        }
        let resultStr = resultList.join('');
        return resultStr;
    }
    // Example
    var pwd = "BLUE123456!";
    var enPwd = encrypto(pwd, 135, 25);
    var dePwd = decrypto(enPwd, 135, 25);
    console.log(enPwd); //27z25z1lz2cz2oz2nz2mz34z33z32z3f
    console.log(dePwd); //BLUE123456!

十、判断两个数组是否相等


    /**
     * @param {*} arr1 必须,Array 
     * @param {*} arr2 必须,Array
     * 返回:true/false
     */
    function arrayEqual(arr1, arr2) {
        if (arr1 === arr2) return true;
        if (arr1.length != arr2.length) return false;
        for (var i = 0; i < arr1.length; ++i) {
            if (arr1[i] !== arr2[i]) return false;
        }
        return true;
    }

十一、操作数字


    // 1 转换为万或者千万,最大支持千万
    function numberToMillion(count) {
        var end = '';
        count = count.toString();
        var length = count.length;
        if (length >= 6 && length < 9) {
            end = (count / 10000).toFixed(1);
            var index = end.indexOf(".");
            var last = end.slice(index + 1);
            if (!Number(last)) {
                end = end.slice(0, index);
            }
            end = end + "萬";
        } else if (length >= 9) {
            end = (count / 10000000).toFixed(1);
            var index = end.indexOf(".");
            var last = end.slice(index + 1);
            if (!Number(last)) {
                end = end.slice(0, index);
            }
            end = end + "千萬";
        } else if (length < 6) {
            end = count;
        }
        return end;
    }
    // Example
    numberToMillion(12346589) // => "1234.7萬"


    // 2 转换为带K(或者指定符号)
    function numberToK(count) {
        var end = '';
        count = count.toString();
        return end = count.length > 4 ? (count / 1000).toFixed(1) + "K" : count;
    }
    // Example
    numberToK(456798) // => "456.8K"

    // 3 从尾部每三位用符号隔开
    function numberWithComma(num) {
        var num = (num || 0).toString(),
            result = '';
        while (num.length > 3) {
            result = ',' + num.slice(-3) + result;
            num = num.slice(0, num.length - 3);
        }
        if (num) {
            result = num + result;
        }
        return result;
    }
    // Example 
    numberWithComma(4567889798) // => "4,567,889,798"

十二、限制按钮点击


    /**
     * 
     *  repeat(id,num) @param {id:"String",哪個按鈕的點擊;num:"Number",多少秒后可以點擊}
     * 
     */
    const CAN_STORE = {
        repeatTemp: [],
        initTime: function() {
            return new Date().getTime();
        }
    }
    const CAN_IS_REPEAT = {
        repeat: function(id, num) {
            /**
             *  id :string,標識符,哪個點擊事件
             *  num : 整數 t秒內只可以點擊一次
             *  num 不存在,限制执行频率,默认为60秒 允许执行时返回false  毫秒
             */
            let t = num ? num * 1000 : 60000;
            let time = CAN_STORE.initTime()
            if (!CAN_STORE.repeatTemp[id]) {
                CAN_STORE.repeatTemp[id] = time
                //允许
                return false
            } else {
                let ts = t - (time - CAN_STORE.repeatTemp[id]);
                ts = parseInt(ts / 1000)
                if (ts > 0) {
                    //禁止执行
                    return true
                } else {
                    //更新时间
                    CAN_STORE.repeatTemp[id] = time
                    //允许
                    return false
                }
            }
        }
    }

    function canClick() {
        // 3 秒內只能點擊一次
        let isRepeat = CAN_IS_REPEAT.repeat("repeat", 3)
        if (!isRepeat) {
            // 正常todo
        } else {
            // 操作頻繁
        }
    }
    // Example
    document.getElementById("btn").addEventListener("click", canClick)

十三、计算2个标准日期的时间差,或者剩余时间


    /**
     * 
     * timeToMillion(startStr, endStr)
     * @param {startStr} 必须,endStr不存在时候是>0的秒数,endStr存在的时候startStr必须是标准时间格式且小于endStr
     * @param {endStr} 可选,如果存在必须是标准时间格式且大于startStr
     */
    function timeToMillion(startStr, endStr) {
        var times;
        if (endStr) {
            var startT = new Date(startStr).getTime()
            var endT = new Date(endStr).getTime()
            times = (endT - startT) / 1000
        } else if (startStr && startStr != 0) {
            times = startStr
        }
        var day, hour, minute, endOutStr;
        if (times > 0) {
            // console.log(times)
            day = Math.floor(times / (60 * 60 * 24));
            hour = Math.floor(times / (60 * 60)) - (day * 24);
            minute = Math.floor(times / 60) - (day * 24 * 60) - (hour * 60);
            // second = Math.floor(times) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);

            if (parseInt(day) != 0) {
                endOutStr = day + "天" + hour + "小時" + minute + "分鐘"
            } else {
                if (parseInt(hour) != 0) {
                    endOutStr = hour + "小時" + minute + "分鐘"
                } else {
                    endOutStr = minute + "分鐘"
                }
            }
        } else {
            endOutStr = 0
        }
        // if (day <= 9) day = '0' + day;
        // if (hour <= 9) hour = '0' + hour;
        // if (minute <= 9) minute = '0' + minute;
        // if (second <= 9) second = '0' + second;
        return endOutStr
    }
    // Example
    timeToMillion(9613920) // => "111天6小時32分鐘"
    timeToMillion("2017-11-20 13:58:47", "2017-11-22 15:09:10") // => "2天1小時10分鐘"

results matching ""

    No results matching ""