事件流指的是事件完整执行过程中的流动路径
事件流分为两种,第一种是捕获,第二种是冒泡
捕获可以看做是从大了往小了,冒泡可以看做是从小的往大的
说明:假设页面里面有一个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段
捕获阶段是从父到子,冒泡阶段是从子到父
实际工作都是使用事件冒泡为主
从DOM的根元素开始去执行对应的事件(从外到里)
事件捕获需要写对应的代码才能看到效果
addEventListener第三个参数传入true代表是捕获阶段触发,但是这种情况很少使用
若使用L0事件监听,则只有冒泡阶段,没有捕获
效果:当我们点击紫色的div框(son)的时候,会依次执行爷爷、爸爸、儿子,这个其实就是事件流动,事件的捕获。这些盒子绑定的事件会依次执行
实际工作是以冒泡为主
当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中一次被触发。这一个过程被称为事件冒泡
默认情况下,冒泡一定会发生的,只不过之前发生的时候我们没有看到任何的效果
下面这种情况,就是事件冒泡
正好与事件捕获反着来,依次执行儿子、爸爸、爷爷
当一个元素触发事件后,会依次向上调用所有父级元素的同名事件
父级都会执行一次同名的事件类型操作
比如儿子执行的是click事件,那爸爸、爷爷也会执行click事件
L2事件监听第三个参数时false,或者默认都是冒泡
有时候冒泡并不好,我们要进行阻止冒泡。
问题:默认有冒泡模式的存在,所以容易导致事件影响到父级元素
需求:若想把事件限制在当前元素内,就需要阻止事件冒泡
前提:阻止事件冒泡需要拿到事件的对象
语法:
注意:此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效
示例:
- L0 on事件方式,直接使用null覆盖就可以实现事件的解绑
语法
我们现在很少用这种事件绑定方式了
- **L2 addEventListener事件解绑方式 **
注意!匿名函数无法被解绑
我们在某些情况下,需要阻止默认行为的发生,比如阻止链接的跳转或者表单域跳转等
语法
事件冒泡有一个非常好的用途,就是事件委托,事件委托其实是一种技巧
事件委托是利用事件流的特征解决一些开发需求的知识技巧
优点:减少注册次数,提高程序性能
原理:事件委托其实是利用事件冒泡的特点
给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件
如果同时给多个元素注册事件,我们之前使用的是for循环注册事件,那有没有一种技巧注册一次事件就能完成以上效果呢?
我们点击的li,但是li上没有真正的点击事件,此时会事件冒泡到父级元素ul上,ul上会有点击事件
效果如下图所示:
需求:优化程序,将tab切换案例改为事件委托写法
tab栏的事件委托,我们委托给ul即可
3.1.1 load 事件
加载外部资源(如图片、外联CSS、JavaScript等),加载完毕时触发的事件
我们目前是把JavaScript的代码写在了body标签的最底部,但是其实也可以写在head标签中
-
事件名:load
-
监听页面所有资源加载完毕:
给window添加load事件(window代表着整个窗口)
最大的事window,其次是document
- 注意!不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件
等待某个图片加载完成后,就会执行回调函数
3.1.2 DOMContentLoaded
当初始的HTML文档被完全加载和解析完成后,DOMContentLoaded事件被触发,而无需等待样式表、图像等完全加载
load是监听整个页面资源,是给window加的,一定不要混淆
监听页面DOM加载完毕:给document添加DOMContentLoaded事件
或者说是元素滚动事件
滚动条在滚动的时候,持续触发的事件
很多网页需要检测用户把页面滚动到某一区域后做一些处理,比如固定导航栏,比如返回顶部
事件名:scroll
监听整个页面的滚动:
给window或document添加scroll事件,我们一般是给window
我们也可以单独监听某个元素内部滚动,直接给某个元素加即可
- 使用场景
滚动一段距离,让某些元素显示或者高亮等
可以使用scroll来检测滚动的距离,scrollLeft和scrollTop属性
使用其两个属性,能够获取被卷去的大小
获取元素内容往左往上滚出去看不到的距离
这两个值是可读写的
一定要是数值型的
竖着的长方体是内容,横着的代表是范围框,红色标出的长度就是scrollTop
也能对整个页面进行滚动事件
开发中,我们经常检测页面滚动的距离,比如页面滚动100像素就可以显示某个元素或者固定某一个元素
初始化的时候没有显示,当整个页面的顶部像素卷入超过100px后,div会展示出来
3.2.1 滚动显示侧边栏、
当页面滚动大于300像素,就显示电梯导航
红色框中的内容就是电梯导航
3.2.2 快速回顶部
添加一个点击事件,让scrollTop=0即可
3.2.3 scrollTo()
scrollTo()方法可把内容滚动到指定的坐标
- 会在窗口尺寸改变的时候触发事件resize
- 检测屏幕宽度clientWidth、clientHeight属性
获取元素的可见部分宽高,不包含边框、margin、滚动条等
- 页面尺寸于位置-尺寸
获取位置 element.getBoundingClientRect()
方法返回元素的大小及相对于视口的位置
当我们的盒子顶部隐藏了一部分后,top的值就变成负的了
我想要得到我这个盒子再页面中是多大的,并且能够知道他的位置
前面的案例滚动多少距离使我们自己算的,但是我们想页面滚动到某个元素,就可以做某些事情
简单的说,我们想通过js的方式,得到元素在页面中的位置
这样我们做页面滚动到某个具体位置执行具体的操作了,省了我们计算距离这一步,方便了一点
- 获取宽高offsetWidth、offsetHeight
获取元素的自身的宽高、包含元素自身设置的宽高、padding、border
获取出来的是数值,方便计算
注意!获取的是可视宽高,如果盒子是隐藏的,获取的结果是0
电梯导航栏就可以做下面的修改
这样就不用担心盒子上移和下移的问题
- 获取位置
获取元素距离自己定位父级元素的左、上距离,会受父级元素的影响
检测盒子的位置,最近一级带有定位的父级/祖先级元素
offsetLeft和offsetTop等注意是只读属性
给div定位住