当前位置: 首页 > news >正文

JavaScript青少年简明教程:事件及处理

JavaScript青少年简明教程:事件及处理

在编程语言中,事件(Event)是一种使程序能够响应特定操作或条件发生的机制。它允许程序中的不同部分(比如对象、类或模块)在发生某些特定情况时互相通信或协作。事件驱动编程(Event-driven programming)是一种基于事件的编程范式,它依赖于事件和回调函数(或监听器)来处理或响应这些事件。

事件的基本组成部分

  1. 事件源(Event Source):产生事件的实体或对象。例如,在网页上,一个按钮点击事件的事件源就是该按钮。
  2. 事件(Event):具体发生的情况或动作,通常包含有关该动作的一些信息(如发生的时间、位置等)。在事件处理中,事件本身通常被封装成一个对象,这个对象包含了事件的详细信息。
  3. 事件处理器(Event Handler):是当事件发生时被调用的函数或方法。它定义了当事件发生时应该执行的动作。

网页上发生的事情或用户行为,如点击按钮、输入文本、移动鼠标等都是事件。JavaScript能够监听这些事件并根据事件执行相应的代码,从而使网页能够对用户操作作出反应。

常见的JavaScript事件类型

  1. 鼠标事件:如click(点击)、dblclick(双击)、mouseover(鼠标悬停)、mouseout(鼠标移出)、mousedown(鼠标按下)、mouseup(鼠标松开)等。
  2. 键盘事件:如keydown(键盘按键按下)、keyup(键盘按键释放)、keypress(字符键被按下)。
  3. 表单事件:如submit(表单提交)、change(表单字段变化)、focus(获得焦点)、blur(失去焦点)。
  4. 窗口事件:如load(页面加载完成)、resize(窗口大小改变)、scroll(滚动窗口)。
  5. 触摸事件:针对移动设备,如touchstart、touchmove、touchend、touchcancel。

事件处理方式

JavaScript处理事件的方式主要有两种:通过HTML属性添加事件处理程序和使用JavaScript添加事件监听器。

1) HTML属性: 在HTML元素中直接使用事件属性添加事件处理代码,如:

<button οnclick="alert('Hello World')">点击我</button>

这种方法简单直接,它使HTML和JavaScript的代码耦合度增高,不易于维护。

2) JavaScript事件监听器(Event Listener): 使用addEventListener方法可以在JavaScript代码中添加事件处理程序,这样可以将行为(JavaScript)与结构(HTML)分离,提高代码的可维护性。示例:

document.getElementById("myButton").addEventListener("click", function() { alert("Hello World"); });

这种方法更加灵活,允许为一个事件添加多个监听器,且可以更容易地控制监听器的移除。

事件传播

事件在DOM中的传播有两个阶段:捕获阶段和冒泡阶段。

  • 捕获阶段:事件从文档根节点沿DOM树向下传递到事件目标的过程。
  • 冒泡阶段:事件从事件目标沿DOM树向上回传到文档根节点的过程。

默认情况下,事件处理程序只在冒泡阶段执行,但可以通过addEventListener的第三个参数设置为true,使处理程序在捕获阶段执行。

事件监听器

事件监听器(Event Listener)是 JavaScript 中处理用户交互和异步操作的重要机制。它们允许开发者响应用户的操作(如点击、输入、鼠标移动等)以及其他异步事件(如网络请求、定时器等)。事件监听器是实现动态和互动 Web 应用程序的关键工具。

addEventListener 方法是 JavaScript 中最常用的事件绑定方式。它允许你将事件监听器附加到 DOM 元素上,并指定事件类型和回调函数。语法:

元素对象.addEventListener('事件类型',要执行的函数)

事件监听器三要素:

事件目标(Event Target):哪个DOM元素对象触发了事件。

事件类型(Event Type):触发事件的方式,也称为触发事件的事件名称,比如鼠标单击click、鼠标经过mouseover等。

事件处理函数(Event Handler):实现要做什么事情的函数。这个函数包含了事件发生时要执行的操作。

注意:事件类型要加引号,函数是点击之后再去执行,每次点击都会执行一次。

例如,响应用户的点击按钮操作:

<button id="myButton">Click Me!</button>
<script>// 首先,定义事件处理函数function handleClick() {alert('按钮被点击');}// 为按钮添加事件监听器
document.getElementById("myButton").addEventListener("click", function);
</script>

移除事件监听器

当不再需要监听某个事件时,应当移除对应的事件监听器,以避免可能的内存泄漏和性能问题。

可以使用removeEventListener方法将其移除。

这个方法需要与addEventListener使用相同的参数,包括事件类型、事件处理函数和用于指定事件是否在捕获阶段触发的选项(可选)。

