通俗理解,事件是用户或者浏览器自己执行的某种动作,是文档或者浏览器发生的一些交互瞬间,比如点击(click)按钮等,这里的click就是事件的名称。JS与html之间的交互是通过事件实现的,DOM支持大量的事件。DOM 事件模型这个知识点,在面试的时候也是常考知识~

事件流

我们知道,DOM是个树形结构,当我们在页面上单击一个按钮,页面上哪些元素会触发这个事件,是发生在这个按钮上,还是这个按钮的容器元素(我们说父元素)也会触发这个点击事件呢? 这就牵扯到事件流,从上面的思考,我们知道它描述的是事件触发顺序,那上文中是按钮和其容器元素都触发吗,它们谁先触发呢?这可不是确定的,得看是哪种类型的事件流了。

1、事件冒泡

事件冒泡是IE 的事件流,事件是由最具体的元素接收,然后逐级向上传播,在每一级的节点上都会发生,直到传播到document对象,向Chrome这样的浏览器会冒泡到window 对象(很容易记忆,联想水里的泡泡不也这样么)。

2、事件捕获

事件捕获是Netscape浏览器开发团队提出的,很有意思,他们思想和IE 的截然相反。也就是说,从不具体的节点到最具体的节点,一般是从document对象开始传播,不过很少人用事件捕获的,还是事件冒泡用的多。

3、DOM 事件流

这里规定的事件流有三个阶段: 事件捕获阶段,目标阶段,事件冒泡阶段。

事件处理程序

前面简单说了什么是事件,那响应事件的函数就是事件处理程序。比如click是事件名称,加上"on"开头,事件处理程序是onclick,有以下几种方式来给事件指定事件处理程序。

1、HTML 事件处理程序

其实就是,HTML 的on属性。

<button onclick="doSomething()">点击</button>
复制代码

⚠️ on + 事件名,因为要执行函数,我这里写的doSomething(),这是会执行的代码,不能写个函数名哈,要记得带上括号。使用这个方法指定的监听代码,只会在冒泡阶段触发。

2、DOM0 级事件处理程序

其实就是,元素节点的事件属性。

var btn = document.getElementById('btn');
btn.onclick = function () {console.log('被点击了!');
};
复制代码

⚠️ 这样就获取按钮的引用,并给它指定事件onclick,点击后在控制台输出'被点击了!'。
如果想删除事件处理程序,只需要这样 btn.onclick = null; // 删除事件处理程序

3、DOM2 级事件处理程序

记住2个方法,addEventListener()和removeEventListener(),用于添加和删除事件处理程序。

(1)EventTarget.addEventListener()

target.addEventListener(eventType, listener[, useCapture]);
复制代码

eventType ————> 事件名称,大小写敏感
listener ————> 监听函数
useCapture ————> 可选参数,默认false,表示监听函数只在冒泡阶段被触发。
举个例子:

function print() {console.log('Print Hello world');
}var btn = document.getElementById('btn');
btn.addEventListener('click', print, false);复制代码

上面代码的意思就是,节点id为btn的元素,使用addEventListener方法绑定click事件,点击的时候会监听函数print会发生。另外,因为useCapture设置为false,所以该函数只在冒泡阶段触发。
当我们需要添加多个不同的监听函数,使用addEventListener非常棒,遵从先添加先触发原则,而且不小心在同一个事件重复添加了同一个函数,它还会自动移除,该函数只会执行一次。

(2)EventTarget.removeEventListener()
顾名思义,用来移除addEventListener方法添加的事件监听函数。
它的参数和addEventListener方法一致,而且写的时候要一一对应。要做到三同,一是在同一个元素节点,二是同一个监听函数,三是第三个参数要一致。

4、IE 事件处理程序

(1)事件绑定监听函数:attachEvent(eventType, listener)
(2)事件移除监听函数:detachEvent(eventType, listener)

事件对象

1、DOM 中事件对象

事件发生的时候,会将一个 event 对象传入到事件处理程序中,从而可以使用对象的属性和方法。我随意列出几个。
bubbles:返回一个布尔值,表示当前事件是否会冒泡。该属性为只读属性
cancelable:返回一个布尔值,表示事件是否可以取消。该属性为只读属性
currentTarget:事件处理程序当前正在处理事件的那个元素
preventDefault():取消事件的默认行为。如果 cancelable 是true,则可以使用这个方法
stopPropagation():取消事件的进一步捕获或冒泡。如果 bubbles为 true,则可以使用这个方法。
事件处理程序使用DOM0 级或是 DOM2 级,都会传入 event 对象,这个我们不用care。

