我用来<canvas>
在我的音乐教育网络应用程序中绘制所有音符和字形:http:
//www.musictheory.net/exercises/keysig/bc98yy
一位 Firefox 15.0.1 用户报告说,有时练习会继续到下一个问题,但画布仍然显示上一个问题。我曾在一次测试中看到过这种情况(大约 500 个问题)。
当它发生时,画布已被清除,并且已通过、、等在 JavaScript 中canvas.width = canvas.width
调用.clearRect
上下文和字形。但是,画布的后备缓冲区似乎永远不会被刷新/绘制到窗口中。.beginPath
.quadraticCurveTo
.closePath
我过去曾看到过关于类似问题的错误报告:
- https://bugzilla.mozilla.org/show_bug.cgi?id=787623
- https://bugzilla.mozilla.org/show_bug.cgi?id=794337
- http://code.google.com/p/chromium/issues/detail?id=55339
我可以通过执行 DOM hack 来强制重绘,例如插入文本节点作为画布的子节点,然后在下一个运行循环周期中将其删除,或者修改画布的背景颜色或填充。然而,这似乎很严厉,而且我一直有一种唠叨的感觉,我错过了一些明显的东西。
我的绘图代码很简单:
canvas.width = width;
ctx.clearRect(0, 0, width, height);
ctx.save();
// Lots of drawing code here
ctx.restore()
ctx.clearRect(0, 0, 1, 1); // Helped force a repaint on some older WebKit browsers?
我确保了电话的数量.save
和.restore
电话是平衡的。
1)我直接调用此代码以响应onclick
事件处理程序。我应该改为使用requestAnimationFrame
还是setTimeout
在未来的运行循环周期中执行绘图?
2) 我没有遗漏一些明显的东西,比如canvas.pleaseRepaintNow()
API,对吧?
3)有没有其他人遇到过类似的问题,通过修改DOM来强制重绘?