js通过事件代理的方式绑定跳转事件,我这里的逻辑是把click事件绑定在最外层container上面,如果e.target包含我已经写好的class,则执行跳转逻辑。但是这种方式好像只能是在点击的元素的上面,也就是最内层的元素上面有相应的class才能跳转,在外层加同样的class不生效,说明是我对于事件代理的理解不够深刻,其实事件代理的作用就是为了把目标元素的事件绑定在外层做代理,我想实现外层元素点击,固然不可生效。

这是原来的写法:

 document.querySelector('.container').addEventListener('click', function (e) {
if(e.target.classList.contains('jumpUrl')){
console.log("点击jumpurl")
}
},false)
<div id="container" class="jumpUrl">
<div id="wrap">
<div id="s1" class="jumpUrl">s1
<div id="s2" class="jumpUrl">s2</div>
</div>
<div id="s3"></div>
</div>
</div>

如果既想要内层元素含有jumpUrl的 class时执行点击事件,又想要外层元素含有class时执行点击事件,修改优化如下:

 document.querySelector('#container').addEventListener('click', function (e) {
console.log(e.currentTarget) //获得当前绑定监听事件的元素, container
console.log(e.target)//获得当前点击的元素
console.log(this) //等于e.currentTarget
if(e.currentTarget.classList.contains('jumpUrl')||e.target.classList.contains('jumpUrl')){
console.log("点击jumpurl")
}
},false)
document.getElementById("container").classList.add('jumpUrl');//写在后面也可以绑定成功

注意:内层元素,即点击的目标元素必须是点击时真正的目标元素,而不是外面一层;

currentTarget绑定相应想要点击的class的时候必须是做代理的即做事件监听的元素。这里是container

js绑定事件代理的坑的更多相关文章

  1. JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理

    1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...

  2. JS中事件代理与委托

    在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...

  3. 学习之js绑定事件

    由于ie中绑定事件的bug,所以产生了用原生的实践操作来模拟事件绑定的方法,跟着李炎恢学的一招. function addEvent(obj, type, fn){ if(obj.addEventLi ...

  4. js,jq.事件代理(事件委托)复习。

    <ul id = "lists"> <li>列表1</li> <li>列表2</li> <li>列表3< ...

  5. js绑定事件和解绑事件

    在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法  只支持IE678,不兼容其他浏览器 addEv ...

  6. js绑定事件方法:addEventListener的兼容问题

    js的事件绑定方法中,ie只支持attachEvent,而FF和Chrome只支持addEventListener;严格来说:addEventListener只有IE9以上版本的IE浏览器上能够兼容, ...

  7. js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法

    js的事件绑定方法中,ie仅仅支持attachEvent,而FF和Chrome仅仅支持addEventListener,所以就必须为这两个方法做兼容处理,原理是先推断attachEvent仅仅否为真( ...

  8. [jquery]高级篇--js绑定事件

    参考:  http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(eve ...

  9. 5月23日笔记-js绑定事件、解绑事件、复合事件

    each() $("p").each(function(i,ele){ //alert(ele.innerHTML); alert($("p:eq("+i+&q ...

随机推荐

  1. 通过SSH隧道的本地转发实现Django连接远程数据库

    SSH连接命令 默认连接的端口为22 1. 使用私钥 ssh -p connect_port user_name@host -i your_private_identity 2. 使用用户密码 ssh ...

  2. Swoole中内置Http服务器

    创建httpServer.php文件,代码如下: <?php // 创建服务对象 $http = new swoole_http_server("10.211.55.17", ...

  3. django中使用pandas Django-pandas

    在django中使用pandas操作django的ORM查询出来的QuerySet对象,可以使用插件django-pandas. 截止教程书写时间,django-pandas已发布到0.6.1. 依赖 ...

  4. leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  5. Android8.1 开关VOLTE流程分析

    前言 最近有需求需要实现插卡默认打开Volte功能,顺带研究了下Volte的流程,在此做个记录 开始 从Settings设置界面入手,网络和互联网-->移动网络-->VoLTE高清通话(电 ...

  6. 11.JavaCC官方入门指南-例6

    例6:计算器--添加括号.一元运算符和历史记录 1.calculator3.jj   我们只需要再添加一些特色,就可以得到一个可用的四则运算计算器.在这一版的修改中 ,我们将使得程序可以接收括号.负值 ...

  7. ramfs 和 tmpfs 以及 ramdisk相关调研

    最近需要使用到 ramfs 和 tmpfs 做内存文件系统,下面对这两个文件系统相关的信息,做一下总结: 参考链接: https://www.thegeekstuff.com/2008/11/over ...

  8. MVC(基础一)

    MVC学习之前必须掌握的c#基础知识 一.类自动属性 public class Person { //自动属性 public string Name { get; set; } private int ...

  9. 解决“QGtkStyle could not resolve GTK……”问题

    如果出现错误 QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries 或者出现错误 err ...

  10. 【Oracle】SQL的一些关键字

    1. distinct 关键词 DISTINCT 用于返回唯一不同的值: 只可以在select中使用: 既可以对一列,也可以对多列使用: distinct对NULL是不进行过滤的,即返回的结果中是包含 ...