博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
a标签onclick不执行_你不知道的DOM操作
阅读量:5149 次
发布时间:2019-06-13

本文共 1591 字,大约阅读时间需要 5 分钟。

一、DOM事件模型

DOM 事件模型包括捕获和冒泡,捕获是从上往下到达目标元素,冒泡是从当前元素,也就是目标元素往上到 window。

a201a8833eb863254c4fa0764630b44f.png

二、流

流的概念,在现今的 JavaScript 中随处可见。比如说 React 中的单向数据流Node 中的流,还有 DOM 事件流,都是流的一种生动体现。

至于流的具体概念,用术语说流是对输入输出设备的抽象。以程序的角度说,流是具有方向的数据。

三、事件流

浏览器在为当前页面与用户做交互的过程中,比如点击鼠标左键,会出现这个左键是怎么传到页面上,还有怎么响应的问题。

事件流所描述的就是从页面中接受事件的顺序,事件流分为两种:事件冒泡(主流)和事件捕获

1.事件冒泡

b48dc871ad03840fe99cd9a534da12ee.png

事件开始时由具体元素接收,然后逐级向上传播到父元素

举个例子:

bdbf97c1745b4a77862f760aa29feb3e.png

我们给 button 和它的父元素,加入点击事件

0303ddcdba6dca563f2ea71130791869.png

点击按钮运行效果:

1c2fdbec5e4ced934e77f2907ee5e9dd.png

也就是说,click 事件首先在 <button> 元素上发生,然后逐级向上传播,这就是事件冒泡

2.事件捕获

f5d9f7c80058bae5975bef74ecab7458.png

父元素的节点更早接收事件,而具体元素最后接收事件,与事件冒泡相反

四、DOM 事件流

c2a7bb6e03c1092789e027764cc7e617.png

1.事件捕获阶段

当事件发生时,首先发生的是事件捕获,为父元素截获事件提供了机会

49929849772ca285eb8e2cde7680425d.png

上面事件冒泡的 Demo 中,window 点击事件更改为使用事件捕获模式

97f3f00de556f17844dac3d7d83355f7.png

此时,点击 button 的效果是这样的:

e3c79435c2141bcd7666f1ba87e86e50.png

可以看到,点击事件先被父元素截获了,且该函数只在事件捕获阶段起作用

2.处于目标阶段

事件到了具体元素时,在具体元素上发生,并且被看成冒泡阶段的一部分

3.事件冒泡阶段

最后,冒泡阶段发生,事件开始冒泡

五、阻止事件冒泡

事件冒泡过程,是可以被阻止的。防止事件冒泡而带来不必要的错误和困扰。

阻止方法是使用 stopPropagation(),举个例子:

1dbb5b824caf62cac43535b1aa1b0b1c.png

还是上面的 demo,这里对 button 的 click 事件做了一些改造:

71743e7be9c6e450fccf4e13f4c0a5c4.png

点击后,效果如下图:

634f9d07d6e11e2f99ff02154c1b57a6.png

不难看出,事件在到达具体元素后,停止了冒泡,但不影响父元素的事件捕获

六、DOM0级事件

DOM0级事件,就是直接通过 onclick 等方式实现相应的事件

1.标签内写 onclick 事件

e765686d31d0b66f40a6da67491f67b1.png

2.在 JS 中 使用onclick = function(){}

146d69146568a5a443c6d8aa7ba11360.png

运行结果 - 点击弹出:

ec4aeb9e802288c9c610667769f5c118.png

这说明 DOM0 级添加事件时,后面的事件会覆盖前面的事件,而 DOM2级则不会,多个事件都会执行;

另外,DOM0级事件具有很好的跨浏览器优势,会以最快的速度绑定,但由于绑定速度太快,可能页面还未完全加载出来,以至于事件可能无法正常运行

七、DOM2级事件

1.DOM2级事件的方法

主流浏览器 DOM2 级事件是通过以下两个方法用于处理指定和删除事件处理程序的操作:

· addEvenetListener

· removeEventListener

2.DOM2级事件的使用

所有的 DOM 节点都包含这两个方法,使用方法如下:

· target.addEventListener(type, listener[, useCapture]);

· target.removeEventListener(type, listener[, useCapture]);

并且它们都接受三个参数:

·type:事件类型,如'click'、'mouseover'、'mouseout',在事件名前不加'on'

·listener:事件处理方法

·useCapture:布尔参数,不传该参数时默认是 false,表示在事件冒泡阶段处理,如果是 true,则表示在捕获阶段调用事件处理程序

举个例子:

0eb9ac517a34c25e16ee659cc496ed27.png

运行结果:

7146378a20f5c353f5a2cdee8f8ac899.png

注意:只有 DOM2级事件包含以下三个阶段

1. 事件捕获阶段

2. 处于目标阶段

3. 事件冒泡阶段

以上就是今天分享的内容啦~如果大家感兴趣的话,可以和我私聊,并且赞同或者收藏哦~

转载地址:http://xxdnv.baihongyu.com/

你可能感兴趣的文章
CentOS下vm虚拟机桥接联网
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>
C/C++的64位整型
查看>>
从setContentView()谈起
查看>>
java-接口—策略模式
查看>>
ms sqlserver数据库主文件特别大怎么办
查看>>
架构师
查看>>
LBP人脸识别的python实现
查看>>
今天第一次写博客
查看>>
极光推送没你想象的那么难
查看>>
NYOJ 26 孪生素数
查看>>
asp.net时间类-格式-方法应用
查看>>
win7分盘(复制)
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
【Java集合源码剖析】ArrayList源码剖析
查看>>
【国家集训队】旅游 题解(树剖基础)
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
解除phpMyAdmin导入大型MySQL数据库文件大小限制
查看>>