事件处理程序

news2025/4/18 8:44:06

事件处理程序


一、事件处理程序的定义

事件处理程序是一段代码,用于响应特定的事件。在网页开发中,事件是在文档或浏览器窗口中发生的特定交互瞬间,如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数,它能让网页实现交互性和动态性。

二、事件处理程序的绑定方式

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);  // 事件类型: click
            console.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 属性进行判断,增加了代码的复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【有啥问啥】深入浅出讲解 Teacher Forcing 技术

深入浅出讲解 Teacher Forcing 技术 在序列生成任务&#xff08;例如机器翻译、文本摘要、图像字幕生成等&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;以及基于 Transformer 的模型通常采用自回归&#xff08;autoregressive&#xff09;的方式生成输出…

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式&#xff1a;服务端主动将更新的数据发送给所有订阅的客户端。 拉模式&#xff1a;客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…

ubuntu wifi配置(命令行版本)

1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码&#xff0c;Password是wifi的密码3、查看连接情况 nmcli dev status

Docker与Kubernetes在ZKmall开源商城容器化部署中的应用

ZKmall开源商城作为高并发电商系统&#xff0c;其容器化部署基于DockerKubernetes技术栈&#xff0c;实现了从开发到生产环境的全流程标准化与自动化。以下是核心应用场景与技术实现&#xff1a; 一、容器化基础&#xff1a;Docker镜像与微服务隔离 ​服务镜像标准化 ​分层构建…

华为AI-agent新作:使用自然语言生成工作流

论文标题 WorkTeam: Constructing Workflows from Natural Language with Multi-Agents 论文地址 https://arxiv.org/pdf/2503.22473 作者背景 华为&#xff0c;北京大学 动机 当下AI-agent产品百花齐放&#xff0c;尽管有ReAct、MCP等框架帮助大模型调用工具&#xff0…

MYSQL数据库语法补充

一&#xff0c;DQL基础查询 DQL&#xff08;Data Query Language&#xff09;数据查询语言&#xff0c;可以单表查询&#xff0c;也可以多表查询 语法&#xff1a; select 查询结果 from 表名 where 条件&#xff1b; 特点&#xff1a; 查询结果可以是&#xff1a;表中的字段…

在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] 为企业网站应用接入钉钉鉴权&#xff0c;实现钉钉客户端内自动免登授权&#xff0c;浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限&#xff0c;没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…

用AbortController取消事件绑定

视频教程 React - &#x1f914; Abort Controller 到底是什么神仙玩意&#xff1f;看完这个视频你就明白了&#xff01;&#x1f4a1;_哔哩哔哩_bilibili AbortController的好处之一是事件绑定的函数已无需具名函数,匿名函数也可以被取消事件绑定了 //该代码2秒后点击失效…

this指针 和 类的继承

一、this指针 Human类的属性fishc与Human&#xff08;&#xff09;构造器的参数fishc同名&#xff0c;但却是两个东西。使用this指针让构造器知道哪个是参数&#xff0c;哪个是属性。 this指针&#xff1a;指向当前的类生成的对象 this -> fishc fishc当前对象&#xff08;…

无锡无人机驾驶证培训费用

无锡无人机驾驶证培训费用&#xff0c;随着科技的迅速发展&#xff0c;无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测&#xff0c;再到物流运输与城市规划&#xff0c;无人机的应用场景不断扩展&#xff0c;因此越来越多的人开始意识到学习无人机驾驶技能的重…

我们如何思考AI创业投资

&#x1f3ac; Verdure陌矣&#xff1a;个人主页 &#x1f389; 个人专栏: 《C/C》 | 《转载or娱乐》 &#x1f33e; 种完麦子往南走&#xff0c; 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ 声明&#xff1a;本文作者转载&#xff0c;原文出自…

LabVIEW 中数字转字符串常用汇总

在 LabVIEW 编程环境里&#xff0c;数字与字符串之间的转换是一项极为基础且重要的操作&#xff0c;广泛应用于数据处理、显示、存储以及设备通信等多个方面。熟练掌握数字转字符串的方法和技巧&#xff0c;对编写高效、稳定的程序起着关键作用。接下来&#xff0c;我们将全面深…

蓝桥杯 C/C++ 组历届真题合集速刷(二)

一、0ASC - 蓝桥云课 &#xff08;单位换算&#xff09;算法代码&#xff1a; #include <iostream> using namespace std; int main() {printf("%d",L);return 0; } 二、0时间显示 - 蓝桥云课 &#xff08;单位换算&#xff09;算法代码&#xff1a; #inclu…

【接口自动化_数据格式与类型】

在HTTP接口的自动化测试中&#xff0c;请求的数据格式和内容类型是两个密切相关但又有所区别的概念。以下是它们的分类和详细说明&#xff1a; 一、数据格式 数据格式是指请求体&#xff08;Body&#xff09;中数据的组织方式&#xff0c;常见的数据格式有以下几种&#xff1…

网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解

简介 本文主要介绍内网&#xff08;局域网&#xff09;与外网&#xff08;互联网&#xff09;的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接&#xff1a;iperf.fr/iperf-download.php该链接提供了不…

源代码保密解决方案

背景分析 随着各行各业业务数据信息化发展&#xff0c;各类产品研发及设计等行业&#xff0c;都有关乎自身发展的核心数据&#xff0c;包括业务数据、源代码保密数据、机密文档、用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; — 属于核心机密资料&…

PyCharm使用Flask启动项目后,如何修改文件,开启启动加载或是热启动,不用重启项目,直接生效。

PyCharm使用Flask启动项目后&#xff0c;每次修改完文件比如html、py文件都要重启项目才生效&#xff0c;在测试时很不方便&#xff0c;如何设置热启动&#xff0c;修改完文件后直接生效了&#xff1f; 解决方法 1、app.py文件&#xff0c;设置debugTrue。开启调试模式。 开…

SpringCloud微服务(一)Eureka+Nacos

一、认识 微服务技术对比&#xff1a; SpringCloud&#xff1a; 版本匹配&#xff1a; 二、服务拆分以及远程调用 消费者与提供者&#xff1a; Eureka&#xff1a; 搭建EurekaServer&#xff1a; Ribbon负载均衡&#xff1a; 实现原理&#xff1a; IRule&#xff1a;规则接口…

深度学习天崩开局

李沐大神的d2l包导入&#xff0c; 这玩意需要python311版本&#xff0c;我现在版本已经313了&#xff0c;作为一个天生要强的男人&#xff0c;我是坚决不向低版本低头的。 然后我就研究啊&#xff0c;各种翻资料啊&#xff0c;然后deepseek加豆包都翻烂了&#xff0c; 最终所…