新闻中心

jQuery 代码重构:通过函数避免重复指令以优化动态 UI 更新

2025-10-14
浏览次数:
返回列表

jquery 代码重构:通过函数避免重复指令以优化动态 ui 更新

本文将指导读者如何通过封装函数来优化重复的 jQuery 代码,特别是在处理页面加载和用户交互时动态更新 UI 的场景。我们将以一个根据下拉菜单选择项显示不同提示信息的实例为例,详细解析如何将重复的逻辑提取为可重用的函数,从而提高代码的可读性、可维护性,并避免常见的语法错误。

在前端开发中,我们经常需要根据用户的操作或页面状态动态地更新用户界面(UI)。一个常见的场景是,当页面加载时需要检查某个初始状态,并且在用户后续与该元素交互时(例如,改变下拉菜单的选项)再次执行相同的逻辑。这种模式很容易导致代码重复,降低代码的可维护性和可读性。本教程将通过一个具体的 jQuery 示例,演示如何有效地避免这种重复。

识别重复代码问题

假设我们有一个下拉菜单,根据其选中的值,需要显示不同的提示信息(tooltip)。初始的实现可能如下所示,它在页面加载时检查一次,并在下拉菜单值改变时再次执行相同的逻辑:

$(document).ready(function(){
    var service = "";
    var otherservice = "";
    var selectId = 'select#989022_58716pi_989022_58716'; // 优化选择器重复

    // 页面加载时检查下拉菜单值
    service = '.v' + $(selectId + ' option:selected').val();
    otherservice = '#form-tooltips div:not('+service+')';
    $('#form-tooltips div'+service).show();
    $(otherservice).hide();

    // 下拉菜单值改变时再次检查
    $(selectId).on('change', function(){
        service = '.v' + $(selectId + ' option:selected').val();
        otherservice = '#form-tooltips div:not('+service+')';
        $('#form-tooltips div'+service).show();
        $(otherservice).hide();
    });
});

// 提示信息的HTML结构,通常在页面其他地方或通过JS动态生成
$("<div id='form-tooltips'><div class='v1381962'>Tooltip 1</div><div class='v1381965'>Tooltip 2</div></div>").insertAfter(".add-tooltip-after");

在这段代码中,显示和隐藏提示信息的逻辑在 $(document).ready() 块中和 on('change') 事件处理器中重复出现了。这种重复不仅增加了代码量,而且一旦需要修改提示逻辑,就必须在多个地方进行同步更新,容易出错。

解决方案:封装为可重用函数

为了避免代码重复,我们可以将这部分逻辑封装到一个独立的函数中。这样,无论是在页面加载时还是在事件触发时,我们都可以简单地调用这个函数。

错误的尝试及原因分析

在尝试封装函数时,初学者可能会遇到语法错误。例如,以下尝试是错误的:

$(document).ready(function(){
    var service = '';
    var otherservice = '';
    // 错误的函数定义语法
    function checkTooltip({ // 错误:函数定义不应使用对象解构语法,且缺少函数体的大括号
        service = '.v' + $('select#989022_58716pi_989022_58716 option:selected').val();
        otherservice = '#form-tooltips div:not("+service+")';
        $('#form-tooltips div'+service).show();
        $(otherservice).hide();
    }); // 错误:函数定义后不应有分号
    checkTooltip();
    // 错误的事件绑定:checkTooltip() 会立即执行并将其返回值(undefined)作为事件处理器
    $('select#989022_58716pi_989022_58716').on('change', checkTooltip());
});

上述代码中的主要问题在于函数定义的语法不正确,以及事件处理器绑定时对函数的调用方式不当。J*aScript 函数定义通常使用 function name() { ... } 或箭头函数 const name = () => { ... } 形式。此外,在事件绑定时,我们应该传递函数本身的引用,而不是调用函数的返回值。

正确的函数封装与应用

以下是正确的函数封装和应用方式:

MarsCode MarsCode

字节跳动旗下的免费AI编程工具

MarsCode 339 查看详情 MarsCode
$(document).ready(function(){
    // 建议使用 let 或 const 替代 var
    let service = '';
    let otherservice = '';
    const selectId = 'select#989022_58716pi_989022_58716'; // 缓存选择器

    // 定义一个函数来处理提示信息的显示/隐藏逻辑
    const checkTooltip = () => {
        // 获取当前选中项的值,并构建选择器
        service = '.v' + $(selectId + ' option:selected').val();
        // 构建要隐藏的其他提示信息的选择器
        otherservice = '#form-tooltips div:not(' + service + ')';

        // 显示与选中值对应的提示信息
        $('#form-tooltips div' + service).show();
        // 隐藏所有其他提示信息
        $(otherservice).hide();
    };

    // 页面加载时立即执行一次,以处理初始状态(如页面刷新后值仍存在)
    checkTooltip();

    // 绑定 change 事件,当下拉菜单值改变时调用 checkTooltip 函数
    // 注意:这里是传递函数引用 checkTooltip,而不是执行函数 checkTooltip()
    $(selectId).on('change', checkTooltip);
});

