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 属性,以提高代码的质量和可维护性。

相关文章
|
JavaScript 前端开发
addEventListener()方法中的参数,以及作用
addEventListener()方法中的参数,以及作用
555 1
|
10月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
360 15
|
8月前
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
718 5
|
前端开发
Html:CSS的书写位置
Html:CSS的书写位置
913 0
|
SQL 关系型数据库 分布式数据库
基于PolarDB的图分析:银行金融领域图分析实践
本文介绍了如何使用阿里云PolarDB PostgreSQL版及其图数据库引擎(兼容Apache AGE,A Graph Extension)进行图数据分析,特别针对金融交易欺诈检测场景。PolarDB PostgreSQL版支持图数据的高效处理和查询,包括Cypher查询语言的使用。文章详细描述了从数据准备、图结构创建到具体查询示例的过程,展示了如何通过图查询发现欺诈交易的关联关系,计算交易间的Jaccard相似度,从而进行欺诈预警。
基于PolarDB的图分析:银行金融领域图分析实践
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
1146 5
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
2710 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
前端开发 JavaScript API
深入理解css中的link 和 @import
【7月更文挑战第3天】CSS中的link与@import有显著差异。link是HTML标签,用于并行加载CSS,支持动态插入,用途广泛,如加载图标。@import是CSS语法,加载顺序在页面解析后,不支持动态引入,但可在CSS中导入多个样式表。link在性能和兼容性上优于@import。优选link,@import适用于多文件组织样式。
418 1
深入理解css中的link 和 @import
ThinkPHP6表单上传的数据获取的四种方式【请求对象调用,静态调用,助手函数调用,原生的get|post】
本文介绍了在ThinkPHP6中获取表单上传数据的四种方式:请求对象调用、静态调用(Facade)、助手函数调用以及原生的$_GET和$_POST数组。文章通过示例代码展示了每种方式的具体使用方法,并强调了在使用请求对象调用时引入正确的Request类的重要性。
|
边缘计算 物联网 开发者
什么是容器Docker?
什么是容器?容器,也叫Docker,是一个开源的容器化平台,用于开发、测试和部署应用程序。通过将软件打包为标准化的单元(容器),使得应用程序可以在任何地方一致地运行,不论是在开发者的本地机器上,还是在云计算平台上。Docker容器包含了应用程序运行所需的一切,包括代码、运行时、系统工具、系统库等,从而解决了“在我这里可以正常工作,但在服务器上不行”的问题。
1279 1

热门文章

最新文章