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

如何利用e.target获取计算器按钮div下h2的唯一文本内容?

如何获取计算器按钮下h2的文本内容?

问题描述

我正在开发一款计算器,它包含16个用于输入公式的按钮,每个按钮都是带有button类的<div>元素,结构示例如下:

<div id="number7" class="button">
  <h2>7</h2>
</div>
<div id="number8" class="button">
  <h2>8</h2>
</div>

我已经通过document.querySelectorAll('.button')获取了所有按钮并绑定了点击事件,但点击时e.target可能返回<div>或内部的<h2>元素,导致无法稳定获取按钮对应的数字文本。目前我通过判断id的方式实现需求,但代码量接近100行,过于冗余。请问如何通过事件对象e稳定获取被点击div下h2的文本内容?

解决方案

方法1:使用closest()定位按钮容器

closest()方法可以从当前点击元素向上查找最近的匹配选择器的父元素,无论点击的是<div>还是<h2>,都能先定位到.button元素,再获取内部h2的文本:

const buttons = document.querySelectorAll('.button');
buttons.forEach(but => {
  but.addEventListener('click', function(e) {
    const buttonDiv = e.target.closest('.button');
    const numberText = buttonDiv.querySelector('h2').textContent.trim();
    equation.textContent = numberText;
  });
});

方法2:利用currentTarget属性

currentTarget始终指向绑定事件的元素(即我们的.button div),与点击位置无关,直接通过它获取内部h2即可:

const buttons = document.querySelectorAll('.button');
buttons.forEach(but => {
  but.addEventListener('click', function(e) {
    const numberText = e.currentTarget.querySelector('h2').textContent.trim();
    equation.textContent = numberText;
  });
});

方法3:事件委托(更高效)

如果所有按钮都在同一个父容器内,可以只给父容器绑定一次事件,减少事件绑定数量,提升性能:

假设按钮的父容器为#calculator-container,代码如下:

<div id="calculator-container">
  <div id="number7" class="button">
    <h2>7</h2>
  </div>
  <div id="number8" class="button">
    <h2>8</h2>
  </div>
  <!-- 其他按钮 -->
</div>
const container = document.getElementById('calculator-container');
container.addEventListener('click', function(e) {
  const buttonDiv = e.target.closest('.button');
  if (buttonDiv) { // 确保点击的是按钮元素
    const numberText = buttonDiv.querySelector('h2').textContent.trim();
    equation.textContent = numberText;
  }
});

以上三种方法都能避免冗余的id判断,大幅简化代码,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:25:11