事件处理程序
事件处理程序
一、事件处理程序的定义
事件处理程序是一段代码,用于响应特定的事件。在网页开发中,事件是在文档或浏览器窗口中发生的特定交互瞬间,如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数,它能让网页实现交互性和动态性。
二、事件处理程序的绑定方式
2.1 HTML 内联事件处理程序
原理:
直接在 HTML 标签中使用事件属性来绑定事件处理程序,事件属性的值是 JavaScript 代码。
示例:
<!DOCTYPE html>
<html lang="en">
<body> <button onclick="alert('你点击了按钮!')">点击我</button>
</body>
</html>
优缺点:
- 优点是简单直接,适合简单的交互。
- 缺点是 HTML 和 JavaScript 代码耦合度高,不利于代码的维护和复用。
2.2 DOM0 级事件处理程序
原理:
通过 JavaScript 获取 DOM 元素,然后将一个函数赋值给元素的事件属性。
示例:
<!DOCTYPE html>
<html lang="en">
<body> <button id="myButton">点击我</button> <script> const button = document.getElementById('myButton'); button.onclick = function() { alert('你点击了按钮!'); }; </script>
</body>
</html>
优缺点:
- 优点是兼容性好,所有浏览器都支持。
- 缺点是一个元素的一个事件只能绑定一个处理程序,如果多次绑定,后面的会覆盖前面的。
2.3 DOM2 级事件处理程序
原理:
使用 addEventListener() 方法来绑定事件处理程序,它可以为元素的同一个事件绑定多个处理程序。
示例:
<!DOCTYPE html>
<html lang="en">
<body> <button id="myButton">点击我</button> <script> const button = document.getElementById('myButton'); button.addEventListener('click', function() { alert('第一次点击响应'); }); button.addEventListener('click', function() { alert('第二次点击响应'); }); </script>
</body>
</html>
上述代码,当用户点击按钮时,会依次弹出两个警告框,先显示“第一次点击响应!”,再显示“第二次点击响应!”。如果用户的意图是只让其中一个处理程序响应,那么这段代码会导致两个处理程序都被触发。
下面对事件处理逻辑进行调整
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>title</title>
</head>
<body> <!-- 创建一个按钮 --> <button id="myButton">点击我</button> <script> // 获取按钮元素 const button = document.getElementById('myButton'); // 初始化点击次数为 0 let clickCount = 0; // 为按钮添加点击事件监听器 button.addEventListener('click', function () { // 点击次数加 1 clickCount++; if (clickCount === 1) { // 第一次点击时显示相应信息 alert('第一次点击响应'); } else if (clickCount === 2) { // 第二次点击时显示相应信息 alert('第二次点击响应'); } }); </script>
</body>
</html>
优缺点:
- 优点是可以为同一个事件绑定多个处理程序,并且可以控制事件的捕获和冒泡阶段。
- 缺点是部分旧浏览器(如 IE8 及以下)不支持,需要使用
attachEvent() 方法作为替代。
三、事件对象
定义:
当事件触发时,会自动创建一个事件对象,它包含了与该事件相关的信息,如事件类型、触发事件的元素、鼠标位置等。
示例:
<!DOCTYPE html>
<html lang="en">
<body><button id="myButton">点击我</button><script>const button = document.getElementById('myButton');button.addEventListener('click', function (event) {console.log(' 事件类型:', event.type); // 事件类型: clickconsole.log(' 触发事件的元素:', event.target); // 触发事件的元素:<button id="myButton">点击我</button>}); </script>
</body>
</html>
常见事件属性和方法:
type:返回事件的类型,如 click、mouseover 等。target:返回触发事件的元素。preventDefault():阻止事件的默认行为,如阻止链接的跳转、表单的提交等。stopPropagation():阻止事件的冒泡或捕获。
四、事件流
定义:
事件流:描述了事件在页面中触发的顺序,主要有事件捕获和事件冒泡两种机制。
事件捕获:事件从文档的根节点开始,依次向下查找触发事件的元素,直到找到目标元素。在这个过程中,如果元素绑定了相应的捕获阶段的事件处理程序,会依次执行。
事件冒泡:事件从目标元素开始,依次向上传播到文档的根节点。如果元素绑定了相应的冒泡阶段的事件处理程序,会依次执行。
示例:
<!DOCTYPE html>
<html lang="en">
<body> <div id="outer"> <div id="inner">点击我</div> </div> <script> const outer = document.getElementById('outer'); const inner = document.getElementById('inner'); outer.addEventListener('click', function() { console.log(' 外层 div 冒泡阶段触发'); }, false); outer.addEventListener('click', function() { console.log(' 外层 div 捕获阶段触发'); }, true); inner.addEventListener('click', function() { console.log(' 内层 div 冒泡阶段触发'); }, false); inner.addEventListener('click', function() { console.log(' 内层 div 捕获阶段触发'); }, true); </script>
</body>
</html>
这段代码的主要功能是展示事件在DOM中的捕获和冒泡机制。当你点击inner div时,首先会触发outer div的捕获阶段事件处理程序,然后是inner div的捕获阶段事件处理程序。接着,事件开始冒泡,首先触发inner div的冒泡阶段事件处理程序,最后是outer div的冒泡阶段事件处理程序。通过这种方式,可以控制事件处理程序的执行顺序。
五、事件委托
原理:
利用事件冒泡的原理,将事件处理程序绑定到父元素上,当子元素触发事件时,事件会冒泡到父元素上,从而触发父元素上的事件处理程序。通过判断事件的 target 属性,可以确定是哪个子元素触发了事件。
示例:
<!DOCTYPE html>
<html lang="en">
<body> <ul id="myList"> <li>列表项 1</li> <li>列表项 2</li> <li>列表项 3</li> </ul> <script> const list = document.getElementById('myList'); list.addEventListener('click', function(event) { if (event.target.tagName === 'LI') { console.log(' 你点击了列表项:', event.target.textContent); } }); </script>
</body>
</html>
优缺点:
- 优点:是可以减少事件处理程序的绑定数量,提高性能;便于动态添加和删除子元素,无需为新添加的子元素重新绑定事件处理程序。
- 缺点:是需要对事件的 target 属性进行判断,增加了代码的复杂度。
相关文章:
事件处理程序
事件处理程序 一、事件处理程序的定义 事件处理程序是一段代码,用于响应特定的事件。在网页开发中,事件是在文档或浏览器窗口中发生的特定交互瞬间,如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数,它能…...
stable diffusion部署ubuntu
stable-diffusion webui: https://github.com/AUTOMATIC1111/stable-diffusion-webui python3.10 -m venv venv(3.11的下torch会慢得要死) source venv/bin/activate 下载checkpoint模型放入clip_version"/home/chen/软件/stable-diffusion-webu…...
Qt的window注册表读写以及删除
Qt的window注册表读写以及删除 1. 使用 QSettings(Qt推荐方式)基本操作关键点限制 2. 调用Windows原生API示例:创建/读取键值常用API注意事项 3. 高级场景(1) 递归删除键(2) 注册表权限修改 4. 安全性建议总结其他QT文章推荐 在Qt中操作Windo…...
聊一聊接口测试时遇到上下游依赖时该如何测试
目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法(变量提取) 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例(以订单接口测试为例) 3.1Mock依赖接口&…...
C++ 排序(1)
以下是一些插入排序的代码 1.插入排序 1.直接插入排序 // 升序 // 最坏:O(N^2) 逆序 // 最好:O(N) 顺序有序 void InsertSort(vector<int>& a, int n) {for (int i 1; i < n; i){int end i - 1;int tmp a[i];// 将tmp插入到[0,en…...
【有啥问啥】深入浅出讲解 Teacher Forcing 技术
深入浅出讲解 Teacher Forcing 技术 在序列生成任务(例如机器翻译、文本摘要、图像字幕生成等)中,循环神经网络(RNN)以及基于 Transformer 的模型通常采用自回归(autoregressive)的方式生成输出…...
zk基础—zk实现分布式功能
1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式:服务端主动将更新的数据发送给所有订阅的客户端。 拉模式:客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…...
mySQL数据库和mongodb数据库的详细对比
以下是 MySQL 和 MongoDB 的详细对比,涵盖优缺点及适用场景: 一、核心特性对比 特性MySQL(关系型数据库)MongoDB(文档型 NoSQL 数据库)数据模型结构化表格,严格遵循 Schema灵活的文档模型&…...
ubuntu wifi配置(命令行版本)
1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码,Password是wifi的密码3、查看连接情况 nmcli dev status...
Docker与Kubernetes在ZKmall开源商城容器化部署中的应用
ZKmall开源商城作为高并发电商系统,其容器化部署基于DockerKubernetes技术栈,实现了从开发到生产环境的全流程标准化与自动化。以下是核心应用场景与技术实现: 一、容器化基础:Docker镜像与微服务隔离 服务镜像标准化 分层构建…...
华为AI-agent新作:使用自然语言生成工作流
论文标题 WorkTeam: Constructing Workflows from Natural Language with Multi-Agents 论文地址 https://arxiv.org/pdf/2503.22473 作者背景 华为,北京大学 动机 当下AI-agent产品百花齐放,尽管有ReAct、MCP等框架帮助大模型调用工具࿰…...
MYSQL数据库语法补充
一,DQL基础查询 DQL(Data Query Language)数据查询语言,可以单表查询,也可以多表查询 语法: select 查询结果 from 表名 where 条件; 特点: 查询结果可以是:表中的字段…...
Elasticsearch单节点安装手册
Elasticsearch单节点安装手册 以下是一份 Elasticsearch 单节点搭建手册,适用于 Linux 系统(如 CentOS/Ubuntu),供学习和测试环境使用。 Elasticsearch 单节点搭建手册 1. 系统要求 操作系统:Linux(Cent…...
在Windows搭建gRPC C++开发环境
一、环境构建 1. CMake Download CMake 2. Git Git for Windows 3. gRPC源码 git clone -b v1.48.0 https://github.com/grpc/grpc 进入源码目录 cd grpc 下载依赖库 git submodule update --init 二、使用CMake生成工程文件 三、使用vs2019编译grpc库文件 四、使用…...
[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录
[Python] 为企业网站应用接入钉钉鉴权,实现钉钉客户端内自动免登授权,浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限,没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…...
编程题学习
acwing 826. 单链表 #include <iostream>using namespace std;const int N 100010;int idx, e[N], ne[N], head;void init() {head -1;idx 0; }void insert_head(int x) {e[idx] x;ne[idx] head;head idx ; }void delete_k_pos(int x, int k) {e[idx] x;ne[idx…...
Dev C++单个源文件和项目两种编程方式介绍
Dev C单个源文件和项目两种编程方式介绍 Dev-C 是一款免费、开源的 C/C 集成开发环境(IDE),专为初学者和中级程序员设计,具有简单易用、功能丰富等特点。 Dev C 支持单文件编程和项目编程两种方式。它们之间的主要区别在于如何组…...
用AbortController取消事件绑定
视频教程 React - 🤔 Abort Controller 到底是什么神仙玩意?看完这个视频你就明白了!💡_哔哩哔哩_bilibili AbortController的好处之一是事件绑定的函数已无需具名函数,匿名函数也可以被取消事件绑定了 //该代码2秒后点击失效…...
解决:Fontconfig head is null, check your fonts or fonts configurat
文章目录 问题解决方案安装字体依赖包强制刷新字体缓存验证是否生效 个人简介 问题 在使用 Java 环境部署或运行图形相关应用时,比如图片验证码,偶尔会遇到如下报错: Fontconfig head is null, check your fonts or fonts configurat意味当…...
this指针 和 类的继承
一、this指针 Human类的属性fishc与Human()构造器的参数fishc同名,但却是两个东西。使用this指针让构造器知道哪个是参数,哪个是属性。 this指针:指向当前的类生成的对象 this -> fishc fishc当前对象(…...
无锡无人机驾驶证培训费用
无锡无人机驾驶证培训费用,随着科技的迅速发展,无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测,再到物流运输与城市规划,无人机的应用场景不断扩展,因此越来越多的人开始意识到学习无人机驾驶技能的重…...
反向查询详解以Django为例
以下给出两张表格 class User(AbstractUser):mobilemodels.CharField(max_length11,default0,uniqueTrue,verbose_name手机号)email_activemodels.BooleanField(defaultFalse,verbose_name邮箱验证状态)default_address models.ForeignKey(Address, related_nameusers, nullT…...
我们如何思考AI创业投资
🎬 Verdure陌矣:个人主页 🎉 个人专栏: 《C/C》 | 《转载or娱乐》 🌾 种完麦子往南走, 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 声明:本文作者转载,原文出自…...
详解在 MySQL 中建索引时的注意事项
MySQL 中建索引时的注意事项 1. 索引的必要性与设计2. 复合索引与列顺序3. 索引数量与维护4. 索引类型选择5. 特殊注意事项 1. 索引的必要性与设计 使用场景:优先为在 WHERE、JOIN、ORDER BY 和 GROUP BY 中频繁使用的列创建索引。合理的索引设计能显著提升查询效率…...
LabVIEW 中数字转字符串常用汇总
在 LabVIEW 编程环境里,数字与字符串之间的转换是一项极为基础且重要的操作,广泛应用于数据处理、显示、存储以及设备通信等多个方面。熟练掌握数字转字符串的方法和技巧,对编写高效、稳定的程序起着关键作用。接下来,我们将全面深…...
蓝桥杯 C/C++ 组历届真题合集速刷(二)
一、0ASC - 蓝桥云课 (单位换算)算法代码: #include <iostream> using namespace std; int main() {printf("%d",L);return 0; } 二、0时间显示 - 蓝桥云课 (单位换算)算法代码: #inclu…...
【接口自动化_数据格式与类型】
在HTTP接口的自动化测试中,请求的数据格式和内容类型是两个密切相关但又有所区别的概念。以下是它们的分类和详细说明: 一、数据格式 数据格式是指请求体(Body)中数据的组织方式,常见的数据格式有以下几种࿱…...
JavaScript/React中,...(三个连续的点)被称为 扩展运算符(Spread Operator) 或 剩余运算符(Rest Operator)
const processOrder (order) > {const tax order.total * 0.1;const finalAmount order.total tax;return { ...order, tax, finalAmount }; }; 解释一下,特别:...?在JavaScript/React中,...(三个连续的点)被称…...
网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解
简介 本文主要介绍内网(局域网)与外网(互联网)的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接:iperf.fr/iperf-download.php该链接提供了不…...
源代码保密解决方案
背景分析 随着各行各业业务数据信息化发展,各类产品研发及设计等行业,都有关乎自身发展的核心数据,包括业务数据、源代码保密数据、机密文档、用户数据等敏感信息,这些信息数据有以下共性: — 属于核心机密资料&…...
