新闻中心
J*aScript代码重构:优化重复逻辑与提升可维护性

本文旨在探讨如何通过数据驱动、事件委托和函数封装等策略,对前端j*ascript代码中重复的ui交互逻辑进行重构。通过将元素配置数据化,并利用事件委托机制集中处理事件,结合一系列通用辅助函数,可以显著减少代码量,提高代码的可读性、可维护性和可扩展性,从而构建更健壮、更易于管理的前端应用。
在前端开发中,我们经常会遇到需要处理多个相似UI元素交互逻辑的场景。例如,页面上有多个输入框和对应的提交按钮,每个按钮点击后都需要根据输入框的值执行相似的校验和UI更新操作。如果为每个元素都编写独立的事件监听器和处理逻辑,代码将变得冗余、难以维护,并且在需求变更或元素增多时,修改成本会急剧上升。
问题分析:重复代码的挑战
考虑以下初始代码示例,它展示了为两个独立的输入框和按钮对编写的重复逻辑:
const an1 = document.getElementById("an1");
const bt1 = document.getElementById("bt1");
bt1.addEventListener("click", () => {
if (an1.value.toLowerCase() === "test") {
document.getElementById("bt1").style.display = "none";
document.getElementById("an1").style.display = "none";
document.getElementById("wo1").style.display = "initial";
} else {
bt1.innerText = "Wrong!";
document.getElementById("bt1").style.background = "red";
}
});
const an2 = document.getElementById("an2");
const bt2 = document.getElementById("bt2");
bt2.addEventListener("click", () => {
if (an2.value.toLowerCase() === "test1") {
document.getElementById("bt2").style.display = "none";
document.getElementById("an2").style.display = "none";
document.getElementById("wo2").style.display = "initial";
} else {
bt2.innerText = "Wrong!";
document.getElementById("bt2").style.background = "red";
}
});以及对应的HTML结构:
<tr> <td class="c1"><input id="an1" placeholder="test" type="text" onblur="this.value=removeSpaces(this.value);" /><a id="wo1" style="display: none;">test</a><button id="bt1">Submit</button></td> <td class="c1">test</td> </tr> <tr> <td class="c2"><input id="an2" placeholder="test1" type="text" onblur="this.value=removeSpaces(this.value);" /><a id="wo2" style="display: none;">test1</a><button id="bt2">Submit</button></td> <td class="c2">test1</td> </tr>
这段代码的问题显而易见:
- 代码重复:bt1 和 bt2 的点击事件处理逻辑高度相似,仅在元素ID和预期值上有所不同。
- 可维护性差:如果需要修改校验逻辑或UI更新方式,必须在多处进行修改。
- 可扩展性差:当页面上出现更多的 anX/btX 组合时,需要复制粘贴大量代码,导致文件膨胀。
重构策略:数据驱动与事件委托
为了解决上述问题,我们可以采用以下核心重构策略:
- 数据结构化:将所有与UI元素及其行为相关的信息(如ID、预期值、显示状态等)存储在易于管理的数据结构中,例如数组或对象。
- 事件委托:利用事件冒泡机制,在父元素上设置一个事件监听器,而不是为每个子元素单独设置,从而集中管理事件。
- 函数封装:将通用的DOM操作和逻辑判断封装成独立的辅助函数,提高代码的复用性。
1. 数据结构化:配置化管理UI元素
首先,我们将每个输入框的预期答案和每个按钮点击后需要改变显示状态的元素及其目标状态,分别定义为数组对象。
const expectedElementAnswer = [
{ id: 'an1', expectAns: 'test' },
{ id: 'an2', expectAns: 'test1' }
];
const btnElementList = [
[{ id: 'bt1', displayValue: 'none' }, { id: 'an1', displayValue: 'none' }, { id: 'wo1', displayValue: 'initial' }],
[{ id: 'bt2', displayValue: 'none' }, { id: 'an2', displayValue: 'none' }, { id: 'wo2', displayValue: 'initial' }]
];- expectedElementAnswer 数组存储了每个输入框的ID及其对应的正确答案。
- btnElementList 是一个二维数组,每个子数组对应一个按钮点击后需要操作的一组元素。每个对象包含元素的ID和其目标 display 样式值。这种配置化的方式使得添加或修改元素行为变得极其简单,只需更新这些数组即可。
2. 事件委托:简化事件处理
我们将事件监听器附加到所有相关按钮的共同父元素上(例如一个
以上就是J*aScript代码重构:优化重复逻辑与提升可维护性的详细内容,更多请关注其它相关文章!
# 多个
# 装修营销与推广技巧分析
# 团购网如何推广营销
# 网站优化费计入什么科目
# 南通网站建设路小学
# 贵州发展营销推广策划
# 上城企业网站推广
# 天津整站营销推广
# 网站优化外包找谁找
# 福田区网站优化推荐公司
# seo快排技术首选乐云seo
# 结构化
# 转换为
# 我们可以
# 只需
# 遍历
# javascript
# 复用
# 数据结构
# 输入框
# 重构
# 点击事件
# 内存占用
# 重构代码
# 代码复用
# 前端开发
# 事件冒泡
# 编码
# 处理器
# 前端
# html
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单
Promise错误处理:在catch后终止链式then执行的策略
曝R星经典之作开发图 设计简陋但信息密集!
qq游戏大厅官方下载_qq游戏免费下载安装入口
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
Golang如何使用new_Go new分配内存机制讲解
抖音网页版快捷访问 抖音网页版网页版入口操作教程
mysql备份恢复性能优化_mysql备份恢复性能优化方法
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
极兔快递快件信息查询系统 极兔快递官网运单号追踪
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
React/Next.js中实现列表项的动态选择与移动
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
支付宝如何设置安全保护_支付宝安全设置的全面教程
零跑汽车11月交付量达70327台 实现连续9个月正增长
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
J*aScript中赋值与自增运算符的复杂交互与执行机制
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
在VS Code中配置和运行Dart程序的完整步骤
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
如何在CSS中使用浮动制作导航栏_float实现水平菜单
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
深入理解J*a链表中的IPosition接口与使用
高德地图怎么看全景照片_高德地图全景照片浏览教程
百度网盘网页版入口 百度网盘网页版官方登录网址
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
不同用户不同价格! 索尼开启账户个性化定价测试
C++如何生成随机数_C++ random库使用方法与范围设置
Python模块化编程:有效管理依赖与避免循环引用
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
ACG动漫视频网入口 ACG动漫*免费正版观看地址
Mac怎么使用表情符号_Mac Emoji快捷键面板
可靠CSGO开箱平台解析 CSGO开箱网合集
vivo云服务网页版登录 怎么登录vivo云服务网页版
Tabulator表格日期时间排序问题及自定义解决方案
Python字典中优雅地迭代剩余元素的方法
J*aScript中管理异步API调用:确保操作顺序与数据一致性
age动漫网站入口 age动漫官网直接访问入口


2025-11-25
浏览次数:次
返回列表
NopCommerce 基于ASP.NET4.0
elow arrays if you need this functionality for more fields
const expectedElementAnswer = [{ id: 'an1', expectAns: 'test' }, { id: 'an2', expectAns: 'test1' }];
const btnElementList = [
[{ id: 'bt1', displayValue: 'none' },{ id: 'an1', displayValue: 'none' }, { id: 'wo1', displayValue: 'initial' }],
[{ id: 'bt2', displayValue: 'none' }, { id: 'an2', displayValue: 'none' }, { id: 'wo2', displayValue: 'initial' }]
];
document.getElementById('myTable').addEventListener('click', (event) => {
const curElemetId = event.target.id;
// 这里的逻辑可以进一步优化,例如使用数据驱动的查找,而非硬编码的if-else if
const btnIndex = (curElemetId === 'bt1') ? 1 : (curElemetId === 'bt2') ? 2 : -1;
if ((btnIndex === 1) || (btnIndex === 2)) {
const idx = btnIndex - 1;
const { id, expectAns } = expectedElementAnswer[idx];
if (getElementValue(id).toLowerCase() === expectAns) {
changeDisplayStyles(idx);
} else {
setErrorWarning(curElemetId);
}
}
});
function changeDisplayStyles(idx) {
btnElementList[idx].forEach(({ id, displayValue }) => {
setDisplayStyle(id, displayValue)
});
}
function setDisplayStyle(displayId, value) {
document.getElementById(displayId).style.display = value;
}
function setErrorWarning(displayId, bgColor = 'red') {
const element = document.getElementById(displayId);
element.innerText = 'Wrong!';
element.style.background = bgColor;
}
function getElementValue(id) {
const value = document.getElementById(id)?.value || '';
return value;
}