var btn = document.getElementById("myBtn");
btn.onclick = function(event){console.log(event.type);    //"click"};
btn.addEventListener("click", function(event){console.log(event.type);    //"click"}, false);
<button onclick="console.log(event.type)()">点击</button>
复制代码

2、IE 中事件对象

根据事件处理程序,有不同的方式。 (1) HTML 事件处理程序

<button onclick="console.log(event.type)()">点击</button>
复制代码

(2) DOM0 级事件处理程序

var btn = document.getElementById("btn");
btn.onclick = function(){var event = window.event;console.log(event.type);     //"click"
};
复制代码

(3) DOM2 级事件处理程序

var btn = document.getElementById("btn");
btn.attachEvent("onclick", function(event){console.log(event.type);         //"click"
});
复制代码

转载于:https://juejin.im/post/5ce7a7216fb9a07ee30df487

五分钟了解DOM 事件模型相关推荐

  1. javascript中0级DOM和2级DOM事件模型浅析

    Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...

  2. 五分钟学会用Simulink模型生成HDL代码

    五分钟学会用Simulink模型生成HDL代码 1 核心步骤 2 视频展示 3 生成HDL代码的注意事项 3.1 HDL支持的库和模块 3.2 设置simulink模型为可生成 hdl 的模式 3.3 ...

  3. 【JS】DOM事件模型

    DOM事件模型主要包含4个方面的内容,分别是: 事件流 主流浏览器的事件模型 事件对象 注册与移除事件监听器 下面一一了解下: 首先,什么是DOM?文档对象模型(DOM)是表示文档(比如HTML和XM ...

  4. W3C DOM 事件模型(简述)

    1.事件模型 因为事件捕获与冒泡模型都有其优点和解释,DOM标准支持捕获型与冒泡型,可以说是它们两者的结合体.它可以在一个DOM元素上绑定多个事件处理器,并且在处理函数内部,this关键字仍然指向被绑 ...

  5. 五分钟快速理解 Reactor 模型

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 本文将介绍基于进 ...

  6. 每天五分钟机器学习:如何计算模型的假阳性率和真阳性率?

    本文重点 如上所示,我们学习了查准率和召回率,本文我们将学习真阳性率和假阳性率,学会这个对将来构建ROC曲线非常有帮助 真阳性率和假阳性率 假如使用测试集来评估一个分类模型(二分问题):所以样本实际值 ...

  7. 【前端学习】前端学习第十五天:JavaScript中的事件模型

    在各种浏览器中存在三种事件模型:原始事件模型.DOM事件模型和IE事件模型: 一.原始事件模型: 原始事件模型被所有浏览器支持: 在原始事件模型中.事件一旦发生就直接调用事件处理函数,事件不会向别的对 ...

  8. DOM标准与IE的html事件模型区别

    转载:http://www.cnblogs.com/ilexcai/archive/2011/09/05/2168094.html http://blog.csdn.net/ca3355/articl ...

  9. 深入理解DOM事件机制

    前言 本文主要介绍: DOM事件级别 DOM事件流 DOM事件模型 事件代理 Event对象常见的方法和属性 一.DOM事件级别 针对不同级别的DOM,我们的DOM事件处理方式也是不一样的. DOM级 ...

  10. JS基础-事件模型(事件事件流自定义事件事件冒泡/代理)

    文章目录 一.事件与事件流 二.事件模型 1.DOM0级模型 2.IE事件模型 3.DOM2级模型 4.DOM3级事件处理方式 三.事件对象 四.事件绑定与解除 1.事件绑定 1.1对象.on事件名字 ...

最新文章

  1. 健康的身体是一切的保证 - 保护偶的颈椎!
  2. 360脱口秀:‘未来属于虚拟’开播啦!
  3. 在oracle中处理日期大全
  4. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
  5. 高达100亿美元!美国国防部将IBM和甲骨文双双踢出了云计算合同;华为任正非说了,华为对向苹果等对手出售5G芯片保持开放的态度...
  6. 计算机中丢失了ll是什么意思,丢失了ntoskrnl.exe和hal.ll
  7. CSS3 常用选择器
  8. java斗地主随机发牌_使用Java实现斗地主游戏的发牌过程
  9. 六张图了解Python的赋值、浅复制、深复制
  10. 蚂蚁课堂视频笔记思维导图-4期 一、微服务技术
  11. yii框架封装拼多多开放平台sdk
  12. SSM框架整合,简单案例
  13. SAS: PROC IMPORT简单入门介绍
  14. 矩阵的分解:满秩分解和奇异值分解
  15. echarts 随时间推移得刻度线_抖音超火❤罗盘时钟(免费附源码)
  16. 粤嵌实习-linux下madplay播放器的下载和使用、线程的介绍和创建一个广告循环播放线程
  17. 解决 have unmet dependencies: youdao-dict :
  18. 学习java被虐千百遍
  19. Mysql免安装版win精简教程
  20. vue echarts 中国地图实现用户分布

热门文章

  1. 使用自定义端口连接SQL Server 的方法
  2. 崩坏学园2及大部分采用ETC1压缩格式的Unity3D游戏的拆包图处理
  3. 搜索的逻辑即是用户的逻辑
  4. java调优随记-java对象大小
  5. SQL Server 2014新特性探秘(1):内存数据库
  6. JBPM开发入门指南(3)
  7. fpcx教程:在Final Cut Pro中添加多语言字幕
  8. CF - 1214D
  9. iOS底层探索之多线程(五)—GCD不同队列源码分析
  10. iOS底层探索之类的结构—cache分析(上)