addEventlistener和正常的onclick=()=> 的区别

简介: 【10月更文挑战第29天】`addEventListener` 是一种更推荐的添加事件处理函数的方式,它提供了更好的灵活性、可维护性和代码结构,能够满足复杂的事件处理需求,而 `onclick` 属性则更适合简单的、一次性的事件绑定场景,且在现代的JavaScript开发中,应尽量避免在HTML中直接使用 `onclick` 属性,以提高代码的质量和可维护性。

addEventListener 和直接在 HTML 元素上使用 onclick 属性并赋值一个箭头函数这两种方式都可以用于为元素添加点击事件,但它们在多个方面存在区别:

语法和使用方式

  • addEventListener:这是JavaScript中的一个方法,用于将事件处理函数绑定到指定的元素上。它接受三个参数,第一个参数是事件类型的字符串,如 'click',第二个参数是事件处理函数,第三个参数是一个可选的布尔值,用于指定事件是否在捕获阶段或冒泡阶段触发。示例如下:
    const button = document.getElementById('myButton');
    button.addEventListener('click', function() {
         
    console.log('Button clicked using addEventListener');
    });
    
  • onclick 属性:是HTML元素的一个属性,可直接在HTML标签中使用,将一个JavaScript表达式或函数赋值给它来定义点击事件的处理逻辑。使用箭头函数时,示例如下:
    <button id="myButton" onclick="() => console.log('Button clicked using onclick');">Click me</button>
    

事件绑定的数量

  • addEventListener:一个元素可以通过 addEventListener 方法添加多个相同类型的事件处理函数,这些函数会按照添加的顺序依次执行。这使得在不同的JavaScript代码片段中可以方便地为同一个元素的同一事件添加多个独立的响应逻辑,而不会相互覆盖。例如:
    const button = document.getElementById('myButton');
    button.addEventListener('click', function() {
         
    console.log('First click handler');
    });
    button.addEventListener('click', function() {
         
    console.log('Second click handler');
    });
    
    当按钮被点击时,控制台会依次输出 First click handlerSecond click handler
  • onclick 属性:一个元素只能有一个 onclick 属性,多次设置 onclick 时,后面的设置会覆盖前面的设置,无法实现多个事件处理函数的累加效果。

可维护性和代码结构

  • addEventListener:将JavaScript代码与HTML结构分离,使得HTML文件更加简洁,专注于页面的结构和内容展示,而JavaScript代码则可以独立地进行组织和管理,遵循更好的代码结构和设计模式,提高了代码的可维护性和可扩展性。所有的事件绑定逻辑都集中在JavaScript文件中,便于查找和修改。
  • onclick 属性:将JavaScript代码直接嵌入到HTML标签中,导致HTML和JavaScript代码的混合,使得HTML文件变得臃肿且难以维护。当需要修改事件处理逻辑时,必须在HTML文件中查找和修改对应的 onclick 属性,不利于代码的管理和团队协作。

作用域和 this 指向

  • addEventListener:在事件处理函数内部,this 指向触发事件的元素本身,这符合大多数情况下的预期,方便在事件处理函数中操作触发事件的元素及其相关属性和方法。同时,事件处理函数内部的变量作用域遵循正常的JavaScript函数作用域规则,可以方便地访问外部的变量和函数。
  • onclick 属性:当使用箭头函数作为 onclick 的值时,箭头函数本身没有自己的 this,它会继承外部作用域的 this。如果在箭头函数中使用 this,需要注意其指向可能与预期不符,可能导致一些难以排查的错误。而且在箭头函数中访问外部变量时,也需要注意作用域的问题,可能会出现意外的变量引用错误。

动态绑定和性能

  • addEventListener:可以在JavaScript代码的任何地方动态地为元素添加或移除事件监听器,这对于根据用户操作或页面状态动态地改变元素的行为非常有用。在页面加载完成后,通过JavaScript动态地为元素添加事件监听器,不会阻塞页面的渲染,提高了页面的加载性能。
  • onclick 属性:由于 onclick 属性是在HTML解析时就确定的,无法动态地添加或修改事件处理逻辑,灵活性较差。而且在页面加载时,浏览器需要解析和执行 onclick 属性中的JavaScript代码,可能会阻塞页面的渲染,影响页面的加载速度。

综上所述,addEventListener 是一种更推荐的添加事件处理函数的方式,它提供了更好的灵活性、可维护性和代码结构,能够满足复杂的事件处理需求,而 onclick 属性则更适合简单的、一次性的事件绑定场景,且在现代的JavaScript开发中,应尽量避免在HTML中直接使用 onclick 属性,以提高代码的质量和可维护性。

相关文章
|
11月前
|
容器
如何同时在捕获阶段和冒泡阶段添加事件监听器?
【10月更文挑战第29天】通过以上两种方法,可以根据具体的需求和场景,灵活地同时在捕获阶段和冒泡阶段添加事件监听器,以实现更复杂的事件处理和交互逻辑。
|
11月前
|
JavaScript 前端开发
除了点击事件,`addEventListener` 还能用于处理哪些事件类型?
【10月更文挑战第29天】 `addEventListener` 能够处理的事件类型非常丰富,涵盖了各种用户交互和页面状态变化的场景,通过合理地使用这些事件类型,可以为网页或应用程序添加丰富多样的交互效果和功能。
|
资源调度 JavaScript Windows
yarn install命令报错解决办法-warning package-lock.json found.
yarn install命令报错解决办法-warning package-lock.json found.
599 0
|
定位技术
Echarts集成bmap的属性介绍
Echarts集成bmap的属性介绍
454 0
|
12月前
|
XML Java 数据库连接
IDEA如何使mapper直接跳转到xml,超实用
【10月更文挑战第23天】本文介绍了如何在 MyBatis 框架中配置 Mapper 接口和 XML 文件的关联。方法一:使用 MyBatis-Generator 插件自动生成代码;方法二:手动配置,包括命名规范、文件路径设置和 IDEA 设置;此外,还可以通过快捷键、导航栏和 MyBatis-Plugin 插件来增强跳转功能。
5013 1
|
前端开发
Html:CSS的书写位置
Html:CSS的书写位置
679 0
|
10月前
|
SQL 关系型数据库 分布式数据库
基于PolarDB的图分析:银行金融领域图分析实践
本文介绍了如何使用阿里云PolarDB PostgreSQL版及其图数据库引擎(兼容Apache AGE,A Graph Extension)进行图数据分析,特别针对金融交易欺诈检测场景。PolarDB PostgreSQL版支持图数据的高效处理和查询,包括Cypher查询语言的使用。文章详细描述了从数据准备、图结构创建到具体查询示例的过程,展示了如何通过图查询发现欺诈交易的关联关系,计算交易间的Jaccard相似度,从而进行欺诈预警。
基于PolarDB的图分析:银行金融领域图分析实践
|
12月前
|
Java Shell 应用服务中间件
Mac系统下配置环境变量:Javajdk、maven、tomcat 环境变量配置及对应配置文件
这篇文章介绍了如何在Mac系统下配置Java JDK、Maven和Tomcat的环境变量,包括配置文件的选择、解决环境变量在zsh shell中无效的问题、查看和设置系统环境变量的方法,以及JDK和Maven的下载、配置和测试步骤。
4846 1
Mac系统下配置环境变量:Javajdk、maven、tomcat 环境变量配置及对应配置文件
|
11月前
|
人工智能 Scala Kotlin
Kotlin - 运算符与中缀表达式
Kotlin - 运算符与中缀表达式
81 6
|
11月前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。