`

js的事件传播机制

 
阅读更多

JS的事件传播,以前完全不知道,今天学习了。

JS的事件(event)是向上传播的,会一直传到根元素。

比如(使用jquery语法):
Javascript代码 复制代码 收藏代码
  1. $("div").click(function(event) {
  2. alert("div clicked");
  3. });
  4. $("span").click(function(event) {
  5. alert("span clicked");
  6. });
$("div").click(function(event) {
    alert("div clicked");
});
$("span").click(function(event) {
    alert("span clicked");
});

span是div的子元素,在点击span的时候,span的click事件向上传播到div的onclick函数里,所以画面会先后弹出“span clicked"和“div clicked”。

如果不想让事件向上传播,有以下几种办法。

1.return false;
Javascript代码 复制代码 收藏代码
  1. $("div").click(function(event) {
  2. alert("div clicked");
  3. });
  4. $("span").click(function(event) {
  5. alert("span clicked");
  6. returnfalse;
  7. });
$("div").click(function(event) {
    alert("div clicked");
});
$("span").click(function(event) {
    alert("span clicked");
    return false;
});

在span的事件函数里return false,就能阻止span的click事件传到div的onclick函数。

2.调用event.target进行判断
Javascript代码 复制代码 收藏代码
  1. $("div").click(function(event) {
  2. if (event.target == this)
  3. alert("div clicked");
  4. });
  5. $("span").click(function(event) {
  6. alert("span clicked");
  7. returnfalse;
  8. });
$("div").click(function(event) {
    if (event.target == this) 
        alert("div clicked");
});
$("span").click(function(event) {
    alert("span clicked");
    return false;
});

event.target是事件发生源的DOM元素。在span的onclick函数里,event.target和this一样,都是span元素;而在div的onclick函数里,event.target是span元素,this是div元素。

3.event.stopPropagation();
Javascript代码 复制代码 收藏代码
  1. $("div").click(function(event) {
  2. alert("div clicked");
  3. });
  4. $("span").click(function(event) {
  5. alert("span clicked");
  6. event.stopPropagation();
  7. });
$("div").click(function(event) {
    alert("div clicked");
});
$("span").click(function(event) {
    alert("span clicked");
    event.stopPropagation();
});

在子元素的事件函数里调用event.stopPropagation();。

注意:虽然event.target和event.stopPropagation()是纯DOM API,但不是被所有浏览器实现了的。jquery对这两个API做了统一,所有浏览器中都能使用。


当然,事件向上传播也有他的作用。

比如一个需要highlight的例子,有一个按钮区(DIV),里面有很多个按钮(BUTTON),这些元素都是白色。当鼠标移动到DIV时,DIV需要显示成浅灰色,BUTTON们还是白色,接着再移到BUTTON上时,DIV保持浅灰色,BUTTON要变成深灰色。

实现方式是给DIV和每个BUTTON都注册一对onmouseover/onmouseout事件函数,鼠标从按外进入DIV内时,触发DIV的onmouseover,DIV变灰,鼠标再移到DIV内某个BUTTON上时,触发DIV的onmouseout,DIV恢复成白色,这时BUTTON触发了onmouseover而变深灰,而且这个mouseover的event向上传播到了DIV触发了DIV的onmouseover,DIV又变灰,效果就是,当鼠标从DIV移到BUTTON上进,DIV保持灰色。假想一下,如果这个时候DIV没有保持灰色而变回了白色,效果就会很怪。也就是说,这个时候就需要事件上传机制把BUTTON这个子元素的mouseover event上传给DIV。

再举个例子,一个table有1000个row,每个row都要注册一个onclick函数,为每个row注册事件函数写起来容易,但由于循环多和有太多的函数需要内存管理,效率会下降。这个时候就可以写一个单一的事件函数,处理row的父元素,所有row的click event都会向上传播到这个事件函数里来接受处理。1000个事件函数需要注册和管理,现在变成一个,效率自然提升很多。 
 
分享到:
评论

相关推荐

    js 事件的传播机制(实例讲解)

    下面小编就为大家带来一篇js 事件的传播机制(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    javascript防止事件传播

    上面例子的html文件 博文链接:https://zhyt710.iteye.com/blog/227892

    【JavaScript源代码】JavaScript中事件冒泡机制示例详析.docx

    JavaScript中事件冒泡机制示例详析  DOM事件流(event flow )存在三个阶段:事件捕获阶段、 处于目标阶段、 事件冒泡阶段。 事件捕获(event capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,...

    JavaScript事件冒泡机制原理实例解析

    这篇文章主要介绍了JavaScript事件冒泡机制原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 DOM事件流(event flow )存在三个阶段:事件捕获阶段...

    深入理解JS DOM事件机制

    2、事件冒泡IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。3、事件捕获事件捕获的思想是不太具体的节点...

    JS事件详解(下)

    【js事件详解】上 那么什么是事件的执⾏机制呢? 思考⼀个问题 当⼀个⼤盒⼦嵌套⼀个⼩盒⼦的时候,并且两个盒⼦都有点击事件 你点击⾥⾯的⼩盒⼦,外⾯的⼤盒⼦上的点击事件要不要执⾏? 1. 事件的传播 就像上⾯...

    javascript完全学习手册1 源码

    10.2.5 使用JavaScript处理事件 271 10.3 标准事件模型 273 10.3.1 事件传播 273 10.3.2 注册事件处理程序 274 10.3.3 设置对象的事件处理程序 276 10.3.4 事件的模块和类型 276 10.3.5 Event接口和对象 278 10.4 IE...

    js事件委托和事件代理案例分享

     利用事件的冒泡传播机制(触发当前元素的某一个行为,它父级所有元素的相关行为都会被触发),如果一个容器中有很多元素都要绑定点击事件,我们没有必要一个个的绑定了,只需要给最外层容器绑定一个点击事件即可,...

    javascript完全学习手册2 源码

    10.2.5 使用JavaScript处理事件 10.3 标准事件模型 10.3.1 事件传播 10.3.2 注册事件处理程序 10.3.3 设置对象的事件处理程序 10.3.4 事件的模块和类型 10.3.5 Event接口和对象 10.4 IE事件模型 ...

    前端面试小册,包含Vue面试题,React面试题,JS面试题,HTTP面试题,工程化面试题,CSS面试题,算法面试题,大厂面试题

    - [面试官:JavaScript事件流:深入理解事件处理和传播机制](https://github.com/linwu-hi/code-interview/issues/41) - [面试官:执行上下文与闭包](https://github.com/linwu-hi/code-interview/issues/40) - ...

    初窥JQuery(二)事件机制(2)

    简单的说Jquery的事件处理机制就相当与在HTML标签中指定各种事件,比如onclick(),keydown()等,在标签中指定事件对应到Javascript的函数,便于我们实现我要求。而JQuery的事件处理则是将这些事件绑定到脚本内部,使...

    详解javascript中的事件处理

    事件传播机制  客户端JavaScript程序(就是浏览器啦)采用了异步事件驱动编程模型。当文档、浏览器、元素或与之相关的对象发生某些有趣的事情时,Web浏览器就会产生事件(event)。如果JavaScript应用程序关注特定...

    精通JS脚本之ExtJS框架.part1.rar

    本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计进度条、设计工具栏和菜单栏、设计面板、设计表格、设计表单、设计数据表、...

    精通JS脚本之ExtJS框架.part2.rar

    本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计进度条、设计工具栏和菜单栏、设计面板、设计表格、设计表单、设计数据表、...

    Js冒泡事件详解及阻止示例

    Js冒泡机制是指如果某元素定义了事件A,如click事件,如果触发了事件之后,没有阻止冒泡事件,那么事件将向父级元素传播,触发父类的click函数。 如下例所示: 代码如下: <html> [removed][removed] [removed]...

    JavaScript王者归来part.1 总数2

     13.3.1 起泡和捕捉--浏览器的事件传播   13.3.2 事件处理函数的注册   13.3.3 把对象注册为事件处理程序   13.3.4 事件模块和事件类型   13.3.5 关于Event接口   13.3.5.1 Event接口的属性和方法   ...

    基于组件的框架Flight.zip

    Twitter称,该框架致力于构建基于现有DOM模型的应用程序,并可以将功能映射到DOM节点,且支持DOM的事件传播机制。 无论应用程序是否使用模板或生成HTML,Flight都不依赖于任何Web渲染技术,并且不关心请求如何被...

    leetcode算法题主函数如何写-interview-question:Web前端开发者面试

    浏览器事件传播机制 addEventListener的第三个参数 浏览器事件环机制(Node.js事件环基本没有问?) JavaScript异步编程(掌握原理) promise async/await(generator) setTimeout 原型和原型链 跨域 性能优化 webpack ...

    Angularjs中的事件广播 —全面解析$broadcast,$emit,$on

    Angularjs中不同作用域之间可以通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信 介绍: $broadcast的作用是将事件从父级作用域传播至子级作用域,包括自己。格式如下:$broadcast(eventName,args) $emit的...

Global site tag (gtag.js) - Google Analytics