html 子元素和父元素都监听了 click 事件,点击子元素时为何先触发的是父元素的 click 事件?
先上一段代码,点击子元素时先触发的是父元素的 click 事件
<html>
<head>
<script type="text/javascript">
function onLoads(){
document.getElementById("div1").addEventListener("click",(e) => {
alert('1');
}, true); document.getElementById("div2").addEventListener("click",(e) => {
alert('2');
}, true);
}
</script>
</head>
<body onload="onLoads()">
<div id="div1" style="width:400px;height:400px;background-color:red;border:1px;float:left; z-index:1;" >
<div id="div2" style="width:50px;height:50px;background-color:blue;float:left; z-index:2;" ></div>
</div>
</body>
</html>

点击蓝色代码时会先弹出 1,然后弹出2; 说明先父元素事件先触发,然后是子元素事件触发
看了文档后瞬间明朗了:
语法
参数值
| 参数 | 描述 |
|---|---|
| event | 必须。字符串,指定事件名。
注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。 提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册。 |
| function | 必须。指定要事件触发时执行的函数。
当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。 |
| useCapture | 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。
可能值:
|
addEventListener 主要在第三个参数上面,
冒泡阶段:这类似与池塘里的涟漪,从事件中心点,向上层传播。而事件捕获和这个顺序正好相反。
所以,如果想要点击事件从 子元素->父元素 这样的顺序传递的话,改下参数即可
<script type="text/javascript">
function onLoads(){
document.getElementById("div1").addEventListener("click",(e) => {
alert('1');
}, false); document.getElementById("div2").addEventListener("click",(e) => {
alert('2');
}, false);
}
</script>
如果,点击了子元素,不想点击事件向上冒泡的话,可以这样处理
<script type="text/javascript">
function onLoads(){
document.getElementById("div1").addEventListener("click",(e) => {
alert('1');
e.cancelBubble = true;
}, false); document.getElementById("div2").addEventListener("click",(e) => {
alert('2');
e.cancelBubble = true;
}, false);
}
</script>
或者
<script type="text/javascript">
function onLoads(){
document.getElementById("div1").addEventListener("click",(e) => {
alert('1');
e.stopPropagation();
}, false); document.getElementById("div2").addEventListener("click",(e) => {
alert('2');
e.stopPropagation();
}, false);
}
</script>
html 子元素和父元素都监听了 click 事件,点击子元素时为何先触发的是父元素的 click 事件?的更多相关文章
- 【转】Android开发20——单个监听器监听多个按钮点击事件
原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...
- vue中父组件如何监听子组件值的变化
vue中我们会遇到很多父子组件通信的需求, 下面简单列一下,父子组件通信的几种情况 1:父组件向子组件传值:使用prop向子组件传值: 2:子组件实时监听父组件传来的值的变化:使用watch去监听父组 ...
- ionic 监听页面滚动,点击停止滚动
类似今日头条,页面上有很多card,点击每个card跳转该card的详情页面.这里有一个问题,当我滚动页面时,会先后触发touchstart.touchmove.touchend,但是当touchen ...
- java代码对按钮进行监听---------------打印出每次点击按钮的次数
其实,我真不会写嗯? package com.a.b; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...
- Android事件监听(二)——点击鼠标事件
Button.ImageButton事件监听(setOnClickListener) 方法一:通过匿名内部类实现 代码如下: package com.note.demo2; import androi ...
- 当页面加载完成时,JQ触发添加页面的元素的事件触发不了。。
有下代码可知: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...
- onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击 onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击
已经知道了.复写getView()的时候,在内部Viewholder.length.setOnClickListener(匿名内部类) 然后新建一个接口方进去 ,然后外面的listView设置&l ...
- layui监听复选按钮点击
layui.form.on('checkbox(resultQuery)', function(data){ console.log(data.elem); //得到checkbox原始DOM对象 c ...
- 父组件向子组件传值时,值已经传过来却没有触发子组件的watch监听,解决~
需求: 父组件像封装的子组件传值 (父组件属性传值,子组件props接受) 子组件接受后经过处理回显页面; 预想:子组件接受值 , 经过watch监听,在监听中处理数据,回显数据; 问题:子组件 ...
随机推荐
- spring boot 学习(十一)使用@Async实现异步调用
使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...
- 多种方法实现 python 线程池
最近在做一个爬虫相关的项目,单线程的整站爬虫,耗时真的不是一般的巨大,运行一次也是心累,,,所以,要想实现整站爬虫,多线程是不可避免的,那么python多线程又应该怎样实现呢?这里主要要几个问题(关于 ...
- Java——IO类 字节流概述
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- L1-027 出租
下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...
- Swift网络封装库Moya中文手册之Authentication
Authentication 安全验证可能有点复杂,一些网络请求需要认证,这里我们讨论两种常见的. Basic HTTP Auth HTTP auth是HTTP协议自带的用户名/密码验证.如果你使用的 ...
- sqljdbc 无法连接到主机
今天发现sqljdbc 无法连接到SQL Server 主机.原因是SQL Server Browser 服务没有打开
- 如何在<textarea>标签中使用并解析HTML标签
例如: <textarea name="intro" placeholder="请输入内容" maxlength="800">& ...
- 爬虫从网页中去取的数据中包含 空格
爬虫从网页中爬取的数据中带了一个 这样的空格,使用trim()函数和replace(" ", "")去掉不了,找了一下资料发现,空格有两种一种是从键盘输入的对应 ...
- \n,\r,\t
etF首先说说\n,\r,\t \n 软回车: 在Windows 中表示换行且回到下一行的最开始位置 在Linux.unix 中只表示换行,但不会回到下一行的开始位置. \r 软空格: 在Linux. ...
- Linux 之 tar和nc传文件
前提: 将 172.16.88.1 上的 test 文件夹传送到 172.16.88.2 上 接收方 ---- 172.16.88.2 $ nc -l > test.tar 9876 为端口号 ...