一. 事件对象
事件只要触发就会产生一个事件对象,事件对象里包含着一切跟事件触发相关的信息,一般命名为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()来去除事件绑定
三. 事件委托
它的优点是减少事件注册,只需要注册父容器即可。可以为已存在和未来存在的元素注册事件,注册一次,现在未来通用,它的原理就是利用事件冒泡。一般使用场景是需要动态渲染元素的时候,因为动态渲染元素只能使用事件委托。