事件委托

譬如有一组li在ul中.

给每一个li加事件可以加在ul上.

<ul id="ul1">
    
    <li>111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
    
</ul>


    <script type="text/javascript">
        

        window.onload =function(){
            var oUl = document.getElementById('ul1');
            var aLi = oUl.getElementsByTagName('li');

            // for(var i=0;i<aLi.length;i++){
            //     aLi[i].onmouseover = function(){
                    
            //         this.style.background = 'red';
            //     }
            //     aLi[i].onmouseout = function(){
            //         this.style.background = '';
            //     }
            // }

            oUl.onmouseover = function(ev){
                var ev = ev||window.event;
                var target = ev.target||ev.srcElement;
                target.style.background = 'red';
            }
            oUl.onmouseout = function(ev){
                var ev = ev||window.event;
                var target = ev.target||ev.srcElement;
                target.style.background = '';
            }
        }

通过window下的event.target对象就可以找到移入的li.

ie下是event.srcElement.

但是有一个bug,就是鼠标移到标签左边时会选中整个ul.

 

nodeName:找到当前元素的标签名.

利用ev.target.nodeName可以区分LI和UL,注意是大写的.

所以可通过 .toLowerCase()转换成小写的.

于是事件监听的代码块就变成:

    oUl.onmouseover = function(ev){
                var ev = ev||window.event;
                var target = ev.target||ev.srcElement;
                if(target.nodeName.toLowerCase()=='li'){
                    target.style.background = 'red';
                }
            }
            oUl.onmouseout = function(ev){
                var ev = ev||window.event;
                var target = ev.target||ev.srcElement;
                if(target.nodeName.toLowerCase()=='li'){
                    target.style.background = '';
                }
            }

好处:

1.可以提高性能;

2.新添加的元素也会带该事件.

    window.onload =function(){
            var oUl = document.getElementById('ul1');
            var aLi = oUl.getElementsByTagName('li');
            var oInput = document.getElementsByTagName('input')[0];
            // for(var i=0;i<aLi.length;i++){
            //     aLi[i].onmouseover = function(){
                    
            //         this.style.background = 'red';
            //     }
            //     aLi[i].onmouseout = function(){
            //         this.style.background = '';
            //     }
            // }
            var iNow = 4;
            oUl.onmouseover = function(ev){
                var ev = ev||window.event;
                var target = ev.target||ev.srcElement;
                if(target.nodeName.toLowerCase()=='li'){
                    target.style.background = 'red';
                }
            }
            oUl.onmouseout = function(ev){
                var ev = ev||window.event;
                var target = ev.target||ev.srcElement;
                if(target.nodeName.toLowerCase()=='li'){
                    target.style.background = '';
                }
            }
            oInput.onclick =function(){
                iNow++;
                var oLi = document.createElement('li');
                oLi.innerHTML = 1111*iNow;
                oUl.appendChild(oLi);
            }
        }

 

posted on 2016-12-12 16:03  夜行锦衣  阅读(63)  评论(0编辑  收藏  举报

导航