6.2 JavaScript Apis - 事件流

   日期:2024-12-27    作者:wkvip 移动:http://ljhr2012.riyuangf.com/mobile/quote/61207.html

事件流指的是事件完整执行过程中的流动路径

事件流分为两种,第一种是捕获,第二种是冒泡

捕获可以看做是从大了往小了,冒泡可以看做是从小的往大的

说明:假设页面里面有一个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定位住


 

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号