当前位置: 首页 > 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…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...