Io uso <canvas>
a disegnare tutte le note e glifi nella mia educazione musicale applicazioni web: http://www.musictheory.net/exercises/keysig/bc98yyIn rare occasioni, <canvas> non ridisegna
Una Firefox 15.0.1 utente ha riferito che a volte l'esercizio passa alla domanda successiva, ma la tela mostra ancora la domanda precedente. Ho visto questo accadere nel test una volta (su ~ 500 domande).
Quando si verifica, la tela è stata cancellata via sia canvas.width = canvas.width
e una chiamata al .clearRect
dal contesto e glifi sono stati disegnati in JavaScript tramite .beginPath
, .quadraticCurveTo
, .closePath
, ecc, tuttavia, sembra che buffer di supporto della tela mai viene lavato/disegnato nella finestra.
ho visto le segnalazioni di bug in passato per quanto riguarda questioni simili:
- 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
posso forzare un ridisegno facendo un DOM hackerare come l'inserimento un nodo di testo come figlio dell'area di disegno, quindi rimuoverlo nel ciclo ciclo di esecuzione successivo o modificare il colore di sfondo o il riempimento del tela. Questo sembra pesante, tuttavia, e continuo ad avere la fastidiosa sensazione che mi manchi qualcosa di ovvio.
Il mio codice di disegno è abbastanza semplice:
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?
ho fatto sì che il numero di .save
e .restore
chiamate sono bilanciati.
1) Sto chiamando questo codice direttamente in risposta a un gestore di eventi onclick
. Dovrei invece usare requestAnimationFrame
o setTimeout
per eseguire il disegno su un ciclo di ciclo di esecuzione futuro?
2) Non mi manca qualcosa di ovvio, come l'API canvas.pleaseRepaintNow()
, giusto?
3) Le altre persone hanno riscontrato problemi simili e hanno fatto ricorso alla modifica DOM per forzare il ridisegno?
Upvoting dovuto a setTransform(), che sicuramente mi mancava. Tuttavia, il problema rimane :( – iccir
Hai un metodo per farlo in modo affidabile? O semplicemente continua a fare clic? – Bill
Non lo faccio, è successo solo sul mio computer una volta.Un utente può comunque riprodurlo in modo affidabile entro 100 domande (eseguendo Firefox 15.0.1 su OS X 10.7 su MacBook Pro 2011). Ho cercato di abbinare la sua configurazione il più vicino possibile, ma senza fortuna nella riproduzione. – iccir