Ada dua metode populer untuk mendeteksi dukungan kanvas di browser:
Saran Matt untuk memeriksa keberadaan getContext
, juga digunakan dengan cara serupa oleh perpustakaan Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
Memeriksa keberadaan HTMLCanvasElement
antarmuka, sebagaimana ditentukan oleh spesifikasi WebIDL dan HTML . Pendekatan ini juga direkomendasikan dalam posting blog dari tim IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
Rekomendasi saya adalah variasi dari yang terakhir (lihat Catatan Tambahan ), karena beberapa alasan:
- Setiap kanvas yang dikenal yang mendukung kanvas - termasuk IE 9 - mengimplementasikan antarmuka ini;
- Ini lebih ringkas dan langsung jelas apa yang dilakukan kode;
- The
getContext
pendekatan secara signifikan lebih lambat di semua browser , karena melibatkan menciptakan sebuah elemen HTML. Ini tidak ideal ketika Anda perlu memeras kinerja sebanyak mungkin (di perpustakaan seperti Modernizr, misalnya).
Tidak ada manfaat nyata untuk menggunakan metode pertama. Kedua pendekatan dapat dipalsukan, tetapi ini tidak mungkin terjadi secara kebetulan.
catatan tambahan
Mungkin masih perlu untuk memeriksa bahwa konteks 2D dapat diambil. Dilaporkan, beberapa browser seluler dapat mengembalikan true untuk kedua pemeriksaan di atas, tetapi kembali null
untuk .getContext('2d')
. Inilah sebabnya mengapa Modernizr juga memeriksa hasilnya .getContext('2d')
. Namun, WebIDL & HTML - lagi - memberi kami pilihan lain yang lebih baik, lebih cepat :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Perhatikan bahwa kita dapat melewatkan memeriksa elemen kanvas sepenuhnya dan langsung memeriksa dukungan rendering 2D. The CanvasRenderingContext2D
antarmuka juga merupakan bagian dari spesifikasi HTML.
Anda harus menggunakan getContext
pendekatan untuk mendeteksi dukungan WebGL karena, meskipun browser dapat mendukung WebGLRenderingContext
, getContext()
dapat mengembalikan nol jika browser tidak dapat berinteraksi dengan GPU karena masalah driver dan tidak ada implementasi perangkat lunak. Dalam hal ini, memeriksa antarmuka terlebih dahulu memungkinkan Anda melewati pemeriksaan untuk 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
}
}
Perbandingan Kinerja
Performa dari getContext
pendekatan ini adalah 85-90% lebih lambat di Firefox 11 dan Opera 11 dan sekitar 55% lebih lambat di Chromium 18.