Comments (20)
@youngwind 作者你好,我又认真的读了你的文章,做了测试,发现是有问题的:
- 其实原生事件的执行时间总是先于合成事件,无论合成事件是不是在捕获阶段绑定
- 所以上述用例的执行结果: 直接绑定在Child上的事件-》直接绑定在document上的事件-》点击子元素-》点击父元素
- 所以你上面图的描述其实是错误的
- 结果是对的,但是 e.nativeEvent.stopImmediatePropagation()其实只能在document 上才有用,换成
document.getElementById('parent')都是不可以的
from blog.
谢谢作者~
from blog.
结论:
1、e.stopPropagation 可以用来禁用 React 模拟事件;
2、e.nativeEvent.stopImmediatePropagation 只能用来禁用直接绑定在 document 上的事件;
3、对 2 的补充,试想一下,child 元素通过 React 直接绑定事件会被模拟到 document 上,parent 元素通过原生 addEventListener 绑定,通过冒泡原来应该 parent 先被触发,所以无法在 child 元素内禁用 parent 元素绑定的事件(当然,实际开发中,应该不会去 child 通过 React 绑定事件,而 parent 却不使用 React 绑定事件)。
from blog.
谢谢作者~
from blog.
写的太好了!!
from blog.
作者你好,很感谢你的文章,解开了我的疑惑,但是如果是下面的这种情景该怎样解决呢?
我想在点击子元素时,只是点击子元素,而不点击父元素,该怎样阻止呢?
from blog.
这种情况,除非你全部使用 React 绑定或者原生绑定,否则我想不到可阻止的方法。 @Lx15
from blog.
@youngwind 或者 在父元素上用target判断一下,可行不优雅
from blog.
哈哈哈,角度刁钻,但也确实可行。 @Lx15
from blog.
大赞!!!
from blog.
感谢作者,同类分析里写的简单易懂的一个
from blog.
写得不错
from blog.
测试发现document原生绑定事件在合成的事件执行之后执行,原生事件(document元素事件)-》点击子元素-》点击父元素-》直接绑定在document上的事件。链接地址
https://codesandbox.io/s/q33v4vw866
from blog.
补充一下在react页面里面打印了一下绑定在document上的click事件,发现第一个就是react绑定的事件,然后才是我在Didmount上绑定的事件
from blog.
@youngwind 作者你好,我又认真的读了你的文章,做了测试,发现是有问题的:
- 其实原生事件的执行时间总是先于合成事件,无论合成事件是不是在捕获阶段绑定
- 所以上述用例的执行结果: 直接绑定在Child上的事件-》直接绑定在document上的事件-》点击子元素-》点击父元素
- 所以你上面图的描述其实是错误的
- 结果是对的,但是 e.nativeEvent.stopImmediatePropagation()其实只能在document 上才有用,换成
document.getElementById('parent')都是不可以的
根据我的测试结果,和你的结论有点出入,一起讨论下:
- 原生事件执行总是先于合成事件?
你说的这种情况只在给 非document,window元素 ` 添加原生事件时成立,当给document添加原生事件时,还取决于添加原生事件的时机:
在render之前添加原生事件,那么原生事件先于合成事件绑定,触发时先执行原生事件。
在render之后比如didMount
中,那么合成事件先于原生事件绑定,触发时先执行合成事件。
- 作者的结论是对的。
因为在作者在 didMount
中添加的事件,先执行原生的直接绑定在Child事件
,然后根据在 didMount
中添加事件,所以合成事件先于原生事件执行,执行 点击子元素
, 阻止冒泡所以 点击父元素
不执行。最后会执行原生添加的 直接绑定在Document事件
。
- e.nativeEvent.stopImmediatePropagation()其实只能在document 上才有用?
我测试的结果是,这个api对其它元素也有效。可能我理解错你的意思了?
from blog.
作者你好,很感谢你的文章,解开了我的疑惑,但是如果是下面的这种情景该怎样解决呢?
我想在点击子元素时,只是点击子元素,而不点击父元素,该怎样阻止呢?
parent的那个事件使用react中的合成事件,不要写原生事件,然后再子dom的事件中直接e.stopPropagation(),这样事件就不会冒泡到父那边
我试过子是合成事件,父是原生事件,这种方式我没有成功阻止冒泡
from blog.
from blog.
非常非常非常有用,感谢!!!
from blog.
写的很清楚。但是有个地方有问题:
function dispatchEvent(event) { let target = event.target; target.click && target.click(); // 触发点击元素的事件 while (target.parentNode) { // 沿 DOM 向上回溯,遍历父节点,触发其 click 事件 target.parentNode.click && target.parentNode.click(); target = target.parentNode; } }
节点上并没有绑定事件,不存在click函数。具体好像是react会在每个节点上生成一个唯一的id,把id与click事件的函数作为map的数据结构的形式存在一个全局对象中。调用 dispatchEvent的时候,会找到当前节点的id找到click函数。
from blog.
太赞了!!!
from blog.
Related Issues (20)
- webpack源码学习系列之三:loader 机制 HOT 8
- V8引擎探索:如何注入全局变量 HOT 3
- preact 源码学习系列之一:JSX解析与DOM渲染 HOT 18
- preact 源码学习系列之二:组件的渲染与更新 HOT 1
- 膜拜 HOT 1
- 最小编辑距离问题:递归与动态规划 HOT 13
- 图解 HTTPS:Charles 捕获 HTTPS 的原理 HOT 21
- 单页面应用路由实现原理:以 React-Router 为例 HOT 8
- 这个坑占了一年多了,什么时候填上呢? HOT 6
- 安卓微信返回上一页怎么阻止刷新? HOT 1
- Vue SSR Demo HOT 14
- 浏览器缓存、CacheStorage、Web Worker 与 Service Worker HOT 14
- 前端之问,程序员之问,职业之问 HOT 21
- JSON.parse 三种实现方式 HOT 4
- 腾讯社招内推(已失效) HOT 7
- 腾讯 AlloyTeam 前端团队 2019 校园招聘提前批正式开始
- 暑期实习招聘 Web 前端开始啦,面向 2020 毕业
- First Meaningful Paint 首次有效绘制时间 HOT 1
- 也许这就是答案
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from blog.