news 2026/5/15 5:35:51

JavaScript DOM 原生部分(五):事件绑定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript DOM 原生部分(五):事件绑定

文章目录

  • 一.传统事件绑定(内联绑定/属性绑定)
    • 1.HTML 内联绑定(不推荐,结构与行为耦合)
    • 2.DOM 属性绑定(简单场景可用)
  • 二.事件监听方式(addEventListener,推荐)
    • 1.基本语法
    • 2.基本使用
    • 3.移除事件监听(removeEventListenera)
    • 4.事件传播模式
  • 三.常用事件类型
  • 四.事件对象(event)
  • 常用事件绑定表
  • 注意事项
  • 总结

在 JavaScript 中,事件绑定是实现页面交互的核心,指将事件处理函数与 DOM 元素的特定事件(如点击、鼠标移动、键盘输入)关联,当事件触发时执行对应逻辑.且原生方式包含传统绑定事件监听事件委托等不同模式,以下详细讲解:

原生 JS 提供了三种主流的事件绑定方式,各有适用场景和特点.

一.传统事件绑定(内联绑定/属性绑定)

这是最基础的绑定方式,分为HTML 内联绑定DOM 属性绑定,本质是将事件处理函数赋值给元素的事件属性(如onclickonmouseover).

1.HTML 内联绑定(不推荐,结构与行为耦合)

直接在 HTML 标签中通过on+事件名属性绑定函数,适合简单测试,不利于代码维护.

<!-- HTML 内联绑定点击事件 --><buttononclick="handleClick()">点击我</button><script>functionhandleClick(){alert('按钮被点击了!');}</script>

2.DOM 属性绑定(简单场景可用)

通过 JS 直接给元素的事件属性赋值,优点是简单直观,缺点是一个事件只能绑定一个处理函数(后续赋值会覆盖之前的).

// HTML: <button id="btn">点击我</button>constbtn=document.getElementById('btn');// 绑定点击事件btn.onclick=function(){console.log('按钮被点击(属性绑定)');};// 后续赋值会覆盖原有事件处理函数btn.onclick=function(){console.log('新的点击事件(覆盖了之前的)');};// 移除事件: 赋值为 nullbtn.onclick=null;

二.事件监听方式(addEventListener,推荐)

这是W3C 标准的事件绑定方式,也是现代开发中最常用的方式,支持一个事件绑定多个处理函数,还能指定事件传播模式.

1.基本语法

element.addEventListener(事件名,处理函数,可选参数);
  • 事件名: 不带on前缀(如click而非onclickmouseover而非onmouseover).
  • 处理函数: 事件触发时执行的函数(普通函数或箭头函数).
  • 可选参数:
    • 布尔值:true表示事件捕获,false(默认)表示事件冒泡.
    • 配置对象: 如{ capture: false, once: true, passive: true },其中:
      • once: true: 事件只触发一次,触发后自动移除监听.
      • passive: true: 表示处理函数不会调用event.preventDefault()(优化移动端滚动性能).

2.基本使用

constbtn=document.getElementById('btn');// 绑定第一个点击事件处理函数btn.addEventListener('click',function(){console.log('第一个点击处理函数');});// 绑定第二个点击事件处理函数(不会被覆盖)btn.addEventListener('click',()=>{console.log('第二个点击处理函数');});// 绑定一次性事件(仅触发一次)btn.addEventListener('click',function(){console.log('这个事件只触发一次');},{once:true});

3.移除事件监听(removeEventListenera)

需注意:移除的处理函数必须与绑定的是同一个引用(匿名函数无法被移除).

// 定义具名函数(便于移除)functionhandleClick(){console.log('可被移除的点击事件');}// 绑定事件btn.addEventListener('click',handleClick);// 移除事件(必须传相同的函数引用)btn.removeEventListener('click',handleClick);

4.事件传播模式

DOM 事件流分为三个阶段:事件捕获阶段目标阶段事件冒泡阶段.

  • 事件冒泡(默认): 事件从触发的目标元素向上传播到祖先元素(如点击子元素,父元素的同事件也会触发).
  • 事件捕获: 事件从祖先元素向下传播到目标元素.
// HTML: <div id="parent"><button id="btn">点击</button></div>constparent=document.getElementById('parent');constbtn=document.getElementById('btn');// 父元素捕获阶段监听parent.addEventListener('click',()=>console.log('父元素捕获'),true);// 子元素冒泡阶段监听btn.addEventListener('click',()=>console.log('子元素冒泡'),false);// 父元素冒泡阶段监听parent.addEventListener('click',()=>console.log('父元素冒泡'),false);// 点击按钮的执行顺序: 父元素捕获 → 子元素冒泡 → 父元素冒泡

三.常用事件类型

事件类别常见事件触发场景
鼠标事件clickdblclickmouseovermouseoutmousedownmouseup点击、双击、鼠标 移入 / 移出 等
键盘事件keydownkeyupkeypress键盘 按下 / 松开
表单事件submitchangeinputfocusblur表单提交、值变化、输入等
文档 / 窗口事件DOMContentLoadedloadresizescrollDOM 加载完成、页面加载完成等

