js事件机制详解
myzbx 2025-01-10 15:40 29 浏览
事件
JavaScript和html之间的交互是通过事件实现的。事件就是用户或者浏览器自身执行的某种动作。响应某个事件的函数就叫做事件处理函数。
事件对象
当事件被触发时,浏览器会创建一个事件对象,这个对象包含了与事件相关的信息,比如事件的类型,事件发生的位置等。事件对象会在事件处理函数中作为参数传递。
常见的属性
event.target:事件源,即触发事件的元素。
event.type:事件类型(例如 "click", "keydown" 等)。
event.preventDefault():阻止事件的默认行为(例如,阻止表单提交、链接跳转等)。
event.stopPropagation():阻止事件的冒泡,防止事件传递到父元素。
document.getElementById('myButton').addEventListener('click', function(event) {
console.log(event.target); // 输出触发事件的元素
event.preventDefault(); // 阻止按钮的默认行为
});
事件绑定
将一个事件附加到DOM元素上的过程就是事件绑定。
事件绑定通常有三种方式
内联绑定
内联绑定就是在DOM元素中直接绑定事件。
<!-- 在HTML中直接绑定点击事件 -->
<button onclick="alert('按钮被点击了!')">点击我</button>
js代码绑定
通过对象.事件的形式给对象绑定事件。
<button id="myButton">点击我</button>
const button = document.getElementById('myButton');
// 通过 JavaScript 绑定点击事件
button.onclick = function() {
alert('按钮被点击了!');
};
代码绑定事件只能给一个DOM元素绑定一个函数,如果再次为onclick复制,会覆盖原有的绑定事件。
事件监听器
通过addEventListener()方法给对象绑定事件,是最推荐的事件绑定方法,它可以为同一个事件绑定多个事件处理程序,并且可通过removeEventListener()方法移除事件处理程序。支持事件的捕获和冒泡机制,更灵活。
<button id="myButton">点击我</button>
const button = document.getElementById('myButton');
// 使用 addEventListener 为按钮绑定事件
button.addEventListener('click', function() {
alert('按钮被点击了!');
});
// 同一个元素可以绑定多个事件处理程序
button.addEventListener('click', function() {
console.log('按钮点击了,执行第二个事件处理程序');
});
通过button.addEventListener('click', function() {})绑定事件可以为同一个按钮绑定多个click事件。
事件回调机制
事件回调机制是js和浏览器交互的核心,通过addEventListener绑定事件与回调函数,当事件触发时,回调函数会被调用。
事件冒泡
事件冒泡描述了浏览器如何处理针对嵌套元素的事件。事件开始的时候从最深层节点接收,之后沿DOM树逐级向上传播,直至document对象。
事件捕获
事件捕获和事件冒泡是相反的,事件捕获是从最顶层节点开始接收事件,然后逐级向下传播,直至最深层节点。
事件的默认传播顺序是先通过捕获阶段从顶级父元素向下传播,到达目标元素之后通过冒泡阶段向上传播,到达顶级父元素结束。
可以通过addEventListener()方法的第三个参数来设置事件处理程序的执行时机,true表示捕获阶段,false表示冒泡阶段。
// 事件捕获阶段
document.getElementById('parent').addEventListener('click', function(event) {
console.log('捕获阶段触发');
}, true); // true 表示捕获阶段
// 事件冒泡阶段
document.getElementById('parent').addEventListener('click', function(event) {
console.log('冒泡阶段触发');
}, false); // false 表示冒泡阶段
事件委托原理与实现
事件委托利用事件冒泡机制来捕获事件,而不是将事件绑定到每个子元素上。比如将一个点击事件绑定到父元素,当子元素被点击时,事件会冒泡到父元素,这时父元素的事件监听器就能捕获这个事件。
如果给每个子元素绑定点击事件,当子元素很多时,性能会下降。而事件委托只需要在父元素上绑定一次事件,就可以处理所有子元素的事件,提高了性能。
事件委托通常用于为许多相似的元素添加相同的处理,但不仅限于此。例如可以在父容器元素上绑定事件,之后找到event.target,事件发生在指定元素内就处理该事件。
具象化的例子:一个有9个单元格的table表格,点击任意单元格,都会触发事件,并高亮显示该单元格。(也可以是99个单元格,999个单元格甚至更多)。
实现:table添加点击事件并添加监听器,捕获所有的td去除高亮,之后使用event.target给点击的td设置高亮。
html
<table id="table">
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</table>
style
<style>
/* 高亮显示的样式 */
.highlight {
background-color: yellow;
}
/* 给表格添加一些样式 */
table {
border-collapse: collapse;
width: 100%;
}
td {
border: 1px solid #ddd;
padding: 8px;
text-align: center;
cursor: pointer;
}
</style>
js
// 获取表格元素
const table = document.getElementById('table');
// 为表格绑定点击事件
table.addEventListener('click', function(event) {
// 确保点击的目标是 <td> 元素
if (event.target.tagName === 'TD') {
// 移除所有 <td> 的高亮
const allTd = table.getElementsByTagName('td');
for (let td of allTd) {
td.classList.remove('highlight');
}
// 为当前点击的 <td> 添加高亮
event.target.classList.add('highlight');
}
});
异步回调机制
js是单线程的编程语言,事件回调机制和异步编程(如setTimeout、Promise、async/await)结合紧密。事件回调通常是在事件队列中异步执行的,这意味着他们会在当前执行栈中的代码执行完毕后才会执行。
console.log('开始');
setTimeout(function() {
console.log('回调函数执行');
}, 0);
console.log('结束');
输出顺序
开始
结束
回调函数执行
事件回调的执行顺序
- 事件触发并将回调函数加入任务队列
- 执行当前栈中的同步代码
- 同步代码执行完毕,事件队列中的回调函数被放入执行栈中执行。
事件处理常见问题与方案详解
事件处理程序被覆盖:使用 addEventListener 绑定多个事件处理程序。 事件冒泡与捕获:使用 event.stopPropagation() 阻止冒泡,并通过 addEventListener 设置捕获或冒泡阶段。 性能问题:使用事件委托将事件绑定到父元素,减少内存消耗。 this 指向问题:使用普通函数确保 this 指向正确的元素,或者通过 bind() 绑定 this,箭头函数注意 异步问题:使用 async/await 或事件处理程序处理异步操作。 防止多次绑定事件:通过 { once: true } 选项确保事件处理程序只触发一次。
相关推荐
- 别让水 “跑” 出卫生间!下沉设计打造滴水不漏的家
-
你是否遭遇过卫生间的水“偷偷溜”进客厅,导致木地板鼓起、墙角发霉的糟心事?又是否为卫生间门口反复渗漏,不得不一次次返工维修而头疼不已?在家庭装修中,卫生间防水堪称“兵家必争之地”,而卫生间门口下...
- 歼-10CE vs 阵风:谁才是空中霸主?全面性能对比解析
-
歼10CE与法国阵风战斗机性能深度对比分析一、总体定位与设计哲学歼10CE:单发中型多用途战斗机,侧重于空优(制空权争夺)和对地对海打击,具有较高的性价比和较强的多任务能力。法国阵风战斗机:双发中型多...
- 知名移植工作室肯定Switch2的图形性能,却被CPU拖了后腿
-
虽然Switch2发售多日,但没入手的玩家对其性能还是有顾虑。近日,知名移植工作室Virtuos的技术总监在接受采访时讨论了Switch2的性能,并给出了他们工作室的评价。简单来说,Switch2在D...
- 虹科实测 | CAN XL vs CAN FD传输性能深度对比:速率翻倍,抖动锐减!
-
导读在汽车电子与工业通信领域,CAN协议持续进化,推动着数据传输效率的提升。本次实测基于虹科PCAN-USBXL与虹科PCAN-USBProFD硬件,在同等严苛条件下对比CANXL与CANF...
- 1J117合金材料优异的耐腐蚀性、机械性能
-
1J117合金材料概述定义:1J117是一种不锈软磁精密合金,属于铁铬基合金,其圆棒产品具有特定的形状和尺寸,可满足各种工业应用中的特定需求。标准:技术条件标准为GB/T14986,品种规格标准...
- 据高管所称,Switch2能轻松移植XSS平台60帧游戏
-
任天堂,作为主机游戏界的御三家之一,一直注重游戏性而不注重更新升级硬件设备是其最大的特点。各位任豚们,忍受着任天堂早已落后硬件设备,真想感叹一句,天下苦任久矣!但Switch2的出现或许正在渐渐的改变...
- FJK-110LED-HXJSN磁传感器有哪应用
-
作为一名从事电子技术相关工作的自媒体人,我经常会遇到各种传感器的应用问题。其中,FJK-110LED-HXJSN磁传感器是一款在工业自动化、智能设备等领域比较常见的磁场检测元件。今天我想和大家聊一聊这...
- 浅谈欧标方管200x200x5-12mm质S275JRH的优势与劣势
-
欧标方管200x200x5-12mm材质S275JRH是一种常见的结构用钢材,广泛应用于建筑、机械制造、桥梁、钢结构等领域。本文将对这种方管的优势与劣势进行浅谈,以帮助读者更好地了解其特性和适用场景。...
- 宽带拨号错误 651 全解析:故障定位与修复方案
-
在使用PPPoE拨号连接互联网时,错误651提示「调制解调器或其他连接设备报告错误」,通常表明从用户终端到运营商机房的链路中存在异常。以下从硬件、系统、网络三层维度展开排查:一、故障成因分类图...
- 模型微调:从理论到实践的深度解析
-
在人工智能领域,模型微调已成为提升模型性能、使其适应特定任务的关键技术。本文将全面系统地介绍模型微调的各个方面,帮助读者深入理解这一重要技术。一、什么是模型微调模型微调是指在已经训练好的预训练模型基础...
- 汉语拼音 z、c、s图文讲解(拼音字母表zcs教学视频)
-
以下是汉语拼音z、c、s的图文讲解,结合发音要领、书写规范及教学技巧:一、发音方法与口诀1.z的发音发音要领:舌尖轻抵上齿背,形成阻碍后稍放松,气流从窄缝中挤出,声带不振动(轻短音)。口诀:“写字写...
- 吴姗儒惹怒刘宇宁粉丝!吴宗宪护航「是综艺梗」叮咛女儿对话曝光
-
记者孟育民/台北报道Sandy吴姗儒在《小姐不熙娣》因为节目效果,将男星刘宇宁的头像踩在地上,引起粉丝怒火,节目发声明道歉后仍未平息,她也亲自发文郑重道歉:「我对刘宇宁本人完全没有任何恶意,却在综艺表...
- 苹果错误地发布了macOS Tahoe公开测试版 现已将其撤下
-
一些Beta测试人员下载了他们以为是macOSSequoia15.6RC的版本,但却错误地下载了macOSTahoe26公开测试版,后来苹果修复了该问题。苹果预计将于7月25...
- make的多种用法!(make 的用法总结)
-
一、make的用法美make[meik]①V.制造;制定,拟定;使变得,使处于;造成,引起;整理(床铺);做,作出;强迫;挑选,任命…②n.(机器、设备等的)品牌,型号;结构,构造;通电,接电⑤[...
- 北顿尖刀哗变?俄第20近卫集团军损失惨重,拒绝执行指挥官命令?
-
【军武次位面】作者:太白近日,外国社交媒体“电报”上传出了一些消息,称俄罗斯在北顿涅兹克战场上的“尖刀”部队之一,俄第20近卫集团军因为损失惨重,已经出现了部分部队拒绝执行指挥官命令,甚至哗变的情况。...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)