事件监听

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

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

添加事件

语法:

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. spring boot: Bean的初始化和销毁 (一般注入说明(三) AnnotationConfigApplicationContext容器 JSR250注解)

    import org.springframework.context.annotation.AnnotationConfigApplicationContext; 使用AnnotationConfig ...

  2. GW知识点

    1.取值: protected void Button1_Click(object sender, EventArgs e) { string str = ""; foreach ...

  3. 快速构建hibernate框架

    手动配置Hibernate框架的配置,极易出现问题,在Eclipse的web项目中,我们可以快速配置,方便快捷 一.导入Hibernate框架所需要的jar文件 二. 窗口—Perspective—打 ...

  4. stl_hashtable.h

    stl_hashtable.h // Filename: stl_hashtable.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog ...

  5. Python Class 的实例方法/类方法/静态方法

    实例方法.类方法.静态方法 class MyClass(object): class_name = "MyClass" # 类属性, 三种方法都能调用 def __init__(s ...

  6. javascript中eval()函数使用方法

    本教程主要重介绍eval()函数的语法与使用方法,及在后面我还补充了eval()解析json数据的相关例子,希望文章能帮助到各位深入理解eval()使用方法吧.   前几天说到js中尽量不要使用eva ...

  7. 解决Mac 系统升级到 10.14.1后 IDA 在非英文输入法时启动crash的问题

    Mac 系统升级到10.14.1后,打开IDA时出现以下问题: 解决问题的方法也很简单: 1. 每次打开IDA前先切换到英文输入法模式(每次都要切换,有点麻烦)2. 直接去github上下载 libq ...

  8. 洛谷【P2003】平板

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:https://www.luogu.org/problemnew/show/P ...

  9. jumpserver遇到的坑

    安装:https://github.com/jumpserver/jumpserver,看readme照着做就行,下面是遇到的坑.   0.4.4版坑: 1.要升级pip,否则有的包装不上   2.p ...

  10. 用Fiddler2来监听HTTP(记:用skydrive sdk访问时,出错后用Fidder抓包分析)

    最近在写一个关于如何上传文件到skydrive的demo, 用REST上传失败. 安装Telerik的Fiddler后, 可以监听http或者https通信, 然后可以在软件中看到返回的json数据或 ...