跳到主要内容

事件相关

说说前端中的事件流

HTML 中与 javascript 交互是通过事件驱动来实现的,例如鼠标点击事件 onclick、页 面的滚动事件 onscroll 等等,可以向文档或者文档中的元素添加事件侦听器来预订事 件。想要知道这些事件是在什么时候进行调用的,就需要了解一下“事件流”的概念。 什么是事件流:事件流描述的是从页面中接收事件的顺序,DOM2 级事件流包括下面几个 阶段。 事件捕获阶段 处于目标阶段 事件冒泡阶段 addEventListener:addEventListener 是 DOM2 级事件新增的指定事件处理程序的操 作,这个方法接收 3 个参数:要处理的事件名、作为事件处理程序的函数和一个布尔 值。最后这个布尔值参数如果是 true,表示在捕获阶段调用事件处理程序;如果是 false,表示在冒泡阶段调用事件处理程序。 IE 只支持事件冒泡。

如何让事件先冒泡后捕获

在 DOM 标准事件模型中,是先捕获后冒泡。但是如果要实现先冒泡后捕获的效果,对 于同一个事件,监听捕获和冒泡,分别对应相应的处理函数,监听到捕获事件,先暂 缓执行,直到冒泡事件被捕获后再执行捕获之间。

说一下事件委托

简介:事件委托指的是,不在事件的发生地(直接 dom)上设置监听函数,而是在其父 元素上设置监听函数,通过事件冒泡,父元素可以监听到子元素上事件的触发,通过 判断事件发生元素 DOM 的类型,来做出不同的响应。 举例:最经典的就是 ul 和 li 标签的事件监听,比如我们在添加事件时候,采用事件 委托机制,不会在 li 标签上直接添加,而是在 ul 父元素上添加。 好处:比较合适动态元素的绑定,新添加的子元素也会有监听函数,也可以有事件触 发机制。

mouseover 和 mouseenter 的区别

mouseover:当鼠标移入元素或其子元素都会触发事件,所以有一个重复触发,冒泡的 过程。对应的移除事件是 mouseout mouseenter:当鼠标移除元素本身(不包含元素的子元素)会触发事件,也就是不会 冒泡,对应的移除事件是 mouseleave

什么是事件监听

addEventListener()方法,用于向指定元素添加事件句柄,它可以更简单的控制事 件,语法为 element.addEventListener(event, function, useCapture); 第一个参数是事件的类型(如 "click" 或 "mousedown"). 第二个参数是事件触发后调用的函数。 第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的。 事件传递有两种方式,冒泡和捕获 事件传递定义了元素事件触发的顺序,如果你将 P 元素插入到 div 元素中,用户点击 P 元素, 在冒泡中,内部元素先被触发,然后再触发外部元素, 捕获中,外部元素先被触发,在触发内部元素。

事件委托以及冒泡原理

事件委托是利用冒泡阶段的运行机制来实现的,就是把一个元素响应事件的函数委托 到另一个元素,一般是把一组元素的事件委托到他的父元素上,委托的优点是 减少内存消耗,节约效率 动态绑定事件 事件冒泡,就是元素自身的事件被触发后,如果父元素有相同的事件,如 onclick 事 件,那么元素本身的触发状态就会传递,也就是冒到父元素,父元素的相同事件也会 一级一级根据嵌套关系向外触发,直到 document/window,冒泡过程结束。

TODO

有了解过事件模型吗,DOM0级和DOM2级有什么区别,DOM的分级是什么

JSDOM 事件流存在如下三个阶段: 事件捕获阶段 处于目标阶段 事件冒泡阶段 JSDOM 标准事件流的触发的先后顺序为:先捕获再冒泡,点击 DOM 节点时,事件传播顺 序:事件捕获阶段,从上往下传播,然后到达事件目标节点,最后是冒泡阶段,从下 往上传播 DOM 节点添加事件监听方法 addEventListener,中参数 capture 可以指定该监听是添 加在事件捕获阶段还是事件冒泡阶段,为 false 是事件冒泡,为 true 是事件捕获,并 非所有的事件都支持冒泡,比如 focus,blur 等等,我们可以通过 event.bubbles 来 判断 事件模型有三个常用方法: event.stopPropagation:阻止捕获和冒泡阶段中,当前事件的进一步传播, event.stopImmediatePropagetion,阻止调用相同事件的其他侦听器, event.preventDefault,取消该事件(假如事件是可取消的)而不停止事件的进一步 传播, event.target:指向触发事件的元素,在事件冒泡过程中这个值不变 event.currentTarget = this,时间帮顶的当前元素,只有被点击时目标元素的 target 才会等于 currentTarget, 最后,对于执行顺序的问题,如果 DOM 节点同时绑定了两个事件监听函数,一个用于 捕获,一个用于冒泡,那么两个事件的执行顺序真的是先捕获在冒泡吗,答案是否定 的,绑定在被点击元素的事件是按照代码添加顺序执行的,其他函数是先捕获再冒泡

e.target 和 e.currentTarget 有什么区别?

e.target 触发事件的元素,e.currentTarget 绑定事件的元素。