百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

JavaScript棘手代码(三)(js代码手册)

yund56 2025-07-23 21:41 4 浏览

问题:嵌套盒子的事件处理

我们有3个嵌套的盒子(box1、box2、box3)。当点击每个盒子时,将其ID记录到控制台。点击内部盒子时,不应该触发外部盒子的点击事件。

这个问题是关于什么?
这个问题是关于JavaScript中的事件处理和事件传播,特别是如何控制嵌套HTML元素的点击事件流。

核心问题是如何防止点击内部元素时也触发其父(外部)元素的点击事件。这是Web开发中的一个常见场景,你希望特定操作只在点击特定元素时发生,而不是其容器。

解决方案:有很多方法可以实现,但更优化的方式是将所有div包装在一个id为container父div中。

然后在父元素上添加事件监听器。


完整代码实现

HTML文件

<div id="container">
    <div id="box1" class="box">
      box1
      <div id="box2" class="box">
         box2
         <div id="box3" class="box">box3</div>
      </div>
    </div>
</div>

CSS文件

.box {
  min-width: 200px;
  width: fit-content; /* 匹配div内容宽度 */
  border: 1px solid #000;
  padding: 15px;
}

#box1 {
  background-color: yellow;
  padding: 10px;
}
#box2 {
  background-color: cyan;
  padding: 10px;
}
#box3 {
  background-color: red;
}

JavaScript文件

document.getElementById('container').addEventListener('click', event => {
  // 当点击容器元素或其任何子元素时执行
  if (event.target.classList.contains('box')) {
    /* 检查点击是否只发生在具有box类的元素上,因为我们不需要处理容器的其他子元素的点击,除了box。*/

    console.log('id is: ', event.target.id);
    event.stopPropagation(); // 防止事件在点击子元素时传播到父元素
  }
})

关键概念解释

1. 事件委托(Event Delegation)

o 在父元素上监听事件,而不是在每个子元素上

o 利用事件冒泡机制

o 减少事件监听器数量,提高性能

2. event.target

o 指向实际被点击的元素

o 不是事件监听器绑定的元素

o 用于确定具体是哪个子元素被点击

3. event.stopPropagation()

o 阻止事件继续冒泡到父元素

o 防止触发父元素的事件处理器

o 确保只有被点击的元素响应事件

4. classList.contains()

o 检查元素是否包含特定CSS类

o 用于过滤需要处理的元素

o 提供灵活的事件处理条件


性能优化考虑

重要提示:正如我之前所说,有很多方法可以解决这个问题,我们也可以为每个单独的div添加事件监听器,因为现在只有3个div,但如果数量更多,我们就需要循环等。

所以为了避免循环,我们选择了父元素。我们也可以选择<body>作为父元素,但那样脚本会搜索更大范围的代码,会耗时。因此我们将事件监听器的范围缩小到一个小的区域,即id为container的div


替代解决方案

方案1:为每个盒子单独添加事件监听器

document.getElementById('box1').addEventListener('click', (event) => {
  console.log('id is: box1');
  event.stopPropagation();
});

document.getElementById('box2').addEventListener('click', (event) => {
  console.log('id is: box2');
  event.stopPropagation();
});

document.getElementById('box3').addEventListener('click', (event) => {
  console.log('id is: box3');
  event.stopPropagation();
});

方案2:使用事件捕获

document.getElementById('container').addEventListener('click', event => {
  if (event.target.classList.contains('box')) {
    console.log('id is: ', event.target.id);
  }
}, true); // 第三个参数true启用捕获模式

方案3:使用事件委托的现代方法

document.getElementById('container').addEventListener('click', event => {
  const box = event.target.closest('.box');
  if (box) {
    console.log('id is: ', box.id);
    event.stopPropagation();
  }
});

实际应用场景

1. 导航菜单:处理嵌套菜单项的点击

2. 表单组件:处理复杂表单中的交互

3. 卡片布局:处理卡片内部的按钮点击

4. 模态框:处理模态框内容的交互

5. 拖拽组件:处理拖拽区域内的元素


最佳实践

1. 使用事件委托:减少事件监听器数量

2. 合理的作用域:选择合适的事件监听器绑定元素

3. 性能考虑:避免在大量元素上绑定事件

4. 代码可维护性:使用类名或数据属性进行过滤

5. 浏览器兼容性:考虑不同浏览器的事件处理差异


调试技巧

// 添加调试信息
document.getElementById('container').addEventListener('click', event => {
  console.log('Event target:', event.target);
  console.log('Current target:', event.currentTarget);
  console.log('Event phase:', event.eventPhase);
  
  if (event.target.classList.contains('box')) {
    console.log('Box clicked:', event.target.id);
    event.stopPropagation();
  }
});

更多JavaScript面试相关代码请访问:

o JavaScript棘手代码第二部分


关键概念总结

1. 事件委托:在父元素上监听子元素事件

2. 事件冒泡:事件从子元素向上传播到父元素

3. 事件捕获:事件从父元素向下传播到子元素

4. stopPropagation():阻止事件传播

5. target vs currentTarget:实际触发元素 vs 事件监听器绑定元素


扩展练习

练习1:动态添加元素的事件处理

// 动态添加新盒子
function addNewBox() {
  const container = document.getElementById('container');
  const newBox = document.createElement('div');
  newBox.className = 'box';
  newBox.id = 'box' + (document.querySelectorAll('.box').length + 1);
  newBox.textContent = newBox.id;
  container.appendChild(newBox);
}