四.事件对象(event)

当事件触发时,会自动传入一个事件对象(event),包含事件的相关信息和常用方法,是处理事件的重要工具.

常用属性/方法作用
event.target触发事件的实际目标元素(事件委托的核心)
event.currentTarget绑定事件的当前元素(等同于this)
event.type事件类型(如clickinput)
event.preventDefault()阻止事件的默认行为(如阻止表单提交、链接跳转)
event.stopPropagation()阻止事件冒泡或捕获
event.stopImmediatePropagation()阻止事件传播,且阻止当前元素的后续事件处理函数执行
event.key键盘事件中按下的键(如Entera)
event.clientX/clientY鼠标事件中鼠标的坐标(相对于视口)

常用事件绑定表

场景推荐方法
简单事件绑定(单个函数)element.onclick = fn(简单场景)/addEventListener
多个事件处理函数addEventListener
事件委托祖先元素addEventListener+event.target判断
一次性事件addEventListener{ once: true }

注意事项

  1. this的指向问题

    • 原生addEventListener中,处理函数的this指向绑定事件的元素;箭头函数的this指向定义时的上下文(如全局window).
  2. 事件冒泡的控制

    • 不必要的事件冒泡可能导致意外的事件触发,可通过event.stopPropagation()阻止.
    • 表单提交、链接跳转等默认行为,需用event.preventDefault()阻止.
  3. 动态元素的事件绑定

    • 动态添加的 DOM 元素,无法通过普通事件绑定生效,必须使用事件委托.
  4. 性能优化

    • 避免给大量元素单独绑定事件,优先使用事件委托.
    • 移除不再需要的事件监听(如页面卸载、组件销毁时),防止内存泄漏.
  5. 浏览器兼容

    • 旧版 IE(IE8 及以下)不支持addEventListener,需使用attachEvent()(如element.attachEvent('onclick', fn)),但现代开发中可忽略(或通过 Babel/Polyfill 兼容).

总结

  • 原生 JavaScript 中,addEventListener是最灵活的事件绑定方式,事件委托是处理大量元素和动态元素的最优解.
  • 掌握事件对象的使用、事件传播的控制和事件委托的技巧,是实现高效、稳定页面交互的核心.
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 23:12:34

从大模型到多模态,图文混排Agent彻底起飞~

本文详细解析了GLM 4.6V多模态大模型的图文混排能力&#xff0c;介绍了模型如何识别图片精确位置、处理多张图片输入并持续迭代优化。作者通过复刻相关代码&#xff0c;展示了多模态Agent的工作原理&#xff0c;强调模型从"读"信息到"看"信息的转变&#x…

作者头像 李华
网站建设 2026/5/3 5:37:41

【量子算法开发新境界】:VSCode高效优化技巧全揭秘

第一章&#xff1a;量子算法开发环境的现状与挑战当前&#xff0c;量子算法开发环境正处于快速演进阶段&#xff0c;尽管已有多个成熟框架支持量子程序设计&#xff0c;但开发者仍面临工具链不统一、硬件访问受限和模拟性能瓶颈等核心挑战。主流平台如Qiskit、Cirq和PennyLane提…

作者头像 李华
网站建设 2026/5/10 15:17:45

【RealEarthStudio】安装并配置Redis数据库

安装并配置Redis数据库 引言一、主要功能二、实现步骤2.1 Windows版本Redis下载2.2 开始安装Redis2.3 检验安装效果 引言 计算机专业硕士在读&#xff0c;主要研究方向是特定目标大斜视角目标检测与定位。因为要做的是特定目标&#xff0c;公开数据集较少&#xff0c;经过多方…

作者头像 李华
网站建设 2026/5/15 4:20:34

VSCode + Qiskit智能提示配置全攻略(从零到自动补全的终极指南)

第一章&#xff1a;VSCode Qiskit 的代码补全 在量子计算开发中&#xff0c;高效的编码体验离不开强大的代码补全功能。Visual Studio Code&#xff08;VSCode&#xff09;结合 Qiskit 开发插件&#xff0c;为开发者提供了智能提示、语法高亮和自动补全能力&#xff0c;显著提升…

作者头像 李华
网站建设 2026/5/15 3:32:14

GEO关键词AI排名优化哪家企业好

GEO关键词AI排名优化&#xff1a;至灵企业服务——您的理想之选在当今数字化营销竞争日益激烈的时代&#xff0c;企业要想在搜索引擎中脱颖而出&#xff0c;吸引更多潜在客户&#xff0c;关键词排名优化就显得尤为关键。特别是对于那些希望精准定位特定地理区域&#xff08;GEO…

作者头像 李华
网站建设 2026/5/13 23:22:51

SeedVR2革命性突破:6GB显存实现专业级视频修复完整指南

在AI视频修复技术快速发展的当下&#xff0c;传统工具对高端硬件的严苛要求已成为技术普及的最大障碍。SeedVR2通过创新的模型优化方案&#xff0c;将显存需求从12GB以上降低至仅需6GB&#xff0c;让RTX 4060等主流显卡也能流畅运行专业级视频修复功能。这项突破性技术为短视频…

作者头像 李华