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

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...