17 DOM高级

104 阅读4分钟

注册事件

给元素添加事件 就称为注册事件或者绑定事件

注册事件有两种 : 传统方式 和 方法监听注册方式

传统注册事件

特点 : 注册事件的唯一性

也就是说 ,同一个元素的同一个事件只能设置一个处理函数,最后 注册的处理函数将会覆盖前面注册的处理函数

image.png

方法监听注册事件 addEventListener

特点 :

  • 可以给同一个元素的同一个事件添加多个处理函数,会按顺序依次执行

  • 里面的事件类型是字符串,必定加引号,且不带on

这个都会显示,按顺序

image.png

ie9之前 attachEvent

image.png

删除事件

传统方式

image.png

方法监听方式

removeEventListener('类型',哪个函数)

image.png

ie9之前 deachEvent

image.png

DOM事件流

事件流 是指 从页面中接收事件的顺序

或者说 : 事件发生的时候会在元素节点之间按照特定顺序传播,那么这个传播过程就是DOM事件流

DOM事件流分3阶段:

1、捕获阶段 (从外往里)

2、当前目标阶段

3、冒泡阶段 (从里往外)

冒泡阶段

是先 触发里面的再一层一层触发外面的

根据第三个参数进行设置,若是false 则是冒泡

image.png

捕获阶段

第三个参数是 true ,则是捕获

是先触发外层再向里走

image.png

注意点

1、js代码中 只能执行捕获或者冒泡其中的一个阶段

2、onclick 和 attachEvent 能得到冒泡阶段

image.png

3、实际开发中 很少使用捕获,更关注冒泡

4、有些事件没有冒泡 onfocus onblur onmouseenter onmouseleave

5、事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事情

事件对象

1、event 就是一个事件对象,写到函数的小括号里面 当形参来看

2、事件对象只有 有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数

3、事件对象 里面是我们事件的一系列相关数据的集合 ,跟事件相关的

4、这个事件对象我们自己也可以命名 eg evt e...

5、事件对象也有兼容性问题,ie9之前 只能通过 window.event来获取

image.png

image.png

e.target

返回的是 触发事件的对象;就是谁触发了点击事件返回谁

image.png 这个是给ul绑定点击事件,但在页面中点击li ,e.target返回的是点击谁就返回谁

image.png

e.target 和 this的区别

e.target 返回的是 触发事件的对象;就是谁触发了点击事件返回谁

this 返回的是 绑定事件的对象 ; 就是谁绑定了点击事件返回谁

image.png

image.png

e.type 返回事件类型

image.png

image.png

阻止默认事件

标准写法 e.preventDefault()

是个方法

image.png

传统注册方式

image.png

阻止事件冒泡

普通版本 e.stopPropagation()

是个方法

image.png

ie9之前 cancelBubble

image.png

事件委托(代理、委派)

ul里面有很多个li ,那么想给每一个li都注册一个事件,那么这样访问的DOM次数会很多,会延长整个页面的交互时间

事件委托原理 : 就是 不是给每一个子节点单独设置事件监听器,而是事件监听器设置在父节点上,然后利用冒泡原理影响设置的每一个子节点

案例 : 在ul中,给ul设置点击事件,那么利用e.target就可以找到当前点击的li,因为点击li,事件会冒泡到ul上,ul有注册事件,就会触发事件监听器

好处 : 只操作了一次DOM ,提高了程序的性能

过程 :

1、有一个 ul ,里面有3个li

image.png

2、给ul添加点击事件

image.png

3、利用排他思想,点击每一个li后,先循环,把所有li的背景颜色删去

image.png

4、再设置背景颜色

image.png

完整版代码

image.png

常用的鼠标事件

鼠标事件对象 : mouseEvent

禁止显示鼠标右键菜单 contextmenu

image.png

禁止选中文字 selectstart

image.png

鼠标事件对象

client 鼠标在可视区的坐标

image.png

page 鼠标在页面文档中的坐标

image.png

screen 鼠标在电脑屏幕中的坐标

image.png

常用的键盘事件

keyup 键盘弹起

image.png

keydown 键盘按下

image.png

keypress 键盘按钮

keypress和keydown 的区别是 : keypress无法识别功能键 eg:ctrl等

image.png

注意

1、若使用 addEventListener 则不需要加on

2、三个执行顺序是 keydown(按下) -> keypress(按下) -> keyup(弹起)

3、keypress 不识别功能键

键盘事件对象

keyCode 返回ASCII

image.png

不过,keyCode 在 keypress 中区分大小写,但在keyup和keydown中不区分大小写