js绑定事件代理的坑
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绑定事件代理的坑的更多相关文章
- JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理
1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...
- JS中事件代理与委托
在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...
- 学习之js绑定事件
由于ie中绑定事件的bug,所以产生了用原生的实践操作来模拟事件绑定的方法,跟着李炎恢学的一招. function addEvent(obj, type, fn){ if(obj.addEventLi ...
- js,jq.事件代理(事件委托)复习。
<ul id = "lists"> <li>列表1</li> <li>列表2</li> <li>列表3< ...
- js绑定事件和解绑事件
在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法 只支持IE678,不兼容其他浏览器 addEv ...
- js绑定事件方法:addEventListener的兼容问题
js的事件绑定方法中,ie只支持attachEvent,而FF和Chrome只支持addEventListener;严格来说:addEventListener只有IE9以上版本的IE浏览器上能够兼容, ...
- js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法
js的事件绑定方法中,ie仅仅支持attachEvent,而FF和Chrome仅仅支持addEventListener,所以就必须为这两个方法做兼容处理,原理是先推断attachEvent仅仅否为真( ...
- [jquery]高级篇--js绑定事件
参考: http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(eve ...
- 5月23日笔记-js绑定事件、解绑事件、复合事件
each() $("p").each(function(i,ele){ //alert(ele.innerHTML); alert($("p:eq("+i+&q ...
随机推荐
- 干货:.net core实现读取appsettings.json配置文件(建议收藏)
看好多人不懂在.NET CORE中如何读取配置文件,我这里分两篇,这一篇介绍怎样通过appsettings.json配置读取文件信息.这里我会教大家两种方式: 第一种直接放到通用类库,那里想调往那调. ...
- 目前为止最简洁的C#文件夹Copy代码,不接受反驳
private static void CopyEntireDir(string sourcePath, string destPath) { foreach (string dirPath in D ...
- C#中获取指定目录下所有目录的名称、全路径和创建日期
场景 指定一个路径,根据这个父级路径获取此目录下所有目录的名称.全路径.创建日期等信息. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众 ...
- PHP发送短信
1.要拼接接收的手机号和短信 public function sendcode() { $parpm = input(); $valist = $this->validate($parpm, [ ...
- 深入selenium三种等待方式使用
深入selenium三种等待方式使用 处理由于网络延迟造成没法找到网页元素 方法一 用time模块不推荐使用 用time模块中的time.sleep来完成等待 from selenium import ...
- Place an Action in a Different Location 设置按钮的显示位置
In this lesson, you will learn how to place an Action in the required place. For this purpose, the C ...
- SAP 销售订单交货对成本中心记账
销售订单发货不计入主营业务成本,而是直接接入费用科目,与成本中心挂钩的业务经常发生.不少公司只是简单地处理交货,计入主营业务成本,然后财务再手工将成本归结到相关的成本中心.其实SAP系统是支持销售订单 ...
- Python完全平方数
python解题源代码如下: import math """ 简述:一个整数,它加上100和加上268后都是一个完全平方数 提问:请问该数是多少? Python解题思路分 ...
- scp跨服务器拷贝,后台运行
[转载]原文:https://blog.csdn.net/u013091013/article/details/68941250 通常情况下,我门在同一台服务器拷贝数据最常用的命令便是cp,如果要在不 ...
- VS中添加Web References
鼠标右击项目->添加->服务引用->高级->添加Web引用->输入URL->点击前往 如下图所示: