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

第三部分:进阶概念 8.事件处理 --[JavaScript 新手村:开启编程之旅的第一步]

JavaScript 事件处理是 Web 开发中不可或缺的一部分,它允许开发者响应用户的交互行为(如点击、键盘输入等)或浏览器的行为(如页面加载完成)。通过事件处理,我们可以使网页更加动态和互动。以下是关于 JavaScript 事件处理的详细介绍,包括几种添加事件监听器的方法及其特点。

事件监听器

事件监听器是 JavaScript 中用于响应用户或浏览器生成的事件(如点击、提交表单等)的关键工具。通过 addEventListener 方法,我们可以为指定的 DOM 元素添加一个或多个事件处理器。以下是两个具体的示例,展示了如何使用事件监听器来增强网页交互。

示例 1: 动态按钮点击计数器

在这个例子中,我们将创建一个简单的按钮,并使用事件监听器来跟踪按钮被点击了多少次,然后在页面上显示这个计数。

<!-- HTML -->
<button id="clickButton">Click me!</button>
<p id="clickCount">Clicked 0 times</p><script>
// 获取 DOM 元素引用
const button = document.getElementById('clickButton');
const countDisplay = document.getElementById('clickCount');let clickCount = 0;// 添加点击事件监听器
button.addEventListener('click', function() {clickCount++;countDisplay.textContent = `Clicked ${clickCount} times`;
});
</script>

在这里插入图片描述

解释

  • 我们首先获取了按钮和用于显示点击次数的 <p> 标签的引用。
  • 定义了一个变量 clickCount 来存储点击次数,并初始化为 0。
  • 使用 addEventListener 方法为按钮添加了一个点击事件监听器。每当用户点击按钮时,都会触发匿名函数,该函数会增加 clickCount 的值,并更新页面上的文本以反映新的点击次数。

示例 2: 表单验证 - 提交前检查输入有效性

此示例展示了一个表单,在提交之前使用事件监听器来验证用户是否正确填写了所有必填字段。如果存在无效输入,则阻止表单提交并给出提示信息。

<!-- HTML -->
<form id="userForm"><label for="name">Name:</label><input type="text" id="name" name="name" required><span id="nameFeedback"></span><br><label for="email">Email:</label><input type="email" id="email" name="email" required><span id="emailFeedback"></span><br><button type="submit">Submit</button>
</form><script>
document.getElementById('userForm').addEventListener('submit', function(event) {let isValid = true;// 检查姓名输入框const nameInput = document.getElementById('name');const nameFeedback = document.getElementById('nameFeedback');if (!nameInput.value.trim()) {nameFeedback.textContent = 'Name is required.';nameFeedback.style.color = 'red';isValid = false;} else {nameFeedback.textContent = '';nameFeedback.style.color = '';}// 检查电子邮件输入框const emailInput = document.getElementById('email');const emailFeedback = document.getElementById('emailFeedback');if (!emailInput.validity.valid) {if (emailInput.validity.valueMissing) {emailFeedback.textContent = 'Email is required.';} else if (emailInput.validity.typeMismatch) {emailFeedback.textContent = 'Please enter a valid email address.';}emailFeedback.style.color = 'red';isValid = false;} else {emailFeedback.textContent = '';emailFeedback.style.color = '';}// 如果有任意一项验证失败,阻止表单提交if (!isValid) {event.preventDefault(); // 阻止默认的表单提交行为}
});
</script>

在这里插入图片描述

解释

  • 我们为整个表单 (<form>) 添加了一个 submit 事件监听器。当用户尝试提交表单时,会触发处理函数。
  • 在处理函数内部,我们分别对每个输入字段进行验证,确保它们符合预期的格式和要求。
  • 对于每个输入字段,如果检测到无效输入(例如为空或格式不正确),我们会更新相应的反馈信息,并将 isValid 标志设置为 false
  • 最后,如果我们发现有任何一项验证失败,就调用 event.preventDefault() 来阻止表单的实际提交动作,直到所有输入都有效为止。

这两个示例展示了如何利用事件监听器来实现基本的交互功能,从简单的点击计数到更复杂的表单验证逻辑。通过这种方式,可以使网页更加动态且用户友好。掌握这些技巧对于构建现代 Web 应用程序非常重要。

DOM 操作基础

DOM(文档对象模型,Document Object Model)是 HTML 和 XML 文档的编程接口。它表示为一个树结构,其中每个节点都是对象,可以被 JavaScript 代码读取和操作。通过操纵 DOM,JavaScript 可以动态地改变网页的内容、结构和样式。

以下是五个关于如何使用 JavaScript 进行基本 DOM 操作的示例:

示例 1: 修改元素内容

你可以使用 innerHTMLtextContent 属性来修改或获取 HTML 元素的内容。