// 提示信息的HTML结构,通常在页面其他地方或通过JS动态生成
$("<div id='form-tooltips'><div class='v1381962'>Tooltip 1</div><div class='v1381965'>Tooltip 2</div></div>").insertAfter(".add-tooltip-after");

代码解析与注意事项

  1. 函数定义 (const checkTooltip = () => { ... }):

    • 我们使用 ES6 的箭头函数语法定义了 checkTooltip 函数。这是一种简洁的函数定义方式,也可以使用传统的 function checkTooltip() { ... } 语法。
    • 函数体内包含了所有与显示/隐藏提示信息相关的逻辑。
  2. 变量声明 (let service = '';):

    • 推荐使用 let 或 const 替代 var 进行变量声明。let 允许变量在块级作用域内重新赋值,而 const 用于声明常量(不可重新赋值)。这有助于避免变量污染和意外的副作用。
  3. 缓存选择器 (const selectId = 'select#989022_58716pi_989022_58716';):

    • 将重复使用的选择器字符串存储在一个常量中,可以提高代码的可读性,并便于后续修改。
  4. 初始调用 (checkTooltip();):

    • 在 $(document).ready() 内部直接调用 checkTooltip(),确保页面加载时根据当前下拉菜单的选中值显示正确的提示信息。这对于处理页面因表单提交错误而刷新,但下拉菜单值仍保持不变的情况非常重要。
  5. 事件绑定 ($(selectId).on('change', checkTooltip);):

    • 这是关键点之一。在 on() 方法中,我们将 checkTooltip 函数本身作为第二个参数传递,而不是调用它(即 checkTooltip())。
    • 当 change 事件发生时,jQuery 会自动调用 checkTooltip 函数。如果写成 checkTooltip(),那么函数会在事件绑定时立即执行,并将函数的返回值(通常是 undefined)作为事件处理器,导致事件无法正常触发。
  6. 选择器优化建议:

    • 原始的选择器 select#989022_58716pi_989022_58716 包含了一长串数字和下划线,可读性较差。在实际项目中,建议使用更具语义化和人类可读性的 ID 或类名,例如 select#service-selector。这会使代码更容易理解和维护。

总结

通过将重复的逻辑封装到函数中,我们成功地将 jQuery 代码从重复模式转变为更简洁、更易于维护的结构。这种重构不仅减少了代码量,还提高了代码的可读性,并使得未来的功能扩展或修改变得更加简单。在编写 J*aScript 和 jQuery 代码时,始终寻找机会将重复的逻辑提取为可重用的函数,是提高代码质量的关键实践之一。

以上就是jQuery 代码重构:通过函数避免重复指令以优化动态 UI 更新的详细内容,更多请关注其它相关文章!


# es6  # 开封网络营销sem推广有前景吗  # 什么样的网站容易优化  # 汕头外贸社交媒体推广营销指南  # 马鞍山和县企业营销推广  # 莆田网站建设推广多少钱  # 戴尔公司网站优化  # 而不是  # 返回值  # 绑定  # 有什么  # 表单  # 是在  # 重构  # 选择器  # javascript  # java  # jquery  # html  # js  # 前端  # 处理器  # 前端开发  # 作用域  # 表单提交  # 提示信息  # 加载  # 江门网站优化推广哪家快  # 抖音seo投放服务  # 阜阳网站优化单位有哪些  # 网站优化错误代码大全 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: PHP 枚举:根据字符串获取枚举案例的策略与实现  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  Django表单验证失败时保留用户输入数据的最佳实践  CSS布局中意外空白:解决padding-top导致的顶部间距问题  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  Pandas DataFrame 多条件优先级排序与排名  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  如何在 Windows 11 中启动游戏手柄设置  J*aScript打印功能_j*ascript输出控制  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  iwriter统一登录平台 iwrite账号密码登录页面  Typer应用中灵活处理命令行参数的令牌化与解析  J*aScript中赋值与自增运算符的复杂交互与执行机制  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  《刺客信条:影》PS5 Pro和Switch 2画面对比  J*aScript中正确使用querySelectorAll与复杂CSS选择器  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  微信聊天记录怎么加密_微信聊天记录加密方法  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  J*aScript数组对象转换:按指定键分组与值收集  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  Excel文件在线转换快速入口 Excel在线格式转换网站  Centos/Linux 系统下安装 composer 的完整步骤  优化Log4j2控制台输出性能:解决异步日志瓶颈  必由学官网快捷入口 必由学网页版在线学习平台  小米汽车11月交付量突破40000台!雷军:将继续努力  抖音极速版最新版本 抖音极速版官方下载地址  高德地图怎么看全景照片_高德地图全景照片浏览教程  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  韩剧圈正版入口页面_韩剧圈官网登录链接  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  在Qt QML中通过Python字典动态更新TextEdit内容的教程  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  Golang如何使用context实现超时取消_Golang context超时取消模式实践  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  AO3中文官网链接_AO3网页版稳定镜像站  steam官方入口大全 steam账号注册及操作指南  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  汽车之家官方网站官网入口_汽车之家网页版直接进入  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  顺丰快递查单号物流信息 顺丰快递小程序查询入口 

搜索