事件监听

该方法用于向指定元素添加事件句柄(代码块),且不会覆盖已存在的事件句柄。

即可以向同一个元素添加同一个事件多次。

添加事件

语法:

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--事件委托与事件监听的更多相关文章

  1. 浅谈VUE,使用watch方法监听父组件传到子组件的数据。

    props:['updateData'], data(){ return{ form: { _name:'', }, } }, 第一步接收数据: props:['updateData']   第二步动 ...

  2. 浅谈JavaScript的事件(事件委托)

    事件处理程序为Web程序提供了系统交互,但是如果页面中的事件处理程序太多,则会影响页面的性能.每个函数都是对象,都会占用内存,内存中对象越多,性能越差.需要事先为DOM对象指定事件处理程序,导致访问D ...

  3. js实例分析JavaScript中的事件委托和事件绑定

    我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...

  4. javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。

    首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...

  5. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  6. js中的事件委托或是事件代理

    JavaScript(jQuery)中的事件委托 https://www.cnblogs.com/zhoushengxiu/p/5703095.html js中的事件委托或是事件代理详解 https: ...

  7. js中的事件委托和事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  8. JS事件委托或者事件代理原理以及实现

    事件委托(事件代理)原理:简单的说就是将事件交由别人来执行,就是将子元素的事件通过冒泡的形式交由父元素来执行. 为什么要用时间委托? 在JavaScript中,添加到页面上的事件处理程序数量将直接关系 ...

  9. js中的事件委托(事件代理)详解

    本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...

随机推荐

  1. Codeforces 479E Riding in a Lift:前缀和/差分优化dp

    题目链接:http://codeforces.com/problemset/problem/479/E 题意: 有一栋n层的房子. 还有一个无聊的人在玩电梯,每次玩电梯都会从某一层坐到另外一层. 他初 ...

  2. php 设置页面导航动态active类样式的添加

    在用php制作项目中,一般都是把页头和页脚分离出来.页头导航在选中状态时会有一些样式,例如active等,当页面在首页时候,导航的首页也应该是active的样式,那么,怎么用php控制这些样式的添加和 ...

  3. SpringMVC的优点

    SpringMVC的优点 清晰的角色划分:控制器(controller).验证器(validator).命令对象(command obect).表单对象(form object).模型对象(model ...

  4. POJ 2253 Frogger(warshall算法)

    题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...

  5. STL list链表的用法详解

    本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言 1 定义一个list 2 使用list的成员函 ...

  6. SQL Server convet函数data_type默认长度

    语法 CONVERT(data_type(length),data_to_be_converted,style) data_type(length) 规定目标数据类型(带有可选的长度),默认30个字符 ...

  7. codeforces 598C C. Nearest vectors(极角排序)

    题目链接: C. Nearest vectors time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  8. android开发中图片优化步骤

    android开发中图片优化方法 1.图片加载方法,方便用户加载图片 /*** * 加载本地图片 * @param context:主运行函数实例 * @param bitAdress:图片地址,一般 ...

  9. 恢复到特定点(时间点、scn、日志序列号),rman不完全恢复

    将数据库.表空间.数据文件等恢复至恢复备份集保存时间中的任何一个时间点/SCN/日志序列(一般是日志挖掘找到误操作点),但须谨慎,操作前一定需要做好备份,具备条件的情况下最好先恢复到异机,避免业务停机 ...

  10. EXPLAIN 命令

    MySQL EXPLAIN 命令详解 MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提 ...