<!-- HTML -->
<div id="message">Hello World</div>
<button onclick="changeMessage()">Change Message</button><script>
function changeMessage() {const messageElement = document.getElementById('message');messageElement.innerHTML = 'New Message'; // 使用 innerHTML 修改 HTML 内容// 或者使用 textContent 修改纯文本内容// messageElement.textContent = 'New Message';
}
</script>

在这里插入图片描述

示例 2: 添加和移除类

使用 classList 属性可以方便地添加、移除或切换 CSS 类名。

<!-- HTML -->
<p id="text">Some text</p>
<button onclick="toggleClass()">Toggle Class</button><style>
.highlight {background-color: yellow;
}
</style><script>
function toggleClass() {const textElement = document.getElementById('text');textElement.classList.toggle('highlight'); // 切换 highlight 类
}
</script>

在这里插入图片描述

示例 3: 创建新元素并插入到 DOM 中

你可以使用 createElement 方法创建新的 DOM 节点,并使用 appendChild 将其添加到现有元素中。

<!-- HTML -->
<ul id="list"></ul>
<button onclick="addItem()">Add Item</button><script>
let itemCounter = 1;function addItem() {const listElement = document.getElementById('list');const newItem = document.createElement('li'); // 创建新 li 元素newItem.textContent = `Item ${itemCounter++}`; // 设置文本内容listElement.appendChild(newItem); // 将新元素添加到 ul 中
}
</script>

在这里插入图片描述

示例 4: 移动或删除现有元素

使用 removeChild 方法可以从 DOM 中移除子节点,或者直接调用元素的 remove() 方法来自行移除。

<!-- HTML -->
<ul id="list"><li id="item1">Item 1</li><li id="item2">Item 2</li>
</ul>
<button onclick="removeItem()">Remove Item</button><script>
function removeItem() {const listElement = document.getElementById('list');const itemToRemove = document.getElementById('item1');if (itemToRemove) {// 使用 removeChild 移除指定元素listElement.removeChild(itemToRemove);// 或者直接调用 remove 方法// itemToRemove.remove();}
}
</script>

在这里插入图片描述

示例 5: 监听事件并响应用户交互

使用 addEventListener 方法为元素绑定事件监听器,以便在特定事件发生时执行某些操作。

<!-- HTML -->
<input type="text" id="inputField" placeholder="Type something...">
<button id="submitButton">Submit</button>
<p id="output"></p><script>
const submitButton = document.getElementById('submitButton');
const outputElement = document.getElementById('output');submitButton.addEventListener('click', function(event) {event.preventDefault(); // 防止默认行为(如果需要)const inputField = document.getElementById('inputField');outputElement.textContent = `You entered: ${inputField.value}`;
});
</script>

在这里插入图片描述

总结

  • 修改元素内容:使用 innerHTMLtextContent 来更新元素的内容。
  • 添加和移除类:利用 classList 属性方便地管理 CSS 类。
  • 创建新元素并插入到 DOM 中:通过 createElementappendChild 方法动态生成和添加元素。
  • 移动或删除现有元素:使用 removeChildremove() 方法来管理和清理 DOM 结构。
  • 监听事件并响应用户交互:通过 addEventListener 绑定事件处理器,实现交互式功能。

这些基础的 DOM 操作技巧是构建动态 Web 应用程序的关键部分。掌握它们可以帮助你更有效地控制页面的行为和外观。

响应用户交互

为了让网页更加互动和动态,JavaScript 可以用来响应用户的操作。下面提供两个具体的例子,展示如何通过 JavaScript 来增强用户体验。

示例 1: 实时搜索过滤器

在这个例子中,我们将创建一个简单的列表,并允许用户通过输入框实时过滤列表项。每当用户在输入框中键入内容时,列表会根据输入自动更新,只显示匹配的项。

<!-- HTML -->
<h2>Search Users</h2>
<input type="text" id="searchInput" placeholder="Type to filter...">
<ul id="userList"><li>John Doe</li><li>Jane Smith</li><li>Emily Johnson</li><li>Michael Brown</li><li>Sarah Williams</li>
</ul><script>
// 获取 DOM 元素引用
const searchInput = document.getElementById('searchInput');
const userList = document.getElementById('userList').children;// 添加输入事件监听器
searchInput.addEventListener('input', function() {const filter = this.value.toLowerCase();// 遍历所有用户列表项并根据输入进行过滤for (let i = 0; i < userList.length; i++) {const listItem = userList[i];const text = listItem.textContent || listItem.innerText;if (text.toLowerCase().indexOf(filter) > -1) {listItem.style.display = ''; // 显示匹配项} else {listItem.style.display = 'none'; // 隐藏不匹配项}}
});
</script>

在这里插入图片描述

解释**:

  • 我们首先获取了输入框 (<input>) 和包含用户列表项 (<ul> 内的所有 <li>) 的引用。
  • 使用 addEventListener 方法为输入框添加了一个 input 事件监听器。每当用户在输入框中键入或删除字符时都会触发该处理函数。
  • 在处理函数内部,我们获取当前输入值(忽略大小写),然后遍历所有用户列表项,检查它们的内容是否包含输入字符串。如果包含,则保持显示;如果不包含,则隐藏该项。

示例 2: 拖放图片上传

此示例展示了如何使用拖放功能让用户更方便地上传图片文件。当用户将图片文件拖放到指定区域时,可以自动预览图片并在表单中提交。

<!-- HTML -->
<div id="dropZone" ondragover="return false" ondrop="handleDrop(event)"><p>Drag & Drop images here or click to select files</p><input type="file" id="fileInput" multiple accept="image/*" style="display:none;">
</div>
<div id="preview"></div><style>
#dropZone {border: 2px dashed #ccc;padding: 20px;text-align: center;
}
#dropZone:hover {background-color: #f9f9f9;
}
</style><script>
// 获取 DOM 元素引用
const dropZone = document.getElementById('dropZone');
const fileInput = document.getElementById('fileInput');
const preview = document.getElementById('preview');// 当用户点击拖放区时打开文件选择对话框
dropZone.addEventListener('click', () => fileInput.click());// 处理文件拖放事件
function handleDrop(event) {event.preventDefault();const files = event.dataTransfer.files;showFilePreviews(files);
}// 文件选择输入框变化时也调用预览函数
fileInput.addEventListener('change', () => showFilePreviews(fileInput.files));// 显示文件预览
function showFilePreviews(files) {preview.innerHTML = ''; // 清除之前的预览for (let i = 0; i < files.length; i++) {const file = files[i];if (file.type.startsWith('image/')) {const img = document.createElement('img');img.src = URL.createObjectURL(file);img.style.maxWidth = '100px';img.style.margin = '5px';preview.appendChild(img);}}
}
</script>

