You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简带有编号ID/类名的JavaScript重复代码?

问题描述

我的代码功能正常,但每次新增列表项时都必须添加对应编号的函数,这让我觉得十分繁琐。我想知道是否有JavaScript技巧可以替代这种重复编写代码的方式,以下是两段示例代码:

第一段示例代码

$(document).ready(function () {

    $(".btn-slide_1").click(function () {
        $("#panel_1").animate({
            width: 'toggle'
        });
        $(this).toggleClass("active");
        return false;
    });

    $(".btn-slide_2").click(function () {
        $("#panel_2").animate({
            width: 'toggle'
        });
        $(this).toggleClass("active");
        return false;
    });

    $(".btn-slide_3").click(function () {
        $("#panel_3").animate({
            width: 'toggle'
        });
        $(this).toggleClass("active");
        return false;
    });
    // ... 此处省略编号4到18的重复代码
    $(".btn-slide_18").click(function () {
        $("#panel_18").animate({
            width: 'toggle'
        });
        $(this).toggleClass("active");
        return false;
    });

});

第二段示例代码

var isAboutToggled = false;


$(document).ready(function () {

    $(".btn-slide-1").click(function () {
        $("#panel-1").animate({
            width: 'toggle'
        });
        $(this).toggleClass("active");
        return false;
    });
});

$(document).ready(function () {
    $(".btn-slide-2").click(function () {
        $("#panel-2").animate({
            width: 'toggle'
        });
        $(this).toggleClass("active");
        return false;
    });
});

// ... 此处省略编号3到18的按钮点击代码

$(document).ready(function () {
    $("#panel-1").click(function () {
        $("#panel-1").animate({
            width: 'toggle'
        });
    });
});

$(document).ready(function () {
    $(this).toggleClass("hide");
    return false;
});

// ... 此处省略编号4到18的面板点击及toggleClass代码

$(document).ready(function () {
    $("#panel-18").click(function () {
        $("#panel-18").animate({
            width: 'toggle'
        });
    });
});

$(document).ready(function () {
    $(this).toggleClass("hide");
    return false;
});
优化方案

1. 用数据属性关联元素,消除编号依赖

修改HTML结构,给所有按钮加通用类btn-slide,通过data-panel属性绑定对应面板的ID;给所有面板加通用类slide-panel:

<button class="btn-slide" data-panel="#panel-1">切换面板1</button>
<div id="panel-1" class="slide-panel">面板1内容</div>

<button class="btn-slide" data-panel="#panel-2">切换面板2</button>
<div id="panel-2" class="slide-panel">面板2内容</div>

2. 统一事件处理逻辑

只需要写一次事件绑定,就能覆盖所有按钮和面板的交互:

$(document).ready(function() {
    // 按钮点击切换面板
    $(".btn-slide").click(function(e) {
        e.preventDefault();
        const targetPanel = $(this).data("panel");
        $(targetPanel).animate({ width: "toggle" });
        $(this).toggleClass("active");
    });

    // 面板自身点击切换
    $(".slide-panel").click(function() {
        $(this).animate({ width: "toggle" });
        // 同步对应按钮的激活状态
        const relatedBtn = $(`.btn-slide[data-panel="#${this.id}"]`);
        if (relatedBtn.length) relatedBtn.toggleClass("active");
    });
});

3. 清理无效代码

第二段代码中单独的$(document).ready(function(){ $(this).toggleClass("hide"); return false; });完全无效(this指向document,没有实际意义),直接删除即可。如果需要给面板添加hide类,可在初始化或切换逻辑中统一处理。

最终效果

新增面板时,只需要添加对应的按钮和面板HTML,无需修改JavaScript代码,彻底解决重复编写函数的问题。

内容的提问来源于stack exchange,提问作者ambaamba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:10:34