Có hai phương pháp phổ biến để phát hiện hỗ trợ canvas trong trình duyệt:
Đề nghị của Matt về việc kiểm tra sự tồn tại củagetContext
, cũng được thư viện Modernizr sử dụng theo cách tương tự:
var canvasSupported = !!document.createElement("canvas").getContext;
Kiểm tra sự tồn tại của HTMLCanvasElement
giao diện, như được xác định bởi thông số kỹ thuật WebIDL và HTML . Cách tiếp cận này cũng được đề xuất trong một bài đăng trên blog của nhóm IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
Đề xuất của tôi là một biến thể của cái sau (xem Ghi chú bổ sung ), vì một số lý do:
- Mọi trình duyệt được biết đến hỗ trợ canvas - bao gồm IE 9 - thực hiện giao diện này;
- Nó ngắn gọn hơn và rõ ràng ngay lập tức những gì mã đang làm;
- Cách
getContext
tiếp cận chậm hơn đáng kể trên tất cả các trình duyệt , vì nó liên quan đến việc tạo một phần tử HTML. Điều này không lý tưởng khi bạn cần siết càng nhiều hiệu suất càng tốt (ví dụ trong một thư viện như Modernizr).
Không có lợi ích đáng chú ý khi sử dụng phương pháp đầu tiên. Cả hai cách tiếp cận đều có thể bị giả mạo, nhưng điều này không có khả năng xảy ra do tai nạn.
Ghi chú bổ sung
Có thể vẫn cần kiểm tra xem có thể lấy bối cảnh 2D không. Được biết, một số trình duyệt di động có thể trở thành sự thật cho cả trên séc, nhưng trở lại null
cho .getContext('2d')
. Đây là lý do tại sao Modernizr cũng kiểm tra kết quả của .getContext('2d')
. Tuy nhiên, WebIDL & HTML - một lần nữa - cung cấp cho chúng tôi một tùy chọn khác tốt hơn, nhanh hơn :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Lưu ý rằng chúng ta có thể bỏ qua việc kiểm tra hoàn toàn phần tử canvas và chuyển thẳng sang kiểm tra hỗ trợ kết xuất 2D. Các CanvasRenderingContext2D
giao diện cũng là một phần của đặc tả HTML.
Bạn phải sử dụng getContext
phương pháp để phát hiện hỗ trợ WebGL vì mặc dù trình duyệt có thể hỗ trợ WebGLRenderingContext
nhưng getContext()
có thể trả về null nếu trình duyệt không thể giao tiếp với GPU do sự cố trình điều khiển và không có phần mềm triển khai. Trong trường hợp này, việc kiểm tra giao diện trước tiên cho phép bạn bỏ qua việc kiểm tra getContext
:
var cvsEl, ctx;
if (!window.WebGLRenderingContext)
window.location = "http://get.webgl.org";
else {
cvsEl = document.createElement("canvas");
ctx = cvsEl.getContext("webgl") || cvsEl.getContext("experimental-webgl");
if (!ctx) {
// Browser supports WebGL, but cannot create the context
}
}
So sánh hiệu suất
Hiệu suất của getContext
phương pháp này chậm hơn 85-90% trong Firefox 11 và Opera 11 và chậm hơn khoảng 55% trong Chromium 18.