zoukankan      html  css  js  c++  java
  • 初学事件委托

    刚开始接触到事件委托这个概念,还是看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         }

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

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

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

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/luxueping/p/5595162.html
Copyright © 2011-2022 走看看