【问题标题】:Drawing to second canvas cancels the first canvas绘制到第二个画布会取消第一个画布
【发布时间】:2012-11-27 11:41:46
【问题描述】:

我有两个使用 z-index 相互重叠的画布。

但是我遇到了一个奇怪的问题:当我在下面的画布上绘制 above 时,在下面的画布上绘制的内容会被擦除。

这就是我的做法:

CSS:

.c {
  position: absolute;
  left: 0;
  top: 0;
  width: 100 % ;
  height: 500px;
  margin: 0 auto;
  border: 1px solid red;
}

JavaScript:

window.canvas = new Object();

for (var i = 1; i < 3; i++) {
  document.getElementById("G").innerHTML += '<canvas id="layer' + i + '" class="c" style="z-index:' + i + ';" oncontextmenu="return false;"></canvas>';
  temp = document.getElementById('layer' + i);
  objname = 'canvas' + i;
  canvas[objname] = temp;
  canvas[objname].ctx = temp.getContext("2d");
}

function draw() {
  canvas.canvas1.ctx.clearRect(0, 0, settings.width, settings.height);
  canvas.canvas2.ctx.clearRect(0, 0, settings.width, settings.height);

  abposx = 50;
  abposy = 50;

  //doesn't draw
  canvas.canvas1.ctx.drawImage(gfx['ground'][0], abposx, abposy);

  //draws
  canvas.canvas2.ctx.drawImage(gfx['building'][0], abposx + 120, abposy + 120);
}

在上面的例子中,我只看到canvas2 被绘制,如果我一起移除那个画布,我会看到canvas1 被绘制。如果我将这两个图像都绘制到 the same 画布上,这两个图像也会显示。

但是,如果我将一个绘制到canvas1,另一个绘制到canvas2,我只能看到canvas2 上绘制的内容,而canvas1 似乎已被删除。

为什么会这样?我不知道这是否被其他人复制,但它越来越烦人了!我无法解决问题!非常感谢您的想法/建议/修复。

JSfiddle 解决这个问题:http://jsfiddle.net/xJZrQ/18/

【问题讨论】:

  • 你为什么要在两幅画布上作画?另外,能否提供一个 JSFiddle 示例?
  • @eicto jsfiddle.net/xJZrQ/18 它根本不想在 jsfiddle 上为我画画。
  • 再次编辑链接检查。
  • 你是个天才!假设您的回答解决了问题:P 我会等待! :)
  • 不要将innerHTML+= 一起使用。绝不。 stackoverflow.com/a/2305677/1048572

标签: javascript html dom canvas


【解决方案1】:

看看这个:

document.getElementById("G").innerHTML += '<canvas id="layer'+i+'" class="c" style="z-index:'+i+';" oncontextmenu="return false;"></canvas>';

是这样的:

el.innerHTML += '...';

所以

el.innerHTML = el.innerHTML + '...';

现在您可能明白为什么您的代码不起作用了:当您在循环中第二次执行此类操作时,它会清除 #G 元素中的 innerHTML,并更新它,并再次构建 DOM,因此绘制的上下文第一个画布已经死了。

使用 DOM 而不是 innerHTML。演示:http://jsfiddle.net/mQuWF/

【讨论】:

  • 所以我只需要做document.getElementById("G").innerHTML + //etc ?
  • @Dave 你需要使用document.createElement('canvas')创建元素
  • 我认为如何分配 ID "layer"+ican you show script example in answer?
  • 是的,我只是坚持最后一件事,可以说我没有设置宽度和高度(在 CSS 中设置)如何在 JS 中获得画布宽度和高度?我试过 = settings.width = document.getElementById('layer'+i).clientWidth; 没用。
  • 我打算做的是获取 CSS 尺寸并使用 JS 设置画布尺寸? - 可以做到吗?
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 2014-09-07
相关资源
最近更新 更多