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

如何避免重复代码,简化点击事件中的DOM类操作?

实现DRY的导航类操作方案

这问题太常见啦!你说得对,两段代码核心逻辑完全一致,只是调用的类操作方法不同——一个是toggle,一个是remove,完全可以把重复的逻辑抽出来,用DRY原则让代码更简洁好维护。

具体实现步骤:

  1. 先把需要操作的元素和对应的类名整理成一个配置数组,后续要新增/修改元素或类时,只需要改这里就行:
// 定义需要操作的元素与对应类名的映射
const navClassTargets = [
  { element: body, classNames: ['nav-body-is-open', 'bg-overlay'] },
  { element: navigationHamburger, classNames: ['active'] },
  { element: navigationMenu, classNames: ['nav--open'] }
];
  1. 写一个通用的工具函数,接受操作类型(toggle/remove),批量处理所有元素的类:
// 通用导航类操作函数
const handleNavClasses = (action) => {
  navClassTargets.forEach(({ element, classNames }) => {
    classNames.forEach(cls => element.classList[action](cls));
  });
};
  1. 改造原来的两个事件监听器,直接调用这个通用函数就行:
const onNavOpen = e => {
  e.preventDefault();
  handleNavClasses('toggle');
};

const onNavClose = e => {
  e.preventDefault();
  if (body.classList.contains('nav-body-is-open') && e.keyCode === 27) {
    handleNavClasses('remove');
  }
};

为什么这个方案更好?

  • 完全符合DRY原则:把重复的类操作逻辑集中到一个函数里,再也不用在两个地方写几乎一样的代码
  • 可维护性拉满:以后如果要新增一个需要同步操作的元素/类,或者修改现有类名,只需要更新navClassTargets数组,不用动事件处理函数
  • 代码更简洁清晰:事件函数只保留核心逻辑(阻止默认行为、判断关闭条件),类操作的细节都封装到工具函数里,可读性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:50