实践出真知-Event事件

439 阅读4分钟
  • Dom节点上的事件方法
  • event事件实例
  • CustomEvent构造器

Dom节点上的事件方法

问题1:Dom节点元素上的事件方法是继承链是什么样的?即事件方法从何而来?

image.png

son是一个div元素,其原型链为 HTMLDIVElement -> HTMLElement -> Element -> Node -> EventTarget

发现addEventListenter,removewEventListener,dispatchEvent这几个方法是添加到EventTarget这个原型对象上的,所以只要是dom元素,都默认继承该方法

addEventListener

image.png

实践【事件名称大小写敏感】

image.png “Click”事件点击无效

实践【处理函数可以是一个具有handleEvent方法的对象】

image.png 处理函数执行了

实践【配置对象自定义配置】

image.png 处理函数只执行了一次,Vue中的once修饰符应该就是通过配置这个属性来控制的

image.png

image.png 设置了passive为true,表示event实例不会调用preventDefault()函数来禁用阻止浏览器默认行为,但是处理函数调用了,于是报错,但是并没有阻止后续的执行

注意:

  1. 如果为同一个Dom元素的同一个事件多次添加同一个处理函数,那么只会执行一次,如果为同一个事件添加多个不同的处理函数,多个处理函数会一次执行 【实践】

image.png 只执行了一次

image.png 执行了两次,{}对象的形式被被看成是两个处理函数

  1. 传参,如果需要传入某个参数,给处理函数的话,可以直接在最开始的处理函数调用真正的处理函数,传入参数

image.png

  1. 处理函数中的this对象,指向那个dom元素

image.png

image.png 指向son元素对象

removeEventListener

image.png

【实践】

image.png 移除失败

image.png 移除成功了!!!【所以第三个参数无所谓】

dispatchEvent

image.png

【实践-返回值】

image.png result -> true

image.png result => true 虽然在处理函数中调用了preventDefault()函数,但是还是返回了true!!!

event实例

实例属性

image.png

  • bubbles: 表示当前事件是否会冒泡,通过Event构造函数生成的实例属性,默认是不会冒泡的
  • cancelBubble: 是否取消冒泡,相当于执行Event.stopPropagation(),可以阻止事件的传播
  • cancelable: 表示事件是否可以取消,只读,大多数浏览器原生事件是可以取消的,除非显式声明,通过Event构造函数生成的事件,默认是不可以取消的
  • composed
  • currentTarget 返回事件当前所在的节点,即正在执行监听函数所绑定的那个节点
  • defaultPrevented: 表示该事件是否调用过Event.preventDefault(),只读
  • evetPhase 表示事件目前所处的阶段,只读

0:事件目前没有发生

1: 事件目前处于捕获阶段,即处于从祖先节点向目标节点传播的过程

2:事件到达目标阶段,Event,target指向的节点

3:事件处于冒泡阶段,即从目标节点向祖先阶段反向传播的过程

  • isTrusted 表示事件是否由真实的用户行为产生,true表示用户通过ui操作,false表示js模拟触发事件

  • path 表示捕获的路径

  • returnValue 是否有返回值

  • srcElement 触发的事件的源元素

  • target 事件的目标节点,和srcElement一样

  • timeStamp 事件触发的事件

  • type 事件的类型,字符串

  • detail 只有浏览器的UI(用户界面)事件才具有,返回一个数值,表示事件的某种信息

event方法

问题1:event事件失实例的方法是从谁那继承过来的,具体的继承链是什么样得?

image.png 点击事件实例event -> MouseEvent - UIEvent -> Event(方法是从Event原型对象上继承过来的)

**preventDefault(): **

取消浏览器对当前事件的默认行为,前提是事件的cancelable属性值为true 注意:该方法仅仅是取消事件对当前元素的默认影响,不会阻止事件的传播

stopPropagation():

阻止事件的传播。防止再次触发定义在别的节点上的监听函数,但是不包括在当前节点上的事件监听函数

注意:如果是一个节点对于同一个事件添加了多个监听函数,多个监听函数还是会依次执行

【实践】

image.png 输出了“hi”

stopImmediatePropagation()

阻止事件从传播,注意:如果是一个节点对同一个事件有多个监听函数,当其中一个监听函数调用了这个方法,剩下的监听函数就不会执行

【实践】

image.png 什么都没有输出

Event.composedPath()

返回一个数组,成员是事件的最底层节点和依次冒泡经过的所有上层节点

【实践】

image.png

CustomEvent()构造函数

image.png CustomEvent作为window对象上的不可枚举的属性,用于生成自定义的事件实例

image.png