浅谈JavaScript--事件委托与事件监听
事件监听
该方法用于向指定元素添加事件句柄(代码块),且不会覆盖已存在的事件句柄。
即可以向同一个元素添加同一个事件多次。
添加事件
语法:
element.addEventListener(event,function,useCapture);
- event:事件的类型。如'click','mousedown'等。谷歌浏览器下不用加'on'前缀。
- function:事件触发时调用的函数。
- useCapture:布尔类型,用于描述事件时冒泡还是捕获,可选。默认false,即冒泡传递。
<div id="box"></div>
<script>
var box = document.getElementById('box');
box.onclick = function() {
alert('box');
}
box.onclick = function() {
alert('box2!');
}
</script>
此时后面的事件会覆盖前面的事件,即点击box时只弹出'box2!'
事件监听写法:
<div id="box"></div>
<script>
var box = document.getElementById('box');
box.addEventListener('click', function() {
alert('box');
})
box.addEventListener('click', function() {
alert('box2');
})
</script>
此时即点击box,先弹出'box',接着弹出'box2!'。
移除事件
语法:
element.removeEventListener(event,functionName);
移除由addEventListener()方法添加的事件,移除与添加的必须为同一个函数。
兼容性
在ie8及更早版本不支持以上方法
请使用:
element.attachEvent(event,function); //添加
element.detachEvent(event,function); //删除
注意给事件加'on'前缀。
跨浏览器解决方案
function addEventListener(obj,eve,fun){
if(obj.addEventListener){
obj.addEventListener(eve,fun);
}else if(obj.attachEvent){
eve="on"+eve;
obj.attachEvent(eve,fun);
}else{
obj['on'+eve]=fun;
}
}
事件委托
情景:前期绑定了事件,后期有添加了节点,而新添加的节点却没有相应的事件。用事件委托解决。
通常事件是直接添加在触发的元素上,事件委托则是吧事件委托给该元素的父级。
原理:利用冒泡原理,把事件添加到父级上,触发执行效果。
<div id="box">
<p>我是原来的节点1</p>
<p>我是原来的节点2</p>
</div>
<script>
var box = document.getElementById('box');
var p = document.getElementsByTagName('p');
var child3 = document.createElement('p');
child3.innerHTML = '我是新添加的节点3';
box.appendChild(child3);
for (var i = 0; i < p.length; i++) {
p[i].onclick = function() {
console.log(this.innerHTML)
}
}
var child4 = document.createElement('p');
child4.innerHTML = '我是新添加的节点4';
box.appendChild(child4);
</script>
此时点击box下的所有p元素,前3个都可以获取到innerHTML,第4个却不能
用事件委托的方法去写:
<div id="box">
<p>我是原来的节点1</p>
<p>我是原来的节点2</p>
</div>
<script>
var box = document.getElementById('box');
var p = document.getElementsByTagName('p');
var child3 = document.createElement('p');
child3.innerHTML = '我是新添加的节点3';
box.appendChild(child3);
//----------------区别分割线----------------------------
box.onclick = function(e) { //委托给父级
var e = e || window.event; //兼容处理
var target = e.target || e.srcElement; //兼容处理
if (target.nodeName.toLowerCase() == 'p') { //触发事件的目标节点
console.log(target.innerHTML);
}
}
//----------------区别结束------------------------------
var child4 = document.createElement('p');
child4.innerHTML = '我是新添加的节点4';
box.appendChild(child4);
</script>
此时点击box下的所有p元素,都可以获取到innerHTML。
上述方法中target返回事件的目标节点,即本应触发该事件的节点。需要做兼容处理
浅谈JavaScript--事件委托与事件监听的更多相关文章
- 浅谈VUE,使用watch方法监听父组件传到子组件的数据。
props:['updateData'], data(){ return{ form: { _name:'', }, } }, 第一步接收数据: props:['updateData'] 第二步动 ...
- 浅谈JavaScript的事件(事件委托)
事件处理程序为Web程序提供了系统交互,但是如果页面中的事件处理程序太多,则会影响页面的性能.每个函数都是对象,都会占用内存,内存中对象越多,性能越差.需要事先为DOM对象指定事件处理程序,导致访问D ...
- js实例分析JavaScript中的事件委托和事件绑定
我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...
- javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。
首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- js中的事件委托或是事件代理
JavaScript(jQuery)中的事件委托 https://www.cnblogs.com/zhoushengxiu/p/5703095.html js中的事件委托或是事件代理详解 https: ...
- js中的事件委托和事件代理详解
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
- JS事件委托或者事件代理原理以及实现
事件委托(事件代理)原理:简单的说就是将事件交由别人来执行,就是将子元素的事件通过冒泡的形式交由父元素来执行. 为什么要用时间委托? 在JavaScript中,添加到页面上的事件处理程序数量将直接关系 ...
- js中的事件委托(事件代理)详解
本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...
随机推荐
- Cocos2d-x中常用宏的作用
1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...
- Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树
题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...
- js中的可枚举属性与不可枚举属性
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. 一.怎么判断属性是否可枚举 js中基本包 ...
- angularjs file upload插件使用总结
之前由于项目需要,决定使用angularjs做前端开发,在前两个项目中都有文件上传的功能,因为是刚接触angularjs,所以对一些模块和模块间的依赖不是很了解.都是由其他大神搭好框架,我只做些简单的 ...
- 【二叉树的递归】05二叉树中找任意起点和终点使他们的路径和最大【Binary Tree Maximum Path Sum】
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,寻找值最大的路径. ...
- linux vsftpd 服务配置
vsftpd.conf配置如下: # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings ...
- ACM学习历程—HDU 5512 Pagodas(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是给了初始的集合{a, b},然后取集合里 ...
- 使用MDI窗体实现多窗口效果
本文章已收录于: C#MDI窗体实现多窗口效果 Visual C#是微软公司推出的下一代主流程序开发语言,他也是一种功能十分强大的程 序设计语言,正在受到越来越多的编程人员的喜欢.在Visua ...
- C# 表达式树(Expression)
c#中有Expression,即表达式. 通过Expression可以动态构造代码,并编译执行. 比如: 1. 创建参数表达式 :ParameterExpression numParam = Ex ...
- Poj 1860 Currency Exchange(Bellman-Ford,SPFA解单源最短路径问题)
一.题意 有多个货币交易点,每个只能互换两种货币,兑换的汇率不同,并收取相应的手续费.有N种货币,假定你拥有第S中,数量为V,有M个兑换点.问你能不能通过兑换操作使你最后拥有的S币比起始的时候多. 二 ...