zoukankan      html  css  js  c++  java
  • util.js

    轻量基础库、方法库

    用时可直接拷贝

    拆卸式使用

    适用于mobile端简单页面

    适用于PC简单页面

    基于node、php等多种构建方法

    (function(M){
    
        /**
         * 初始化Ajax请求
         * @param {object} option 参数
         *      {
         *          data: {key: val},        //数据JSON
         *          method: 'GET',           //GET 或者 POST
         *          url: 'http://qq.com',    //cgi地址
         *          success: function(res){  //成功回调
         *      }
         * @兼容性   PC: IE 6+   & Mobile All
         * @支持     XHR2 跨域
         *
         * @建议分类 HTTP
         *
         * @依赖方法   createInstance
         */
        var initRequest = function(option){
            console.log("Proxy starts creating Ajax!!");
    
            var httpRequest = createInstance();
            var success = option.success;
            var url = option.url;
            var method = option.method;
            var data = option.data;
    
            var dataArr = [];
            for(var i in data){
                dataArr.push(i + "=" + data[i]);
            }
    
            if(method == "GET"){
                url += "?" + dataArr.join("&");
            }
    
    
            if(httpRequest){
                httpRequest.onreadystatechange = function(){
                    if(this.readyState == 4){
                        console.log("Proxy Ajax loaded!!");
                        success && success(httpRequest.responseText);
                    }
                };
    
                httpRequest.open(method, url, false);
                httpRequest.withCredentials = true;
                //httpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                //httpRequest.setRequestHeader("X-Requested-From","_TC_QC_jsProxy_");
    
                httpRequest.send(JSON.stringify(data));
                console.log("Proxy created Ajax done!!method: " + method + "; data: " + JSON.stringify(data) + "----already send");
            }else{
                console.error("Proxy created Ajax Error!!");
            }
        };
    
        /**
         * 返回一个XHR实例
         * @兼容: PC: IE6 + & Mobile All
         * @参数: 空
         * @依赖: 无
         */
        var createInstance = function(){
            var xmlHttp;
    
            return new XMLHttpRequest();
    
            try{
                // Firefox,Opera 8.0+,Safari
                xmlHttp = new XMLHttpRequest();
            }catch(e){
                // Internet Explorer
                try{
                    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                }catch(e){
                    try{
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    }catch(e){
                        return false;
                    }
                }
            }
    
            return xmlHttp;
        };
    
    
        /**
         * 通过模板字符串生成HTML
         * @param {String} tmplStr  模板字符串
         * @param {Object} data 模板数据
         *
         * @兼容性: PC: IE 6+ & Mobile All
         * 
         * @依赖: 无
         *
         * @备注: 模板以<? ?>分隔JS代码如  模板内容中暂时无法使用单引号(双引替代)模板如
         *  <h2 class="<?=className?>"></h2><? alert("OK"); ?>
         */
        var getTmpl = function(tmplStr, data){
            var result;
    
            var varHtml = "";
            for(var i in data){
                varHtml += "var " + i + " = data." + i + ";";
            }
    
            tmplStr = tmplStr.replace(/s+/g, " ");
            tmplStr = varHtml + "var __result = ''; ?>" + tmplStr + "<?";
            tmplStr += " return __result;";
            tmplStr = tmplStr.replace(/<?=([^?]+)?>/g, "' + $1 + '").replace(/<?/gi, "';").replace(/?>/g,"__result += '");
    
            var str = new Function("data", tmplStr);
            result = str(data);
    
            return result;
        };
    
        /**
         * 渲染HTML中的模板标签
         * @param {String} 模板标签的id
         * @param {Object} 模板数据
         * @param {boolean} 下次渲染是否以追加的方式渲染 默认为非
         *
         * @兼容性 PC: IE 9+ & Mobile All
         * @依赖 getTmpl
         *
         * @备注: 模板如
         * <div>
         *  <script type='text/plain' id='list'>
         *      <? for(var i = 0; i < 10; i ++){
         *      ?>
         *
         *      <h1><?=i?></h1>
         *
         *      <? } ?>
         *  </script>
         *  </div>
         *
         *  调用如:  Util.renderTmpl('list', {});//会在div下直接生成模板HTML输出
         */
        //保留上次的el地址,便于清除
        var lastRenderEls = {};
        var renderTmpl = function(id, data, isAppend){
            var tmplNode = document.getElementById(id);
            var tmplString = tmplNode.innerHTML;
            var result = getTmpl(tmplString, data);
    
            if(! lastRenderEls[id]) lastRenderEls[id] = [];
    
            if(! isAppend){
                //清除上次的渲染
                for(var i = 0; i < lastRenderEls[id].length; i ++){
                    var lastItem = lastRenderEls[id][i];
    
                    lastItem.parentNode.removeChild(lastItem);
                }
            }
    
            lastRenderEls[id] = [];
    
    
            var div = document.createElement("div");
            div.innerHTML = result;
    
            var divChildren = div.childNodes;
    
            while(divChildren.length > 0){
                lastRenderEls[id].push(divChildren[0]);
    
                tmplNode.parentNode.insertBefore(divChildren[0], tmplNode);
            }
        };
    
            /**
             * 通过代理增加事件
             * @param {HTMLNode} proxyNode  要绑定到的代理元素
             * @param {String} selector 选择器  仅支持单字符串 支持# . tag选择 如 #a或.a或li等
             * @param {String} eventType  事件类型  如click等
             * @param {Function} func 处理函数
             *
             * @兼容 PC: IE 6+ & Mobile All
             * @依赖 无
             */
            var addEvent = function(proxyNode, selector, eventType, func){//为代理节点添加事件监听
                    var proName = "",flag = 0;
                    if(typeof(selector) == "string"){
    
                        flag = 1;
                        switch(true){
                            case /^./.test(selector) :
                                proName = "className";
                                selector = selector.replace(".", "");
                                selector = new RegExp(" *" + selector + " *");
                                break;
                            case /^#/.test(selector) :
                                proName = "id";
                                selector = new RegExp(selector.replace("#", ""));
                                break;
                            default: 
                                selector = new RegExp(selector);
                                proName = "tagName";
                        }
    
                    }
    
                    var addEvent = window.addEventListener ? "addEventListener" : "attachEvent";
                    var eventType = window.addEventListener ? eventType : "on" + eventType;
    
                    proxyNode[addEvent](eventType,function(e){
    
                            function check(node){
    
                                if(flag){
                                    if(selector.test(node[proName])){
    
                                        func.call(node, e);
                                        return;
                                    };
                                }else{
                                    if(selector == node){
                                        func.call(node, e);
                                        return;
                                    };
                                }
    
                                if(node == proxyNode || node.parentNode == proxyNode) return;
                                check(node.parentNode);
                            }
    
                            check(e.srcElement);
                    });
        };
          //读取元素的css属性值
          var css = function(el, property){
            try{
                return el.currentStyle[property] || el.style[property];
            }catch(e){
                var computedStyle = getComputedStyle(el);
                return computedStyle.getPropertyValue(property);
            }
          };
    
              //执行动画   类似jquery animate
          var animate = function(el, endCss, time, callBack){
             var FPS = 60;
             var everyStep = {}, currStyle = {};
    
             for(var i in endCss){
               var currValue = parseInt(this.css(el, i));
               currStyle[i] = currValue;
    
               everyStep[i] = parseInt(parseInt(endCss[i]) - currValue) / time;
             }
    
             //当前frame
             var frame = 0, timer;
    
             function step(){
               frame ++;
    
               //当前时间 ms
               var t = frame / FPS * 1000;
    
               //对时间做缓动变换
    
               //标准化当前时间
               var t0 = t / time;
    
               //变换函数
               var f = function(x, p0, p1, p2, p3){
    
                 //二次贝塞尔曲线
                 //return Math.pow((1 - x), 2) * p0 + (2 * x) * (1 - x) * p1 + x * x * p2; 
    
                 //基于三次贝塞尔曲线 
                 return p0 * Math.pow((1 - x), 3) + 3 * p1 * x * Math.pow((1 - x), 2) + 3 * p2 * x * x * (1 - x) + p3 * Math.pow(x, 3);
               }
    
               //对时间进行三次贝塞尔变换 输出时间
               var t1 = f(t0, 0.3, 0.82, 1.0, 1.0) * time;
    
               for(var i in everyStep){
                 if(i == "opacity") el.style[i] = (currStyle[i] + everyStep[i] * t1);
                 else el.style[i] = (currStyle[i] + everyStep[i] * t1) + "px";
               }
    
               if(frame == time / 1000 * FPS){
                 clearInterval(timer);
                 callBack && callBack();
               }
             }
    
             timer = setInterval(step, 1000 / FPS);
    
             return {
                stop: function(){
                    clearInterval(timer);
                }
             };
    
          };
    
          var getUrlParam = function (n) { 
                var m = window.location.search.match(new RegExp('(\?|&)' + n + '=([^&]*)(&|$)'));   
                return !m ? '' : decodeURIComponent(m[2]);  
            };
    
          var getParentData = function(node, dataName){
            var parentNode = node;
    
            while(parentNode){
                if(parentNode.dataset[dataName]){
                    return parentNode.dataset[dataName];
                }
    
                parentNode = parentNode.parentNode;
            }
    
          };
    
       var util = {
            request: initRequest,
            getTmpl: getTmpl,
            renderTmpl: renderTmpl,
            addEvent: addEvent,
            animate: animate,
            css: css,
            getUrlParam: getUrlParam,
            getParentData: getParentData
        };
    
        window.Util = util;
    })();

    下载地址:https://github.com/dorsywang/util.js

    项目中看到的部分util.js:

    /**
     * Created by wanglijuan on 2016/11/11.
     */
    var util = function () {
        return {
            on:function (obj, type, handler) {
                var types = this.isArray(type) ? type : [type],
                    k = types.length,
                    d;
                if (!obj.addEventListener) {
                    //绑定obj 为this
                    d = function (evt) {
                        evt = evt || window.event;
                        var el = evt.srcElement;
                        return handler.call(el, evt);
                    };
                    handler._d = d;
                }
                if (k) while (k--) {
                    type = types[k];
                    if (obj.addEventListener) {
                        obj.addEventListener(type, handler, false);
                    } else {
                        obj.attachEvent('on' + type, d);
                    }
                }
                obj = null;
            },
            un:function (obj, type, handler) {
                var types = this.isArray(type) ? type : [type],
                    k = types.length;
                if (k) while (k--) {
                    type = types[k];
                    if (obj.removeEventListener) {
                        obj.removeEventListener(type, handler, false);
                    } else {
                        obj.detachEvent('on' + type, handler._d || handler);
                    }
                }
            },
            isEmpty:function (data) {
                return data.replace(/[ ]/g, "") != "" ? data : "无";
            },
            getEvent:function (event) {
                return event ? event : window.event;
            },
            getTarget:function (event) {
                return event.target || event.srcElement;
            },
            setInnerText:function (element, text) {
                if (typeof element.textContent == "string")
                    element.textContent = text;
                else
                    element.innerText = text;
            },
            $G:function (id) {
                return document.getElementById(id)
            },
            getFirstNode:function (ele) {
                return ele.firstChild.nodeType == 1 ? ele.firstChild : ele.firstElementChild;
            },
            getElementsByClassName:function (clsName) {
                var doc = document;
                if (!doc.getElementsByClassName) {
                    var clsArr = [];
                    var reg = new RegExp("\b" + clsName + "\b");
                    var eleArr = doc.getElementsByTagName("*");
                    for (var i = 0, eleobj; eleobj = eleArr[i++];) {
                        if (reg.test(eleobj.className))
                            clsArr.push(eleobj);
                    }
                    return clsArr;
                }
                else {
                    return doc.getElementsByClassName(clsName);
                }
            },
            getCharCode:function (event) {
                return event.keyCode || event.which || event.charCode;
            },
            getStyleValue:function(ele,attr){
                var doc=document;
                var style=ele.currentStyle||doc.defaultView.getComputedStyle(ele,null);
                return parseInt(style[attr].replace(/px/g,""));
            },
            getBrowerVersion:function(){
                var agent = navigator.userAgent.toLowerCase(),
                    opera = window.opera,
                    browser = {
                        ie        : !!window.ActiveXObject,
                        webkit    : ( agent.indexOf( ' applewebkit/' ) > -1 ),
                        quirks : ( document.compatMode == 'BackCompat' ),
                        opera    : ( !!opera && opera.version )
                    };
                if ( browser.ie ){
                    browser.version = parseFloat( agent.match( /msie (d+)/ )[1] );
                }
                browser.gecko = ( navigator.product == 'Gecko' && !browser.webkit && !browser.opera );
                return browser;
            },
            isArray:function (obj) {
                return Object.prototype.toString.call(obj) === '[object Array]';
            },
            request:function (option) {
                var ajaxRequest = creatAjaxRequest();
                if (ajaxRequest == null) {
                    alert("您的浏览器不支持AJAX!");
                    return;
                }
                ajaxRequest.onreadystatechange = function () {
                    if (ajaxRequest.readyState == 4) {
                        if (ajaxRequest.status >= 200 && ajaxRequest.status < 300 || ajaxRequest.status == 304) {
                            option.onSuccess(ajaxRequest.responseText);
                        }
                    }
                    else {
                        if (option.hasLoading)
                            util.$G(option.loading_Id).innerHTML = "<div class='hook_con'><img class='loading_pic' src='images/loading.gif'/></div>";
                    }
                };
                ajaxRequest.open("post", option.url, true);
                ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                ajaxRequest.send(option.param);
            }
        };
    
        /**
         * 创建一个ajaxRequest对象
         */
        function creatAjaxRequest() {
            var xmlHttp = null;
            if (window.XMLHttpRequest) {
                xmlHttp = new XMLHttpRequest();
            } else {
                try {
                    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    try {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {
                    }
                }
            }
            return xmlHttp;
        }
    }();

    效果在:http://ueditor.baidu.com/website/    这个网站

    完整案例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .coop-list {
                position: relative;
                 100%;
                overflow: hidden;
                margin-top: 5px;
            }
            .topBorder-move{position:relative;left:0;3000px;border-top: 2px dashed #DADDE1;}
            .bottomBorder-move{position:relative;left:0;4000px;border-bottom: 2px dashed #DADDE1;}
            .leftBorder-move{position:absolute;top:0;1px;height:4000px;border-left: 2px dashed #DADDE1;}
            .rightBorder-move{position:absolute;right:0;top:0;1px;height:3000px;border-right: 2px dashed #DADDE1;}
        </style>
    </head>
    <body>
    <div class="coop-list">
    <div class="topBorder-move" id="J_borTop"></div>
    <div class="leftBorder-move" id="J_borLeft"></div>
    <div style="height:300px;"></div>
    <div class="rightBorder-move" id="J_borRight"></div>
    <div class="bottomBorder-move" id="J_borBottom"></div>
    </div>
    </body>
    </html>
    <script type="text/javascript" src="util.js"></script>
    <script type="text/javascript">
        /**
         * 边框旋转
         */
        function border_move() {
            var borTop = util.$G("J_borTop"),
                    borBottom = util.$G("J_borBottom"),
                    borLeft = util.$G("J_borLeft"),
                    borRight = util.$G("J_borRight"),
    
                    left = util.getStyleValue(borTop, 'left'),
                    top = util.getStyleValue(borLeft, 'top');
    
            setInterval(function () {
                if (left < 0) {
                    left += 2;
                    borRight.style.top = left + "px";
                    borTop.style.left = left + "px";
                } else left = -1500;
    
                if (top > -3000) {
                    top -= 2;
                    borBottom.style.left = top + "px";
                    borLeft.style.top = top + "px";
                } else top = -1500;
            }, 60);
        }
        border_move();
    </script>
  • 相关阅读:
    【Java多线程系列四】控制线程执行顺序
    【Java多线程系列随笔二】BlockingQueue
    【Java多线程系列三】实现线程同步的方法
    【Java多线程系列随笔一】浅析 Java Thread.join()
    【Java多线程系列二】Thread类的方法
    【Java多线程系列一】Java实现线程方法
    如何优雅的使用和理解线程池
    spring 中 isolation 和 propagation 详解
    嵊州普及Day6T1
    嵊州普及Day5T4
  • 原文地址:https://www.cnblogs.com/wang715100018066/p/6054409.html
Copyright © 2011-2022 走看看