// 当需要移除事件监听器时

document.getElementById("myButton").removeEventListener('click', function);

注意事项

1.确保函数相同:removeEventListener需要引用相同的函数。如果你在addEventListener时使用了匿名函数,那么你需要保持这个函数的引用,以便后终使用removeEventListener。如果直接传递一个新的函数或匿名函数,将无法正确移除监听器。

2.捕获与冒泡:如果在添加事件监听器时指定了事件处理程序在捕获阶段执行(即第三个参数为true),则在移除时也需要指定相同的参数。

3.重复移除:多次调用removeEventListener对同一个监听器没有副作用,但只有第一次调用会实际移除监听器。

例、这个例子展示了几种不同的事件处理方式:

使用HTML属性直接绑定事件(如onclick, onmouseover)

使用JavaScript的addEventListener方法添加事件监听器

源码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>HTML事件处理示例</title><style>body { font-family: Arial, sans-serif; line-height: 1.6; padding: 20px; }.example { margin-bottom: 20px; padding: 10px; border: 1px solid #ddd; }#hoverDiv { background-color: lightblue; padding: 10px; }</style>
</head>
<body><h2>HTML事件处理示例</h2><div class="example"><h3>1. 点击事件 (onclick)</h3><button onclick="showMessage()">点击我</button></div><div class="example"><h3>2. 鼠标悬停事件 (onmouseover/onmouseout),请留意颜色变化</h3><div id="hoverDiv" onmouseover="this.style.backgroundColor='yellow'" onmouseout="this.style.backgroundColor='lightblue'">将鼠标悬停在此处</div></div><div class="example"><h3>3. 键盘事件 (onkeyup)</h3><input type="text" id="keyInput" onkeyup="document.getElementById('keyOutput').textContent = this.value"><p>你输入的是: <span id="keyOutput"></span></p></div><div class="example"><h3>4. 表单提交事件 (onsubmit)</h3><form onsubmit="event.preventDefault(); alert('表单已提交');"><input type="text" placeholder="输入些什么..."><button type="submit">提交</button></form></div><script>function showMessage() {  alert('按钮被点击了——使用onclick属性响应!');  }         // 使用 addEventListener 添加点击事件监听器document.querySelector('button').addEventListener('click', function() {alert('按钮被点击了——使用 addEventListener方式响应!');});</script>
</body>
</html>

这个示例包含了几个常见的事件处理:

1)点击事件 (onclick):

使用内联的onclick属性和addEventListener方法两种方式演示。

2)鼠标悬停事件 (onmouseover/onmouseout):

当鼠标悬停在div上时改变背景颜色。

3)键盘事件 (onkeyup):

在输入框中输入文字时,实时显示输入的内容。

4)表单提交事件 (onsubmit):

阻止表单的默认提交行为,而是显示一个提交成功的提示。

进一步学习,可参考:

JS的事件介绍 https://blog.csdn.net/cnds123/article/details/127103830

JS捕获页面按键事件 https://blog.csdn.net/cnds123/article/details/122136978

JavaScript事件示例 https://blog.csdn.net/cnds123/article/details/120530675

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DevOps 相关知识点总结
  • 1037:计算2的幂
  • Python学习笔记51:暂停篇
  • 学生信息管理系统(Python+PySimpleGUI+MySQL)
  • 数据分析模型:洞察数据背后的奥秘
  • 秒懂Linux之gdb调试
  • Linux 进程优先级、程序地址空间、进程控制
  • 数据恢复的定制之旅:打造SQL Server的专属恢复方案
  • 如何将PyCharm 中使用 PDM 管理的 Django 项目迁移到 VS Code 并确保一切正常工作?
  • 非传统题练习(自用)
  • 界面控件DevExpress WinForms,支持HTML CSS提升用户体验(一)
  • 做 DL-FWI 研究需要哪些知识和能力
  • 超详细的 Linux Conda 环境安装教程
  • 算法通关:015:最小栈
  • 基于el-table的表格点选和框选功能
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 345-反转字符串中的元音字母
  • iOS 颜色设置看我就够了
  • JS函数式编程 数组部分风格 ES6版
  • Linux gpio口使用方法
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • VUE es6技巧写法(持续更新中~~~)
  • vuex 学习笔记 01
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 构造函数(constructor)与原型链(prototype)关系
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • Mac 上flink的安装与启动
  • Spring第一个helloWorld
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (AngularJS)Angular 控制器之间通信初探
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (分类)KNN算法- 参数调优
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)创业的注意事项
  • .gitignore文件---让git自动忽略指定文件
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Reactor简单使用教程
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @RequestMapping用法详解
  • [2023年]-hadoop面试真题(一)
  • [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测