Я использую <canvas>
для рисования всех нот и глифов в своих веб-приложениях для музыкального образования: http://www.musictheory.net/exercises/keysig/bc98yy
Пользователь Firefox 15.0.1 сообщил, что иногда упражнение переходит к следующему вопросу, но на холсте по-прежнему отображается предыдущий вопрос. Я видел это при тестировании один раз (из ~ 500 вопросов).
Когда это происходит, холст очищается как с помощью canvas.width = canvas.width
, так и с помощью вызова .clearRect
в контексте, а глифы рисуются в JavaScript с помощью .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, например вставив текстовый узел в качестве дочернего элемента холста, а затем удалив его в следующем цикле выполнения или изменив цвет фона или отступы холста. Однако это кажется неуклюжим, и у меня все еще есть ноющее чувство, что я упускаю что-то очевидное.
Мой код рисования достаточно прост:
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 для принудительной перерисовки?