// 事件委托自动处理新添加的元素
document.getElementById('container').addEventListener('click', event => {
  if (event.target.classList.contains('box')) {
    console.log('Clicked:', event.target.id);
  }
});

练习2:条件事件处理

document.getElementById('container').addEventListener('click', event => {
  if (event.target.classList.contains('box')) {
    const boxId = event.target.id;
    
    // 根据不同的盒子执行不同的操作
    switch(boxId) {
      case 'box1':
        console.log('外层盒子被点击');
        break;
      case 'box2':
        console.log('中层盒子被点击');
        break;
      case 'box3':
        console.log('内层盒子被点击');
        break;
    }
    
    event.stopPropagation();
  }
});

相关推荐

网站制作新手教程是什么?这些步骤要知道

网站建设/网站搭建,咨询可戳「链接」网站制作新手教程是什么呢?对于设计网站的步骤前期的时候是沟通、然后是制作,后面是调试网站,这些都是网站制作的步骤。下面给大家说一下企业用户在网站制作前期沟通步骤,大...

如何制作网站?网站建设的10个关键步骤

拥有一个美观优雅、体验良好的网站,不仅是现代公司的形象工程,更是企业获取客户、服务客户最直接高效的媒介。网站建设是极其专业的工作,需要前期策划、设计界面、开发程序和维护优化等专业人士的参与。这里分享...

企业官网制作流程——网站自己做想“白嫖”吗

人人都想创业,只有创业才能有更好的出路。然而以我们年轻人举例,创业初期都是最困难的时候,特别是资金压力。一个正规的企业,都有一个属于自己的网站,找外面科技公司开价就是几千或者上万,这让很多初创企业断了...

昌乐县公司网站制作详细步骤(昌乐网站优化公司)

在进行昌乐县网站制作之前,公司首先需要确定网站的目标与定位,并了解相关用户群体及其需求。接着进行以下流程:一、需求分析1.确定网站类型:企业宣传型、电子商务型、论坛社交型等。2.收集资料:包括公司简介...

华企商城怎么制作网站教程教你轻松制作网站

说到怎么制作网站我们一般可能会觉得没有头绪不知道从哪里下手,这里华企商城怎么制作网站教程教你轻松制作网站,华企商城是一家可以提供一站式服务的公司,我们不仅可以为客户创建各种类型网网站,而且我们还可以进...

企业网站搭建难吗?如何建立一个小型企业网站?

企业网站搭建难吗?diy小网站不难,如你想小型企业如何开启在线之旅?小伙伴们,今天我要和你们探讨一个话题:企业网站搭建到底难不难?特别是对于小型企业而言,如何轻松入门?跟着我一起来看看。·一、网站搭建...

给公司制作网站,应该做成什么样子?

以我观察,现在的公司网站大部分都是一个模式。就是最简单的网页展示型,仅仅包含了最基础的公司简介、产品详情、联系方式、招聘信息等内容。网站存在的唯一目的,貌似只是告诉人们,“你看,我们公司有个官网!”,...

公司网站如何建立(公司如何创建网站)

要建立一个公司网站,可以按照以下步骤进行:第一步、明确目标确定公司网站的目标和定位。考虑网站的用途是宣传公司形象、推广产品/服务、提供客户支持等,以便确定网站的内容和功能。第二步、域名注册选择一个适合...

公司网站怎么做?「公司网站」(公司网站怎么设计)

每家公司都会有它的网站,因为在这个互联网时代,没有自己的公司网站就不容易被用户找到的,就等于是损失了很多客户资源。那么公司网站怎么做呢?今天教大家做公司网站的简单方法。一、注册域名域名是访问网站的地址...

公司网站制作指南(公司网站制作指南书籍)

一、引言随着互联网的快速发展,公司网站已成为企业展示形象、推广产品、与客户沟通的重要平台。一个优秀的公司网站不仅能提升企业的品牌形象,还能有效吸引潜在客户,增加业务机会。本文将为您详细介绍如何制作一个...

详谈公司网页制作搭建流程步骤有哪些

公司网页制作搭建流程步骤可大致分为以下几个部分:需求分析、策划、设计、开发、测试、上线、维护。下面我将详细介绍每个步骤。一、需求分析需求分析是网页制作搭建流程的第一步。在这个阶段,我们需要与客户沟通,...

怎么制作自己的网站,建网站的详细步骤

自助建站平台通过引入可视化设计网站的创新方式,彻底颠覆了传统网站建设的复杂流程,极大地降低了建站的门槛,使得即便是没有任何技术背景,甚至被戏称为“技术小白”的普通人,也能轻松驾驭这一过程,创造出既具备...

公司网站制作需要几个步骤?附教程

许多公司都会搭建一个属于自己的企业网站,他们利用网站进行宣传、发布产品、招商招聘等等。随着网络技术的进步,网页制作技术也开始成熟起来,有更多的方法和方式能搭建一个网站了。如果你想为你的公司也制作一个企...

企业网站建设流程:制作网站的基本步骤

企业网站建设流程:制作网站的基本步骤企业制作网站一般都会有一套合理的流程步骤,虽说任何企业网站建设都不会有一个固定的模式,但遵循这些指导性的流程步骤,最起码可以提高企业建设网站的效率,同时还能减少建设...

自己如何制作网站,用网站模板轻松做出企业网站

平台的创建,便于人们认识企业,了解企业,所以网站的重要性,大家都知道,可以展示企业文化,企业的产品以及环境,制造网站,花多少钱来制作是企业负责人要重点了解的,今天小编分享在乔拓云,用最简单的方法——复...