• js性能优化-事件委托


    先大概了解一下:

    事件委托(代理) : 利用的就是冒泡操作
    1.性能要好
    2.针对新创建的元素,直接可以拥有事件。

    所以有时候需要通过循环节点来绑定事件的话,那请用事件委托吧,这样性能更好哦,当然JQ里面本身就是有delegate,on这些方法了,但是原生的话,做一下兼容性处理就好了。主要以一个例子学习一下。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div>
            <ul id="list">
                <li>
                    <input type="checkbox">复选框
                    <div class="add">
                        <a href="#@" class="add">增加</a>
                        <a href="#@" class="delete">删除</a>
                    </div>
                </li>                                
            </ul>
        </div>
        <div id="all">
            <a href="javascript:;" id="select">全选</a>
            <a href="javascript:;" id="remove">删除</a>
        </div>
        <script>
    var eventUtil={
        addHandler: function(element,type,handler){
            if(element.addEventListener){
                element.addEventListener(type,handler,false);
            }else if(element.attachEvent){
                element.attachEvent("on" + type, handler);
            }else{
                element["on" + type] = handler;
            }
         },
        removeHandler: function(element,type,handler){
            if(element.removeEventListener){
                element.removeEventListener(type,handler,false);
            }else if(element.detachEvent){
                element.detachEvent("on" + type,handler);
            }else{
                element["on" + type] = null;
            }
        }
     };
    var temp = 0;
    var olist = document.getElementById('list'),
        oall  = document.getElementById('all'),
        oselect = document.getElementById('select'),
        oremove = document.getElementById('remove'),
        oInput = olist.getElementsByTagName('input');    
    function handler(){
        var e = arguments[0] || window.event,
            node = e.srcElement?e.srcElement:e.target,
            nodeTag = node.nodeName.toLowerCase(),
            nodeClass = node.className,
            targetNode = node.parentNode.parentNode,
            minLen = olist.getElementsByTagName('li').length;        
            if(nodeTag == 'a' && nodeClass == 'add'){ //增加节点
                olist.appendChild(olist.getElementsByTagName("li")[0].cloneNode(true));
            } else if(nodeTag == 'a' && nodeClass == 'delete'){ //删除节点
                if(minLen > 1){
                    olist.removeChild(targetNode);
                }
            } else {
                return;              
            }
    }
    function setInnerText(element, text) {
        if (typeof element.textContent == "string") {        
            element.textContent = text;   
        } else {        
            element.innerText = text;    
        }
     }
    function select(){
        var e = arguments[0] || window.event,
            node = e.srcElement?e.srcElement:e.target;    
        if(temp == 0){
            temp = 1;
            setInnerText(node,'反选');
            for(var i=1; i<=oInput.length; i+=1){
                oInput[i-1].checked = true;
            }
        } else {
            temp = 0;
            setInnerText(node,'全选');
            for(var i=1; i<=oInput.length; i+=1){
                oInput[i-1].checked = false;
            }
        }
    }
    function removeAll(){//倒序删除节点,避免删不完整
        for(var i = oInput.length - 1; i >= 0; i--) {      
            if(oInput[i].checked == true && oInput.length > 1){
                olist.removeChild(oInput[i].parentNode);
            }     
        }     
    }
    eventUtil.addHandler(olist,"click",handler);//绑定增加删除的方法
    eventUtil.addHandler(oselect,'click',select);//绑定全选反选方法
    eventUtil.addHandler(oremove,'click',removeAll);//绑定删除方法
        </script>
    </body>
    </html>
  • 相关阅读:
    Java中的多线程
    谈谈Java中的类型识别RTTI
    Java中的几个重要的数据类型
    编译和运行Java程序
    说说Java中的接口
    说说Java的反射
    谈谈Java中的新的IO特性
    谈谈Java中的内部类
    谈谈Java中的类
    老妈也加入偷菜行列了
  • 原文地址:https://www.cnblogs.com/violinxliu/p/3860447.html
Copyright © 2020-2023  润新知