在这里插入图片描述

解释:

  • 我们定义了一个可拖放的区域 (<div id="dropZone">),并通过设置 ondragoverondrop 属性来防止默认行为(如文本选择)。
  • 当用户将文件拖放到区域内时,handleDrop 函数会被调用,它阻止默认行为,并从 event.dataTransfer.files 中获取文件列表。
  • 同样地,我们也为文件选择输入框 (<input type="file">) 添加了 change 事件监听器,以便在用户通过点击选择文件时也能触发预览逻辑。
  • showFilePreviews 函数负责创建图片元素并将它们添加到页面上的预览区域 (<div id="preview">) 中。对于每个选定的文件,如果它是图像类型,就生成一个新的 <img> 标签,并使用 URL.createObjectURL 方法为其设置源路径,从而实现即时预览。

这两个示例展示了如何利用 JavaScript 来响应用户交互,提供更加直观和便捷的功能。无论是实现实时搜索还是简化文件上传流程,这些技术都能显著提升用户体验。掌握这些技巧对于构建现代 Web 应用程序至关重要。

相关文章:

第三部分:进阶概念 8.事件处理 --[JavaScript 新手村:开启编程之旅的第一步]

JavaScript 事件处理是 Web 开发中不可或缺的一部分&#xff0c;它允许开发者响应用户的交互行为&#xff08;如点击、键盘输入等&#xff09;或浏览器的行为&#xff08;如页面加载完成&#xff09;。通过事件处理&#xff0c;我们可以使网页更加动态和互动。以下是关于 JavaS…...

工具推荐-js爬取工具

现在测试方向都偏向于从js中的接口来入手找到可以进的点&#xff0c;关于快速扫描js文件来发现敏感接口的工具有很多&#xff0c;下面的jjjjs就是其一 项目地址: GitHub - ttstormxx/jjjjjjjjjjjjjs: 爬网站JS文件&#xff0c;自动fuzz api接口&#xff0c;指定api接口&#x…...

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…...

ejb组件(rmi) webservice平台(xml)

springboot bean 在 Spring Boot 中&#xff0c;Bean 是 Spring 框架的核心概念之一&#xff0c;表示由 Spring 容器管理的对象。通过 Bean 或其他注解&#xff08;如 Component、Service、Repository 等&#xff09;来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…...

【jvm】垃圾回收的重点区域

目录 1. 说明2. 堆&#xff08;Heap&#xff09;3. 方法区&#xff08;Method Area&#xff09; 1. 说明 1.JVM&#xff08;Java Virtual Machine&#xff09;垃圾回收的重点区域主要集中在堆&#xff08;Heap&#xff09;和方法区&#xff08;Method Area&#xff09;。2.堆是…...

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…...

谈谈web3

