# 冒泡与捕获
## 事件捕获
当鼠标点击出发dom事件时,浏览器会从根节点由外到内的传播dom事件。若父节点有对应绑定事件会先触发父节点的事件。
## 事件冒泡
与捕获相反,从内到外
## addEventListener
addEventListener(event,listener,useCapture) event 表示事件 listener事件监听函数 useCapture 是否进行事件捕获,默认false,即采用冒泡模式。
~~~
<script type="text/javascript">
var father = document.getElementById('father')
var child = document.getElementById('child')
child.addEventListener('click',function(e){
console.log('childClicked');
// e.stopPropagation;
},false)
father.addEventListener('click',function(e){
console.log('fatherClicked');
},false) //若此处改为true,则先输出fatherClicked后输出childClicked 因为相当于进行了捕获
</script>
~~~
这时依次输出 childClicked 和 fatherClicked 因为点击child也相当于点击了father,若不想father也被点击,应采用事件停止传播,即把红色的child增加一句
e.stopPropagation。
## 事件委托
事件委托的原理:
事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件
```html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div id="do">
<ul>
<li id="111">111</li>
<li id="222">222</li>
<li id="333">333</li>
<li id="444">444</li>
</ul>
</div>
<script type="text/javascript">
var dos = document.getElementById('do')
dos.onclick = function(ELE){
console.log(ELE.target.innerHTML)
}
</script>
</body>
</html>
```
**什么时候不适合事件委托**
1. focus、blur 之类的事件(又比如mouseenter, mouseleave)本身没有事件冒泡机制,无法进行委托。
2. mousemove、mouseout 这样的事件触发频繁,对性能消耗高,不适合于事件委托。
- html
- 冒泡/捕获/委托
- 前端路由
- Dom
- 创建节点API
- 页面修改型API
- 节点查询型API
- 节点关系型API
- 元素属性API
- DOM事件
- classList
- 性能优化
- 节流防抖
- localStorage sessionStorage
- BOM
- meta
- data属性
- js实现拖拽
- html5
- 关于meta
- 轮播图
- js实现拖放
- 电话号inputFormater
- js
- es6
- promise
- iterator
- generator
- async
- proxy
- Set
- Map
- Object的扩展
- String
- Iterator
- Symbol
- 解构赋值
- 函数式编程
- module
- 基本数据类型
- 数组相关codings
- for of/for in
- this
- call bind apply
- 闭包
- 作用域
- prototype与继承
- 深浅拷贝
- setTimeOut/setInterval
- 垃圾处理机制
- 设计模式
- 观察者模式
- 单例模式
- 策略模式
- RegExp
- with
- 其他玩意
- Error/Stack Trace
- 面向对象
- css
- 回流重绘
- %取值
- 属性继承/属性优先级
- flex
- BFC
- 盒模型
- 设置css的方法
- 定位机制
- 块级/行内元素
- hack和一些别的玩意
- css动画
- 几个布局
- 画图形
- css3
- animation对比transform
- 点击不同图片区域跳转不同
- css选择器性能问题
- vh rem em
- css选择器
- 伪类伪元素
- css匹配原理
- 数据结构与算法
- 数据结构
- 树
- 链表
- 栈和队列
- 排序
- 归并排序
- 插入排序
- 选择排序
- 冒泡排序
- 快速排序
- 递归
- 回溯法
- 搜索算法
- 动态规划
- http
- 跨域问题
- CORS
- GET/POST
- ajax
- ajax上传文件
- http缓存
- https
- TCP/UDP
- cookie/session
- http2.0
- spdy
- websocket
- React
- redux
- 生命周期
- 虚拟dom与diff
- 双向数据绑定
- mvvm
- setState
- contextApi props reudx
- 高阶组件
- react-redux
- Fiber
- react-router
- 受控/非受控组件
- 待整理
- webpack
- loader实现
- 前端安全
- 移动端适配
- Vue
- 传值
- 其他