JS本身是没有事件的,是浏览器提供的DOM(Document Object Model)的功能。
要让JS支持,可以写一个事件系统。
事件是用户或者浏览器自己执行的某种动作,是文档或者浏览器发生的一些交互瞬间,比如点击(click)按钮等,这里的click就是事件的名称。JS与html之间的交互是通过事件实现的,DOM支持大量的事件。
一些名词
- 事件:指的是鼠标点击,键盘输入等用户操作。
- 事件对象:当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象。事件对象只有在事件发生时才会产生,我们无法手动创建,并且事件对象只能在处理函数内部访问,处理函数结束后该对象自动销毁。
- 事件发生的对象:指事件源。
- 事件源:发生事件的对象,一般指某一具体的组件,比如:用户点击某Button,则此Button即为事件源。
- 监听器:是一个方法,用以响应事件。
DOM事件机制
当点击一个按钮时,实际上不光点击了这个按钮,还点击了它的容器以及整 个页面。那么页面接受事件的顺序是什么呢?
事件冒泡
IE 事件流被称为事件冒泡,这是因为事件被定义为从最具体的元素(文档树中最深的节点)开始触 发,然后向上传播至没有那么具体的元素(文档)。
事件捕获
Netscape Communicator 团队提出了另一种名为事件捕获的事件流。事件捕获的意思是最不具体的节 点应该最先收到事件,而最具体的节点应该最后收到事件。事件捕获实际上是为了在事件到达最终目标 前拦截事件。
DOM事件流
DOM2 Events 规范规定事件流分为 3 个阶段:事件捕获、到达目标和事件冒泡。事件捕获最先发生, 为提前拦截事件提供了可能。然后,实际的目标元素接收到事件。最后一个阶段是冒泡,最迟要在这个 阶段响应事件。
语法
element.addEventListener(type, listener, [options], [useCapture])
useCapture没有或者为falsy时,沿着DOM树向下捕获的事件,不会触发listener(只会触发冒泡事件函数)
useCapture(设为true) 时,沿着DOM树向上冒泡的事件,不会触发listener(只会触发捕获事件函数)
事件委托
在 JavaScript 中,页面中事件处理程序的数量与页面整体性能直接相关。原 因有很多。首先,每个函数都是对象,都占用内存空间,对象越多,性能越差。其次,为指定事件处理 程序所需访问 DOM 的次数会先期造成整个页面交互的延迟。只要在使用事件处理程序时多注意一些方 法,就可以改善页面性能。
“过多事件处理程序”的解决方案是使用事件委托。事件委托利用事件冒泡,可以只使用一个事件 处理程序来管理一种类型的事件。
步骤:
- 在所有相同类型事件元素的父元素上添加事件
- 利用event.target进行判断