js-day7
JS学习之旅-day7
- 1.事件流
- 1.1 事件流与两个阶段说明
- 1.2 事件捕获
- 1.3 事件冒泡
- 1.4 阻止
- 1.5 解绑事件
- 2. 事件委托
- 3. 其他事件
- 3.1 页面加载事件
- 3.2 页面滚动事件
- 3.3 页面尺寸事件
- 4. 元素尺寸与位置
1.事件流
1.1 事件流与两个阶段说明
事件流
指的是事件完整执行过程中的流动路径- 两个阶段:
- 捕获阶段(
事件捕获
):Document->Element html->Element body->Element div - 冒泡阶段(
事件冒泡
):Element div ->Element body->Element html->Document - 简单来说:捕获是父到子,冒泡是子到父
- 捕获阶段(
1.2 事件捕获
- 概念:从DOM的根元素开始去执行对应的事件(从外到里)
- 代码:
DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)
- 说明:
- addEventListener第三个参数传入
true
代表是捕获阶段触发 - 若传入false代表冒泡阶段触发,默认是false
- addEventListener第三个参数传入
1.3 事件冒泡
- 概念:当一个元素的事件被触发时,同样的事情将会在该元素的所有祖先元素中依次被触发。
- 简单理解:当一个元素触发事件后,会依次向上调用所有父亲组件的
同名事件
- 代码:
DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)
- 第三个参数不写或者传入false
1.4 阻止
事件对象.stopPropagation()
:阻止传播(包含冒泡、捕获)事件对象.preventDefault()
:阻止默认行为(包含链接跳转,表单域跳转)- 在事件绑定的回调函数的第一个参数就是
事件对象
,一般命名为event/ev/e
1.5 解绑事件
- L0
btn.onclick = function () {alert('点击了')// 解绑事件btn.onclick = null }
- L2:
removeEventListener(事件类型,事件处理函数,[添加时使用的阶段(true:捕获;false:冒泡])
注意:匿名函数无法被解绑function fn() {alert('点击了') } //这里第三个参数为true的话,解绑的第三个参数也要为true btn.addEventListener('click', fn) // 解绑事件 btn.removeEventListener('click', fn)
2. 事件委托
- 事件委托是利用事件流的特效解决一些需求的知识技巧
- 优点:减少注册次数,可以提高程序性能
- 原理:利用事件冒泡。给
父元素
注册事件,当我们触发子元素时,会冒泡到父元素上,从而触发父元素的事件。 - 实现:
事件对象.target
可以获取到真正触发事件的元素,如果需要加判定条件可以使用事件对象.target.tagName
3. 其他事件
3.1 页面加载事件
- 加载外部资源(如图片、外联css和js等)加载完毕时触发的事件
- 事件名:
load
- 监听页面所有资源加载完毕:
给window添加load事件
window.addEventListener('load',function(){})
- 针对某个资源绑定load事件
const img = document.querySelector('#img')img.addEventListener('load',function(){console.log('图片加载完毕');})
- 事件名:
- 当初始的HTML文档被完全加载后,DOMContentLoaded事件被触发,无需等待样式表、图片等完全加载
- 事件名:
DOMContentLoaded
- 监听页面DOM加载完毕:
给document添加DOMContentLoaded事件
document.addEventListener('DOMContentLoaded',function(){})
- 事件名:
3.2 页面滚动事件
- 事件名:
scroll
- 监听整个页面的滚动:
window.addEventListener('scroll',function(){})
- 监听某个元素内部的滚动,给某个元素加即可
- 获取位置:
scrollLeft、scrollTop
获取被卷去的大小,可读写
- 获取页面的滚动:
document.documentElement.scrollTop
,可以赋值 - 把内容滚动到指定坐标2:
元素.scrollTo(x,y)
3.3 页面尺寸事件
- 在窗口尺寸改变时触发:
resize
window.addEventListener('resize',function(){})
- 获取宽高:
clientWidth和clientHeight
(不包含边框、margin、滚动条等)
4. 元素尺寸与位置
-
获取宽高:
offsetWidth
/offsetHeight
- 获取元素的自身宽高,包含元素自身设置的宽高、padding、border
- 取出来的是数值
- 注意:获取的是可视宽高,如果盒子是隐藏的,获取的是0
-
获取位置:
offsetLeft
/offsetTop
- 获取元素距离自己最近的
具有定位
的祖先元素的左、上距离 - 注意:offsetLeft 和 offsetTop 是只读属性
- 获取元素距离自己最近的
-
返回元素大小及其相对视口的位置:
element.getBoundingClientRect()