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

纯JS如何合并两个实现网站搜索窗口关闭功能的事件监听函数

实现方案

你可以通过抽离公共逻辑或者合并判断分支的方式完成复用,两种实现如下:

方案1:抽离公共关闭逻辑(更推荐,可读性和可维护性更高)

把重复执行的关闭操作单独封装成函数,两个事件监听中各自做触发条件判断后调用即可:

// 公共关闭逻辑
const closeSearch = (event) => {
  body.classList.remove('search-opened');
  event.stopPropagation();
}

// 按ESC关闭
searchOverlay.addEventListener('keydown', function(event){
  if(event.key === "Escape") closeSearch(event);
});

// 点击区域外关闭
searchOverlay.addEventListener('click', function (e) {
  if (e.target.closest('.search-inner') === null) closeSearch(e);
});

方案2:合并为单个事件处理函数

如果要完全合并成一个函数,可以在函数内部判断事件类型走对应校验逻辑:

const handleSearchClose = (event) => {
  let isCloseTrigger = false;
  // 根据事件类型做不同判断
  switch(event.type) {
    case 'keydown':
      isCloseTrigger = event.key === "Escape";
      break;
    case 'click':
      isCloseTrigger = event.target.closest('.search-inner') === null;
      break;
  }
  if (isCloseTrigger) {
    body.classList.remove('search-opened');
    event.stopPropagation();
  }
}

// 两个事件绑定同一个处理函数
searchOverlay.addEventListener('keydown', handleSearchClose);
searchOverlay.addEventListener('click', handleSearchClose);

两种方案都可以实现逻辑复用,第一种拆分的方式后续如果要修改关闭逻辑只需要修改closeSearch一处即可,更推荐使用。

内容的提问来源于stack exchange,提问作者Лео

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:06:03