javascript

js委托代理

2018-12-23  本文已影响0人  ysp123

什么是事件委托:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
为什么要用事件委托:减少DOM节点的操作,优化页面。将事件绑定在父元素,通过target.nodeName 获取目标元素判断,执行事件。

事件委托实现demo:
html:
    <ul id="el">
            <li>test11111111111111</li>
            <li>test222222222222</li>
            <li>test333333333333</li>
    </ul>
jvascript:
一般的事件添加方法:
        var elUl = document.getElementById('el');
        var elLi = document.getElementsByTagName('li');
        for(var i=0;i<elLi.length;i++){
                elLi[i].onclick = function(){
                        alert(this.innerHTML);
                }
        }
事件委托方式:
        var elUl = document.getElementById('el');
        elUl.addEventListener('click', function(e){
                var e = e || window.event;
                var target = e.target || e.srcElement;
                if(target.nodeName.toLowerCase() == 'li'){
                            alert(target.innerHTML);
                }
        });
弹出的内容即为当前的元素的内容。
事件委托只要操作一次DOM即可。

实际的写法中dom中还会存在嵌套,不是每次都是操作层级最低的dom元素。如:
html:
<ul id="el">
         <li>
                <p>11111111111</p>
        </li>
        <li>
                <div>5555555555555</div>
        </li>
         <li>test222222222222</li>
          <li>test333333333333</li>
</ul>

javascript:
    var el = document.getElementById('el');
    el.addEventListener('click', function(e){
            var e = e || window.event;
            var target = e.target || e.srcElement;
            while(true){
                if(target.nodeName.toLowerCase() == "li"){
                            alert(target.innerHTML);
                            break;
                }
                var target = target.parentNode;
            }
    });
或:
function  deal(dom){
            if(dom.nodeName.toLowerCase() == "li"){
                alert(dom.innerHTML);
                return ;
            }
            var dom = dom.parentNode;
            deal(dom);
  }

 el.addEventListener('click', function(e){
            var e = e  ||  window.event;
            var target = e.target  ||  e.srcElement;
            deal(target);
         }
});

适合用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress。
值得注意的是,mouseover和mouseout虽然也有事件冒泡,但是处理它们的时候需要特别的注意,因为需要经常计算它们的位置,处理起来不太容易。
不适合的就有很多了,举个例子,mousemove,每次都要计算它的位置,非常不好把控,在不如说focus,blur之类的,本身就没用冒泡的特性,自然就不能用事件委托了。

参考:https://www.cnblogs.com/liugang-vip/p/5616484.html

上一篇下一篇

猜你喜欢

热点阅读