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

含<i>标签的<button>异常:计算器按钮首次点击无响应

问题原因与解决方案

核心问题

你的平方按钮点击异常,本质是事件委托中e.target指向的是实际被点击的子元素:

  • 平方按钮内部嵌套了<i>标签,首次点击时几乎都会点到这个<i>上,而<i>并没有instant-operator类,所以代码里的条件判断不成立,不会触发instantOperator函数。
  • 根号按钮没有内部子元素,点击时e.target就是按钮本身,满足instant-operator的类判断,能正常触发。后续再点平方按钮时,若误点到按钮的空白区域(非<i>部分),e.target才会是按钮,功能才恢复正常。

解决方案

最稳妥的方式是在事件处理函数中,通过closest()方法找到点击元素所属的按钮,不管点击的是按钮本身还是内部子元素,都能正确定位到目标按钮:

修改后的JavaScript代码:

function instantOperator(iOperator) {
  console.log(iOperator);
}

const actionBtn = function (e) {
  // 找到最近的.btn元素,避免子元素干扰
  const clicked = e.target.closest('.btn');
  if (!clicked) return; // 点击区域不是按钮时直接返回

  clicked.classList.remove("btn--clicked");
  void clicked.offsetWidth; // trigger reflow
  clicked.classList.add("btn--clicked");

  if (clicked.classList.contains("integer")) {
    integer(clicked);
  } else if (clicked.classList.contains("operator")) {
    operator(clicked);
  } else if (clicked.classList.contains("instant-operator")) {
    instantOperator(clicked);
  }
};

btnsBody.addEventListener("click", actionBtn);

为什么移除<i>标签就正常?

移除<i>后,点击的直接是按钮本身,e.target就是带有instant-operator类的按钮元素,满足条件判断,所以能正常触发函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:12:26