事件代理的小tips

作者: 浴火小青春 | 来源:发表于2016-04-03 18:47 被阅读107次

本文首发于我的个人博客,转载请注明来源和作者信息

想必大家都知道知道事件代理的好处了,不用绑定大量的事件,减少了代码书写量,同时也提高了性能。事件处理通常用来处理某一相同类型的事件。


场景一

<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>

我们可能通常会遇见这样的情况,尤其是在列表中,就是要根据每个列表项的次序来执行不同的函数。那我们怎样获取他在整个listItems里的次序呢?
就是利用indexOf方法。伪代码如下:

 var ul=document.getElemenstByTagName('ul')[0];
 var listItems=ul.getElementsByTagName('li');
 ul.addEventListener('click',function(e){
    if(e.target.tagName.toLowerCase()=='li'){
      var idx=[].indexOf.call(listItems,e.target);
       doSomething(idx);//根据不同的次序执行函数
    }
 },false);

场景二

<div>
<span class='active' id='a' data-index='1'>hello<i></i></span>
</div>

。我们可以通过e.target获得当前事件处理的目标,通常我们获得这个确定span元素的方法有
1. e.target.id=='a' 2. e.target.tagName/nodeName.toLowerCase()=='span' 3. e.target.className(e.target.classList.contains)=='active' 4. e.target.dataset.index==1
这个时候我们再给span绑定事件后再执行就好了。但是可是正如例子中所给,假如说我们也给<i></i>是icon(小图标),此时我事件作用的目标是<i></i>,按我们的想法来说无论是作用到icon还是作用到span,我们都是想让他执行下去的。问题就在于此,作用的元素是确定元素的子(孙)元素那怎么办???

好办,判断事件目标是不是该元素的子(孙)元素就行了!!!

var span=document.getElementsByTagName('span')[0];
var div=document.getElementsByTagName('div')[0];
div.addEventListener('click',function(e){
   var allChilds=span.getElementsByTagName('*');
   if(e.target.dataset.index==1||[].indexOf.call(allChilds,e.target)!=-1){
    doSomething();
   }
},false);

我们通过找到span元素的所有后代,这个一个nodeLists,然后判断点击的元素在不在这个集合里面,从而判断了点击的元素是不是span的后代。这个技巧挺有用的,比如说还可以在搜索框自动完成的时候会遇到,当搜索框失去焦点,suggest列表要消失,点击页面中的元素我们让suggest框消失,但是点击了suggest lists怎么办?先消失的话,就不能跳转对应的网址了?这个时候我们就要判断点击的目标在不在suggest lists内,如果在的话就先跳转再消失了。
详情可了解autocomplete组件

本文来源于个人实践,不定期更新~

相关文章

  • 事件代理的小tips

    本文首发于我的个人博客,转载请注明来源和作者信息 想必大家都知道知道事件代理的好处了,不用绑定大量的事件,减少了代...

  • 微信小程序之二:点击与跳页传参

    点击事件 跳页 小程序跳转方式 Tips:

  • 第二十天web前端面试题

    1,什么是事件代理且描述事件代理的原理及为什么要用事件代理? 事件委托也叫事件代理。利用事件冒泡,让自己的触发的事...

  • 概念

    事件委托,事件代理 事件代理又称之为事件委托。是JavaScript中常用绑定事件的常用技巧。顾名思义,“事件代理...

  • Castle 学习 之 动态代理(3)

    简单了学习一下其他几种代理方式。其实是懒癌 先插入一个小tips:ProxyGenerationOptions,I...

  • iOS开发月报#4|201810

    记录本月开发遇到的知识点,小tips,和bug总结。 大事件 新版iPad Pro、MacBook Air、Mac...

  • dom事件代理

    实现一个js事件代理的模块,帮助用户快速实现事件代理。

  • Block和代理协议

    代理协议: 1.要确定谁是代理对象,谁是被代理对象。 事件在哪里产生,谁就被代理对象。 事件在哪里响应,谁就是代理...

  • 腾讯云 Servrless Function简介

    事件 Forester Serverless独家代理https://www.serverless.com小程序有良...

  • 前端面试题套路

    套路一:事件代理 1、事件代理基本原理 事件代理的基本原理简单来说就是将子元素的事件通过冒泡的形式交由父元素来执行...

网友评论

    本文标题:事件代理的小tips

    本文链接:https://www.haomeiwen.com/subject/hfeulttx.html