In seltenen Fällen wird Canvas nicht neu gezeichnet

8

Ich verwende <canvas> , um alle Notizen und Glyphen in meinen Musikausbildungs-Web-Apps zu zeichnen: Ссылка

Ein Benutzer von Firefox 15.0.1 hat berichtet, dass die Übung manchmal mit der nächsten Frage fortfährt, aber die Leinwand zeigt immer noch die vorherige Frage an. Ich habe gesehen, dass dies bei Tests einmal auftrat (von ~ 500 Fragen).

Wenn dies der Fall ist, wurde die Zeichenfläche sowohl mit canvas.width = canvas.width als auch mit einem Aufruf von .clearRect im Kontext gelöscht, und Zeichen wurden in JavaScript über .beginPath , .quadraticCurveTo , .closePath usw. gezeichnet Es scheint so, als ob der Hintergrundpuffer des Canvas niemals in das Fenster geleert wird.

Ich habe in der Vergangenheit Fehlerberichte über ähnliche Probleme gesehen:

Ich kann ein Neuzeichnen erzwingen, indem ich einen DOM-Hack einfüge, z. B. einen Textknoten als untergeordnetes Element der Zeichenfläche einfüge und ihn dann im nächsten Durchlauf-Schleifenzyklus entferne oder die Hintergrundfarbe oder das Padding der Zeichenfläche modifiziere. Dies scheint jedoch schwerfällig zu sein, und ich habe immer wieder das Gefühl, dass mir etwas offensichtlich fehlt.

Mein Zeichencode ist einfach genug:

%Vor%

Ich habe sichergestellt, dass die Anzahl der Aufrufe .save und .restore ausgeglichen ist.

1) Ich rufe diesen Code direkt als Antwort auf einen onclick Event-Handler auf. Soll ich stattdessen requestAnimationFrame oder setTimeout verwenden, um die Zeichnung in einem zukünftigen Laufzykluszyklus auszuführen?

2) Ich vermisse nichts Offensichtliches, wie eine canvas.pleaseRepaintNow() API, oder?

3) Haben andere Personen ähnliche Probleme festgestellt und zur DOM-Änderung zurückgegriffen, um Neuzeichnungen zu erzwingen?

    
iccir 05.10.2012, 23:07
quelle

2 Antworten

4

Fügen Sie context.stroke(); zur letzten Zeile Ihrer onLoad -Funktion hinzu, es behebt einen Fehler in Firefox. Andernfalls werden Änderungen an der Arbeitsfläche erst wiedergegeben, wenn das Fenster neu gezeichnet wird.

Es hat zumindest in meinem Fall funktioniert.

%Vor%     
Ross Gatih 15.10.2012 22:30
quelle
1

Ich habe versucht, den Fehler zu bekommen, aber nachdem ich eine Weile in Firefox getippt habe, habe ich ihn nie gesehen. Dies ist, wie ich die Leinwand lösche, die zu funktionieren scheint, aber nehmen Sie es mit einem Körnchen Salz, da ich den Fehler nicht auftreten kann, kann ich auch nicht überprüfen, ob das irgendetwas behebt ...

%Vor%     
Bill 09.10.2012 03:30
quelle

Tags und Links