关于js中的事件和事件对象的关键点

139 阅读2分钟

一. 事件对象

事件只要触发就会产生一个事件对象,事件对象里包含着一切跟事件触发相关的信息,一般命名为e作为形参放到事件处理函数里。

  • 按键事件对象常用属性:e.key,e.which:键码

  • 鼠标单击事件常用属性:

    -e.offsetX/e.offsetY鼠标单击位置参照元素左上角的坐标值

    -e.clientX/e.clientY鼠标单击位置参照视口的坐标值

    -e.screenX/e.screenY鼠标单击位置参照屏幕左上角坐标值

  • e.target:用来实现事件委托,引用当前真正触发事件的元素对象

二. 事件流

事件流的过程:事件捕获=>事件目标阶段=>事件冒泡(实际工作都是使用事件冒泡为主)

  • 事件捕获:

    -从DOM的根元素开始去执行对应的事件

    -事件捕获机制必须使用事件监听的形式注册

  • 事件冒泡:

    当一个元素的实际被触发时,同样的事件将会在该元素的所有祖先元素中依次触发,这个过程叫做事件冒泡

    -如果没有冒泡,给父元素注册点击事件,点击里面的子元素,会导致父元素注册的点击事件无法执行

    -事件委托:自己不注册事件,将事件注册给祖先元素,减少事件注册,提高效率。使用e.target去获取当前点击的元素。

    -阻止事件冒泡:给不想冒泡的那个区域的事件函数内添加e.stopPropagation()

    -阻止冒泡和默认行为的方法:

    • e.stopPropagation():阻止事件冒泡
    • e.preventDefault():阻止默认的行为例如链接跳转和表单域跳转
  • 事件注册的两种方式:

    -传统on注册:会覆盖,可以使用null实现事件解绑

    -事件监听注册:不会覆盖,通过第三个参数确定是否捕获阶段触发事件,true为捕获阶段,false为冒泡阶段(默认值);匿名函数无法解绑,必须用removeEvenlistener()来去除事件绑定

三. 事件委托

它的优点是减少事件注册,只需要注册父容器即可。可以为已存在和未来存在的元素注册事件,注册一次,现在未来通用,它的原理就是利用事件冒泡。一般使用场景是需要动态渲染元素的时候,因为动态渲染元素只能使用事件委托。