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

如何为点击canvas生成的局部变量div标记实现正常可复用的删除功能

问题核心原因

你使用全局变量window.divMark存储标记元素,每次生成新标记时都会覆盖这个变量的指向,仅保留最后生成的标记元素的引用。第一次点击删除按钮后,这个引用对应的元素已经被移除,后续点击删除按钮时操作的是已经不存在的DOM元素,自然不会生效。

另外你原有代码中还有一处笔误:判断水平方向溢出时,你写的是yMax - imgWidth,应该替换为xMax - imgWidth,否则宽度溢出时的定位逻辑会出错。


修复方案

根据你常见的删除需求,对应调整如下:

场景1:每次点击删除按钮,移除最后添加的一个标记

用数组存储所有生成的标记元素,替代全局单变量存储,删除时从数组末尾取出元素执行移除操作即可,完整修改代码如下:

$(function () {
  // 新增数组存储所有标记元素
  const markList = []
  $("#the-canvas").click(function (e) {
    x = e.pageX;
    y = e.pageY;
    var xMax = 2900;
    var yMax = 2900;
    var img = $('<img class="comment" src="indeksiraj-1.png" alt="myimage" />');

    // 改为局部变量,不要挂载到window
    const divMark = document.createElement("div");
    divMark.classList = `markers mark`;

    $(divMark).css({
        position: "absolute",
        left: x + "px",
        top: y + "px",
    });

    $(divMark).append(img);
    $(marksCanvas).append(divMark);
    // 新生成的标记存入数组
    markList.push(divMark)

    counter++;

    saveLocalPos(x);
    saveLocalY(y);

    var imgHeight = img.outerHeight();
    if (y + imgHeight > yMax) {
        $(divMark).css("top", yMax - imgHeight);
    }

    var imgWidth = img.outerWidth();
    if (x + imgWidth > xMax) {
        $(divMark).css("left", xMax - imgWidth);
    }
  });

  // 删除逻辑修改
  deleteBtn.onclick = function (e) {
    // 数组不为空时才执行删除
    if(markList.length){
      const lastMark = markList.pop()
      lastMark.remove()
    }
  };
})

场景2:每次点击删除按钮,清空所有已生成的标记

直接通过类名选中所有标记元素移除即可,代码如下:

deleteBtn.onclick = function (e) {
  $('.markers.mark').remove()
  // 如果使用了markList存储数组,同时清空数组
  markList.length = 0
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:04