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

点击事件追踪时对象数组元素被重复覆盖问题求助

问题原因与解决方法

错误原因

你在事件外部定义了唯一的trackObject对象,每次点击时只是修改这个对象的属性值,然后把它的引用推入details数组。数组里的所有元素其实都指向同一个内存地址的对象——也就是说,数组里存的不是对象的副本,而是指向这个对象的“指针”。所以当你下次点击修改trackObject的属性时,数组里之前所有存入的条目都会跟着变化,因为它们本质上都是同一个对象。

解决方法

每次点击事件触发时,创建一个新的对象来存储当前点击目标的信息,避免复用同一个全局对象。

修改后的代码示例1(直接在回调内创建新对象)

let container = document.querySelector(".container");
let details = [];

container.addEventListener("click", function(e) {
  // 每次点击都生成一个独立的新对象
  let trackObject = {
    textContent: e.target.textContent,
    id: e.target.id,
    tagName: e.target.tagName,
    className: e.target.className
  };

  details.push(trackObject);
  console.log(details);
});

修改后的代码示例2(基于模板创建新对象)

如果需要保留对象结构的模板,可以用扩展运算符复制模板并赋值:

let container = document.querySelector(".container");
let details = [];
// 仅作为结构模板,不直接修改
const trackTemplate = {
  textContent: null,
  id: null,
  tagName: null,
  className: null
};

container.addEventListener("click", function(e) {
  // 基于模板创建新对象,确保每次都是独立实例
  let trackObject = {
    ...trackTemplate,
    textContent: e.target.textContent,
    id: e.target.id,
    tagName: e.target.tagName,
    className: e.target.className
  };

  details.push(trackObject);
  console.log(details);
});

这样每次点击生成的对象都是独立的内存实例,存入数组后不会被后续的点击操作修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:37:24