• 初学事件委托


    刚开始接触到事件委托这个概念,还是看javascritp高级程序设计接触到的(js学习必备的书有木有)。

    知道了什么是事件冒泡机制,(事件捕获因为不常用就不说了),然后明白了为什么会有事件委托的产生,其实在学习html的时候,就应该明白一个网页不只是平面的,更是立体的,一个页面实际的空间比我们眼睛看到的还要多的多,就像隐藏在海平面下的冰山一样。

    如果明白了网页是立体的就好理解为什么有事件冒泡这个东西了。当你鼠标点击或者划过的时候,并不只是点击了最上面的一层,在这个点击的地方重叠的所有元素其实都被点击了。那我们怎么区分点击的是哪个呢,哪个该对点击这个事件响应呢,所以就有了冒泡这个东西,我每次都从最底层向上跑,都跑一遍,匹配到哪一个哪一个元素就响应。

    在这个过程中通过event.target来判断,

    假设有一个这样的结构:

    1 <ul id="list">
    2     <li>111</li>
    3     <li>222</li>
    4     <li>333</li>
    5     <li>444</li>
    6 </ul>

    你可以通过

    var target=event.target;
    target.nodeName.toLowerCase() == 'li'

    来判断你想要触发的元素,比如这里,你想当鼠标对 li 执行了点击或者划过事件做某些事情时,可以这样判断。

    或者换个写法:

    先给每一个 li 添加一个id 的属性。然后这样:

     1 switch(target.id){
     2         case 0:{
     3             // do something
     4             break;
     5         }
     6         case 1:{
     7             // do something
     8             break;
     9         }
    10         // ...
    11     }

    当点击到对应 id 的 li 的时候就会响应对应的事件了。

    那么,要怎么实现事件委托呢,先来上代码,页面结构还是上面的结构:

     1 var list=document.getElementById("list");
     2         var items=list.getElementsByTagName("li");
     3         for(var i=0,len=items.length;i<len;i++){
     4             items[i].id=i;
     5         }
     6         list.addEventListener('click',clickItem,false);
     7         function clickItem(event){
     8             var event=event||window.event;
     9             var target=event.target||window.srcElement;
    10             if(target.nodeName.toLowerCase() == 'li'){
    11                 console.log(target.innerHTML);
    12             }
    13         }

    是不是比较简单呢,但是事件委托却有一个很大的作用,就是提高页面的性能,同时降低与页面的耦合。

    当你要给多个(好多个)元素绑定同一个事件时,就可以使用事件委托了,省却了给每一个元素绑定的麻烦,还能提高性能,何乐而不为呢。

    还有个好处就是,当你的页面结构发生变化时,你也不用辛辛苦苦的变更事件的代码了,因为事件是绑定在父层元素上,变动父层元素内的页面结构不会影响事件的发生,因为事件流最终都会传递到父层元素的。

  • 相关阅读:
    如何解决多进程或多线程并发的问题
    PHP 获取当前类名、方法名、URL地址
    MySQL查询小数点位数
    sql语句优化总结
    redis使用及配置之缓存详解
    系统每隔一段时间自动pull代码
    php BC 高精确度函数库
    SGDMA
    Pmon (LS1B)start.s
    FPGA时序约束和timequest timing analyzer
  • 原文地址:https://www.cnblogs.com/luxueping/p/5595162.html
Copyright © 2020-2023  润新知