在 HTML 列表中,如果每个 li 元素都包含一个 Canvas,并且对列表进行重新排序后,你会发现 Canvas 的内容会丢失。这是因为排序操作会改变 li 元素在 DOM 中的位置,而 Canvas 内容是与特定元素绑定的,因此在排序后它们就无法正确关联了。

为了解决这个问题,你可以尝试在排序前将每个 Canvas 的内容保存到一个数组中,然后在排序后再把内容赋回每个 Canvas 中。代码示例如下:

HTML:

<ul id="myList">
  <li><canvas id="canvas1"></canvas></li>
  <li><canvas id="canvas2"></canvas></li>
  <li><canvas id="canvas3"></canvas></li>
</ul>

JavaScript:

var canvasContents = [];

// 保存每个 canvas 的内容
$("#myList canvas").each(function() {
  canvasContents.push($(this)[0].toDataURL());
});

// 对列表进行排序
$("#myList").sortable();

// 在排序后把内容赋回每个 canvas 中
$("#myList canvas").each(function(index) {
  $(this)[0].getContext("2d").clearRect(0, 0, $(this)[0].width, $(this)[0].height);
  var img = new Image();
  img.onload = function() {
    $(this)[0].getContext("2d").drawImage(img, 0, 0);
  }
  img.src = canvasContents[index];
});

注意,保存 Canvas 内容时需要使用 `toDataURL()` 方法,而在赋回时需要使用 `drawImage()` 方法。另外,如果 Canvas 的尺寸发生改变,需要手动清空画布。

HTML 列表排序后 Canvas 内容丢失的解决方法

原文地址: https://www.cveoy.top/t/topic/lLN8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录