全面解析 Web3&#xff1a;未来互联网的革命性进程 引言&#xff1a;互联网进化的三部曲 互联网的发展经历了三个重要阶段&#xff0c;每一个阶段都深刻地改变了我们的生活方式&#xff1a; Web1&#xff08;1990-2005&#xff09;&#xff1a;静态互联网时代&#xff0c;人…...

正则表达式实战例子

正则表达式实战例子 1. 验证电子邮件地址 定义一个合理的电子邮件格式&#xff0c;并检查给定的字符串是否符合这个模式。 import redef is_valid_email(email):# 定义电子邮件格式的正则表达式pattern r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$return bool(re.match(…...

Hadoop不同版本的区别

免费springboot&#xff0c;vue&#xff0c;springcloudalibaba视频&#xff0c;有兴趣可以看看 <!-- springboot&#xff0c;springboot整合redis&#xff0c;整合rocketmq视频&#xff1a; --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...

QtCreator UI界面 菜单栏无法输入中文

如下图红色所示的区域&#xff0c;直接输入是无法输入中文的&#xff1a; 解决方法&#xff1a;在右边的属性值里输入即可 也可以参考这位同学的解决方法&#xff1a;友情链接...

java switch及其新特性

switch是什么 在Java中&#xff0c;switch语句是一种多分支选择结构&#xff0c;它允许程序根据一个表达式的值从多个代码块中选择执行哪一个。switch语句通常比多个if-else语句更清晰、更易读。 Java switch语句的基本语法&#xff1a; switch (expression) {case value1:/…...

E卷-货币单位换算(100分)

货币单位换算 问题描述 在一个多国货币记账本中,记录了若干条不同货币的金额。现在需要将这些金额全部转换成人民币分(fen),并进行汇总。每条记录可能包含单独的元、单独的分,或者元与分的组合。转换时,需要考虑不同货币之间的汇率关系。 要求将这些货币全部换算成人民…...

什么是MMD Maximum Mean Discrepancy 最大均值差异?

9多次在迁移学习看到了&#xff0c;居然还是Bernhard Schlkopf大佬的论文&#xff0c;仔细看看。 一.什么是MMD&#xff1f; 1. MMD要做什么&#xff1f; 判断两个样本&#xff08;族&#xff09;是不是来自于同一分布 2.怎么做&#xff1f;&#xff08;直观上&#xff09;…...

沐风老师3DMAX摄相机阵列插件使用方法

3DMAX摄相机阵列插件&#xff0c;从网格对象或样条线的顶点法线快速创建摄相机阵列。该插件从网格的顶点或样条线的节点获取每个摄影机的位置和方向。 3DMAX摄相机阵列插件支持目前3dMax主流的物理相机、标准相机、VRay物理相机。 【版本要求】 3dMax 2015及更高版本 【安装方…...

Java Web 开发学习中:过滤器与 Ajax 异步请求

一、过滤器 Filter&#xff1a; 过滤器的概念与用途 在一个庞大的 Web 应用中&#xff0c;有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫&#xff0c;站在资源的入口处&#xff0c;根据预先设定的规则&#xff0c;决定哪些请求可以顺利访问资源&…...

数据结构 (36)各种排序方法的综合比较

一、常见排序方法分类 插入排序类 直接插入排序&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。希尔排序&#xff1a;是插入排序的一种改进版本&#xff0c;先将整个待排序的记录序列分割成为…...

使用vue搭建不需要打包的前端项目

需求详情&#xff1a;用户不要项目进行打包&#xff0c;开发还是选用vue2,且需要便于上手 项目目录 >api 存放api.js&#xff0c;主要是前端用到的接口 >css >>>fonts 存放页面需要的字体文件 >>>1.css 存放所有css文件 >data 存放echarts…...

发布订阅者=>fiber=>虚拟dom

文章目录 vue的响应式原理-发布订阅者模式vue3 响应式原理及优化fiberfiber 与 虚拟dom vue的响应式原理-发布订阅者模式 Vue响应式原理概述 Vue.js的响应式原理是其核心特性之一。它使得当数据发生变化时&#xff0c;与之绑定的DOM元素能够自动更新。其主要基于数据劫持和发布…...

Python-计算机中的码制以及基础运算符(用于分析内存)

记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 python基础2-码制 计算机中的码制原码&#xff08;True Form&#xff09;反码&#xff08;Ones Complement&#xff09…...

yum 离线软件安装

适用范围 支持YUM软件管理的操作系统&#xff1a; 银河麒麟 服务器操作系统V10统信服务器操作系统V20CentOS 系列 准备 准备一台可以连接互联网并且与离线安装的操作系统相同版本的操作系统&#xff0c;包括指令集类型相同。 安装下载工具 查询是否已经安装下载工具 yum…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...