JavaScript中的事件模型

JavaScript中的事件模型分为:事件和事件流、原始事件、标准事件和IE事件。

事件与事件流

JavaScript中的事件,可以理解为HTML文档或者浏览器中发生的一种交互操作,让网页有互动的功能。常见的事件就是加载事件、鼠标事件和自定义事件。

因为DOM是一个树结构,如果在子节点上绑定事件,那触发事件的时候,就会发生执行顺序的问题,这就涉及到了事件流的概念:

事件流会经历三个阶段:

  1. 事件捕获阶段
  2. 处于目标阶段
  3. 事件冒泡阶段

事件冒泡是一种从下往上的传播方式,由触发点开始,然后向上传播到最不具体的那个节点上,也就是DOM中的最高层父节点上。例如以下代码:

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <button id="clickMe">Click Me</button>
  <script>
    var btn =  document.getElementById('clickMe')
    btn.onclick = function(){
      console.log('1.btn')
    }

    document.body.onclick = function(){
      console.log('2.body')
    }

    document.onclick = function(){
      console.log('3.document')
    }

    window.onclick = function(){
      console.log('4.window')
    }
  </script>
</body>
</html>

点击按钮的时候,事件首先在button触发,然后向上传播。

事件捕获阶段则是从Document上开始的。

事件模型

事件模型可以分为三种:

  1. 原始事件模型【DOM0级】
  2. 标准事件模型【DOM2级】
  3. IE事件模型(基本上不用了)

原始事件模型【DOM0级】

事件绑定比较简单,有两种方式:

1、HTML代码中绑定:

javascript 复制代码
<button onclick='funclick()'></button>

2、通过JS代码绑定:

javascript 复制代码
var btn = document.getELementById('btn');
btn.onclick = function(){

}

原始事件模型的特性:

  1. 绑定速度快,原始事件具有很好的跨浏览器优势,会以最快的速度绑定,但是由于绑定速度太快,可能页面还未完全加载出来,以至于事件可能无法正常运行。
  2. 只支持冒泡,不支持捕获
  3. 同一个类型的事件只能绑定一次

标准事件模型【DOM2级】

标准事件模型的一个事件,会有三个过程:

  • 事件捕获阶段:事件从Document上一直向下传播到目标元素,依次检查经过的节点是否绑定事件监听函数,如果有那就执行;
  • 事件处理阶段:事件达到目标元素,触发目标元素的监听函数
  • 事件冒泡阶段:事件从目标元素冒泡到Document上,依次检查经过的节点上是否绑定事件监听函数,如果有那就执行。

事件监听函数:addEventListener(eventType, handler, useCapture)

移除监听函数:removeEventListener(eventType, handler, useCapture)

eventType:指定事件类型

handler:事件处理函数

useCapture:是一个布尔值,表示是否在事件捕获阶段执行,默认值是false,和IE浏览器保持一致。

相关推荐
PandaCave6 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
软件小伟8 分钟前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾30 分钟前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧38 分钟前
TypeScript 的发展与基本语法
前端·javascript·typescript
疯狂的沙粒2 小时前
对 TypeScript 中高级类型的理解?应该在哪些方面可以更好的使用!
前端·javascript·typescript
旭日猎鹰2 小时前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
一条晒干的咸魚3 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷3 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
sinat_384241094 小时前
在有网络连接的机器上打包 electron 及其依赖项,在没有网络连接的机器上安装这些离线包
javascript·arcgis·electron
小牛itbull4 小时前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress