通俗易懂的DOM事件模型指南

前言

在前端开发中,DOM事件是我们与用户交互的核心。无论是点击按钮、滚动页面,还是输入文字,背后都离不开DOM事件的支持。今天,我们就来聊聊DOM事件模型,用最简单的方式带你理解它的工作原理。

一、什么是DOM事件?

DOM(文档对象模型)是浏览器用来表示和操作HTML文档的一种方式。我们可以把它想象成一棵树,每个HTML标签(比如<div><button>)都是树上的一个节点。DOM事件就是当用户或浏览器做了某些操作时(比如点击按钮、页面加载完成等),浏览器会触发的“信号”。

举个例子,当我们点击一个按钮时,浏览器会检测到这个点击操作,并触发一个click事件。我们可以通过编写代码来“监听”这个事件,并执行相应的操作,比如弹出一个提示框。

二、DOM事件的发展历史

1. DOM0级事件:简单直接

DOM0级事件是最早的事件处理方式。我们可以直接给一个元素的属性赋值一个函数,当事件发生时,这个函数就会被调用。

btn.onclick = function() {console.log('按钮被点击了!');
}

这种方式非常简单,但有一个缺点:一个事件只能绑定一个处理函数。如果我们再给onclick赋值另一个函数,之前的函数就会被覆盖。

2. DOM1级事件:没有事件模型

DOM1级标准主要是关于DOM的核心操作,并没有涉及事件模型,所以我们可以跳过它。

3. DOM2级事件:更强大的事件处理

DOM2级事件引入了addEventListenerremoveEventListener方法,允许我们给一个事件绑定多个处理函数,而且不会覆盖之前的函数。

btn.addEventListener('click', function() {console.log('第一个处理函数');
});
btn.addEventListener('click', function() {console.log('第二个处理函数');
});

当点击按钮时,两个函数都会依次执行。DOM2级事件还允许我们选择在事件的“捕获阶段”或“冒泡阶段”处理事件,灵活性大大增强。

三、事件的处理过程

1. 事件冒泡

当我们点击一个按钮时,事件会从最具体的元素(按钮)开始,然后逐级向上冒泡到更外层的元素(比如<body><html>)。你可以在冒泡阶段处理事件。

2. 事件捕获

与冒泡相反,事件捕获是从最外层的元素开始,逐级向下捕获到最具体的元素。我们可以在捕获阶段处理事件。

addEventListener中,我们可以通过第三个参数来控制是在捕获阶段还是冒泡阶段处理事件:

btn.addEventListener('click', function() {console.log('冒泡阶段处理');
}, false); // false表示在冒泡阶段处理
​
btn.addEventListener('click', function() {console.log('捕获阶段处理');
}, true); // true表示在捕获阶段处理

四、IE的特殊处理

在IE8及更早的版本中,IE使用了attachEventdetachEvent来处理事件,而不是addEventListenerremoveEventListener。IE的事件处理方式有一些不同:

  • 事件名前面要加on,比如onclick

  • 事件处理函数的作用域是全局的,this指向window,而不是触发事件的元素。

五、兼容性处理

为了兼容不同的浏览器(现代浏览器和IE),我们可以写一个通用的工具函数来处理事件:

var EventUtil = {addHandler: function(element, type, handler) {if (element.addEventListener) {element.addEventListener(type, handler, false);} else if (element.attachEvent) {element.attachEvent('on' + type, handler);} else {element['on' + type] = handler;}},removeHandler: function(element, type, handler) {if (element.removeEventListener) {element.removeEventListener(type, handler, false);} else if (element.detachEvent) {element.detachEvent('on' + type, handler);} else {element['on' + type] = null;}}
};

这个工具函数会根据浏览器的支持情况,自动选择合适的方式来添加或移除事件处理程序。

六、总结

  • DOM0级:简单直接,但一个事件只能绑定一个处理函数。

  • DOM2级:更强大,支持多个处理函数,且可以选择在捕获或冒泡阶段处理事件。

  • IE的特殊处理:IE8及更早版本使用attachEvent,处理方式与现代浏览器有所不同。

  • 兼容性:可以通过工具函数来处理不同浏览器的事件绑定问题。


 DOM事件模型是前端开发中非常重要的一部分,理解它可以帮助我们更好地处理用户交互。希望这篇文章能帮我们轻松掌握DOM事件的基本概念和使用方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【YOLOv8】损失函数

学习视频&#xff1a; yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失&#xff1a;BCE Loss 定位损失…

1.14作业

1 if($x[scheme]http||$x[scheme]https){ $ip gethostbyname($x[host]); echo </br>.$ip.</br>; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {die(ip!); }echo file_get_contents($_POST[url]);可以DNS重…

【工具篇】【深度解析 DeepAI 工具:开启 AI 应用新体验】

一、DeepAI 基本信息 嘿,咱先来说说 DeepAI 这工具到底是啥。DeepAI 是一个综合性的人工智能平台,就像是一个装满各种 AI 魔法的百宝箱。它把好多先进的人工智能技术整合到一起,让咱们普通人也能轻松用上这些高大上的 AI 功能。 这个平台背后有一群超厉害的技术人员,他们…

Java八股文(下)

Java八股文下篇 八、JVM高级篇1、JVM的内存模型以及分区介绍一下&#xff1f;2、四种引用方式有什么&#xff1f;3、判断是否为垃圾算法&#xff1f;4、垃圾回收算法介绍一下&#xff1f;5、类的生命周期以及类加载过程6、加载器种类有什么&#xff1f;7、什么是双亲委派模型以…

OpenGL开发杂谈

Renderdoc 调试 OpenGL 前言 在做 OpenGL 练习时常常苦恼于无法调试shader&#xff0c;故在网上查询方法。得知 renderdoc 这一东西&#xff0c;所以在这里做一下记录&#xff0c;如何使用 renderdoc 来调试 OpenGL 程序。 配置 下载比较简单&#xff0c;不必多说&#xff…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

我的AI工具箱Tauri版-CustomCardLayoutforH2Panel自定义描述Q版卡通大头照

本教程基于自研的AI工具箱Tauri版进行ComfyUI工作流CustomCardLayoutforH2Panel自定义描述Q版卡通大头照。 CustomCardLayoutforH2Panel 自定义描述Q版卡通大头照 特别面向需要生成个性化卡通大头照的用户需求。基于先进的Stable Diffusion&#xff08;SD&#xff09;模型技术…

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

MySQL数据库(7)—— 内置函数

目录 一&#xff0c;时间函数 二&#xff0c;字符串函数 三&#xff0c;数学函数 四&#xff0c;其它函数 一&#xff0c;时间函数 函数名功能current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时间date(datetime…

uni-app(位置1)

文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…

【数据库系统概论】第第12章 并发控制

12.1 并发控制概述 并发控制是指数据库管理系统&#xff08;DBMS&#xff09;通过控制多个事务同时执行&#xff0c;保证数据的一致性和隔离性&#xff0c;避免事务间的相互干扰。 事务串行执行不能充分利用系统资源 并发执行的优点&#xff1a;能够减少处理机的空闲 时间&a…

滚珠花键在使用时需注意什么?

滚珠花键是一种直线运动系统&#xff0c;当花键套利用其中的钢球在经过精密磨削的花键轴上直线运动时&#xff0c;可以传递扭矩。在使用滚珠花键时&#xff0c;需要注意以下几个重要的事项&#xff1a; 1、不要擅自拆卸滚珠花键的各部分&#xff0c;因为这样可能会导致异物进入…

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号&#xff0c;都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…

蓝桥杯刷题2.21|笔记

参考的是蓝桥云课十四天的那个题单&#xff0c;不知道我发这个有没有问题&#xff0c;如果有问题找我我立马删文。&#xff08;参考蓝桥云课里边的题单&#xff0c;跟着大佬走&#xff0c;应该是没错滴&#xff0c;加油加油&#xff09; 一、握手问题 #include <iostream&g…

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…

微服务SpringCloudAlibaba组件sentinel教程【详解sentinel的使用以及流量控制、熔断降级、热点参数限流等,附有示例+代码】

文章目录 四.Sentinel限流熔断4.1 sentinel介绍4.2 Sentinel 的历史4.3 Sentinel 基本概念资源规则 4.4 Sentinel 功能和设计理念4.4.1 流量控制4.4.2熔断降级什么是熔断降级熔断降级设计理念系统负载保护 4.5 Sentinel 是如何工作的4.6 Sentinel使用4.7 Sentinel 控制台4.8 Sp…

webmin配置终端显示样式,模仿UbuntuDesktop终端

webmin配置终端显示样式&#xff0c;模仿UbuntuDesktop终端 在webmin中&#xff0c;默认情况下是没有图形化桌面的&#xff0c;因此终端界面也不会像 Ubuntu Desktop 那样有预设的紫色背景和颜色主题。不过&#xff0c;你可以通过修改 ~/.bashrc 文件&#xff0c;并结合安装和…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

AWS-SAA中文版题库

一家公司收集多大洲城市的温度、湿度和大气压数据。该公司每天从每个站点收集的平均数据量为500GB。每个站点都有高速互联网连接。该公司希望尽快将所有这些全球站点的数据聚合到一个AmazonS3存储桶中。解决方案必须将操作复杂性降至最低。哪种解决方案满足这些要求&#xff1f…

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/&#xff0c;登录个人账号&#xff0c;右上角加号…