2012-10-05 25 views
8

tôi sử dụng <canvas> để vẽ tất cả các ghi chú và glyphs trong các ứng dụng web giáo dục âm nhạc của tôi: http://www.musictheory.net/exercises/keysig/bc98yydịp hiếm hoi, <canvas> không vẽ lại

Một Firefox sử dụng 15.0.1 đã báo cáo rằng đôi khi cuộc tập trận diễn ra vào câu hỏi tiếp theo, nhưng khung vẫn hiển thị câu hỏi trước. Tôi đã thấy điều này xảy ra trong thử nghiệm một lần (trong số ~ 500 câu hỏi).

Khi nó xảy ra, vải đã được giải tỏa qua cả canvas.width = canvas.width và một cuộc gọi đến .clearRect vào bối cảnh và glyphs đã được rút ra trong JavaScript qua .beginPath, .quadraticCurveTo, .closePath, vv Tuy nhiên, nó có vẻ như đệm ủng hộ của vải không bao giờ bị đỏ bừng/bị cuốn vào cửa sổ.

Tôi đã thấy báo cáo lỗi trong quá khứ liên quan đến vấn đề tương tự:

tôi có thể buộc một vẽ lại bằng cách thực hiện một DOM Hack như chèn một nút văn bản dưới dạng con của canvas và sau đó loại bỏ nó trên chu kỳ vòng lặp chạy tiếp theo hoặc sửa đổi màu nền hoặc phần đệm của Tranh sơn dầu. Điều này có vẻ nặng tay, tuy nhiên, và tôi tiếp tục có cảm giác dai dẳng rằng tôi đang thiếu một cái gì đó hiển nhiên.

mã vẽ của tôi là đủ đơn giản:

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? 

tôi đã đảm bảo rằng số lượng .save.restore cuộc gọi được cân bằng.

1) Tôi đang gọi mã này trực tiếp để đáp ứng với trình xử lý sự kiện onclick. Thay vào đó, tôi có nên sử dụng requestAnimationFrame hoặc setTimeout để thực hiện việc vẽ trên chu kỳ vòng lặp chạy trong tương lai không?

2) Tôi không bỏ lỡ điều gì đó hiển nhiên, như API canvas.pleaseRepaintNow(), phải không?

3) Những người khác có gặp phải các sự cố tương tự và phải sửa đổi DOM để buộc vẽ lại không?

Trả lời

1

Tôi đã cố gắng để có được lỗi xảy ra nhưng sau khi điên cuồng nhấp vào Firefox trong một thời gian, tôi chưa bao giờ thấy nó. Đây là cách tôi xóa canvas có vẻ như hoạt động, nhưng mang nó với một hạt muối vì tôi không thể có được lỗi xảy ra tôi cũng không thể kiểm tra xem điều này có khắc phục được điều gì không ...

// Store the current transformation matrix 
ctx.save(); 

// Use the identity matrix while clearing the canvas 
ctx.setTransform(1, 0, 0, 1, 0, 0); 
ctx.clearRect(0, 0, canvas.width, canvas.height); 

// Restore the transform 
ctx.restore(); 
+0

Upvoting do setTransform(), điều mà tôi chắc chắn bị thiếu. Vấn đề vẫn còn, tuy nhiên: ( – iccir

+0

Bạn có một phương pháp để làm cho nó đáng tin cậy xảy ra? Hoặc chỉ cần giữ cách nhấn? – Bill

+0

Tôi không, nó chỉ xảy ra trên máy tính của tôi một lần.Tuy nhiên, người dùng có thể tái tạo một cách đáng tin cậy trong 100 câu hỏi (chạy Firefox 15.0.1 trên OS X 10.7 trên MacBook Pro 2011). Tôi đã cố gắng để phù hợp với cấu hình của mình càng gần càng tốt, nhưng không có may mắn trong tái tạo. – iccir

4

Thêm context.stroke(); vào dòng cuối cùng của hàm onLoad, nó sửa lỗi trong Firefox. Nếu không, các thay đổi đối với canvas sẽ không hiển thị cho đến khi cửa sổ được vẽ lại.

Nó hoạt động trong trường hợp của tôi ít nhất.

window.onload = function() { 
    canvas = document.getElementById("canvas"); 
    context = canvas.getContext("2d"); 
    //Code here... 
    context.stroke(); 
} 
+0

Bạn có biết phiên bản Firefox này có ảnh hưởng gì không? Có một mục trong Firefox Bugzilla cho nó không? Cảm ơn! – iccir

+0

Nó ảnh hưởng đến phiên bản 15 và đã được báo cáo [đã có] (https://bugzilla.mozilla.org/show_bug.cgi?id=790738). Điều thú vị là họ nói rằng vấn đề xảy ra đối với chrome là tốt, mặc dù nó được cập nhật hơn. –