Cara standar untuk menangani situasi di mana browser tidak mendukung <canvas>
tag HTML5 adalah dengan menyematkan beberapa konten mundur seperti:
<canvas>Your browser doesn't support "canvas".</canvas>
Tetapi sisa halaman tetap sama, yang mungkin tidak sesuai atau menyesatkan. Saya ingin beberapa cara mendeteksi kanvas yang tidak mendukung sehingga saya dapat menyajikan sisa halaman saya sesuai. Apa yang akan kamu rekomendasikan?
elem.getContext == undefined
,.!undefined = true
, dan!true = false
, jadi ini memungkinkan kita mengembalikan bool, daripada yang tidak didefinisikan atau konteksnya.var i = 0
. saya mengevaluasi ke false, tetapi typeof saya mengembalikan "angka". typeof !! saya mengembalikan "boolean".undefined ? true : false
(meskipun sedikit lebih panjang).toDataURL
. Dan Opera Mini hanya mendukung rendering kanvas dasar tanpa dukungan API teks . Opera Mini dapat dikecualikan dengan cara ini , hanya untuk referensi silang.Ada dua metode populer untuk mendeteksi dukungan kanvas di browser:
Saran Matt untuk memeriksa keberadaan
getContext
, juga digunakan dengan cara serupa oleh perpustakaan Modernizr:Memeriksa keberadaan
HTMLCanvasElement
antarmuka, sebagaimana ditentukan oleh spesifikasi WebIDL dan HTML . Pendekatan ini juga direkomendasikan dalam posting blog dari tim IE 9 .Rekomendasi saya adalah variasi dari yang terakhir (lihat Catatan Tambahan ), karena beberapa alasan:
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 :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 mendukungWebGLRenderingContext
,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 untukgetContext
: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.sumber
false
untuk contoh Anda dan milik saya, sepertinya mereka tidak menyediakanCanvasRenderingContext2D
antarmuka. Saya belum dapat menguji S60 sampai sekarang, saya masih sangat penasaran dan mungkin akan segera melakukannya.Saya biasanya menjalankan pemeriksaan
getContext
ketika saya membuat objek kanvas saya.Jika didukung, maka Anda dapat melanjutkan pengaturan kanvas dan menambahkannya ke DOM. Ini adalah contoh sederhana Peningkatan Progresif , yang saya (secara pribadi) sukai daripada Degradasi Anggun.
sumber
, context
di baris kedua?var
pernyataan per fungsi).Mengapa tidak mencoba modernizr ? Ini adalah pustaka JS yang menyediakan kemampuan deteksi.
Mengutip:
sumber
return !!document.createElement('canvas').getContext
Itu jelas cara terbaik untuk menguji.sumber
Mungkin ada gotcha di sini- beberapa klien tidak mendukung semua metode kanvas.
sumber
Anda dapat menggunakan skrip canisuse.js untuk mendeteksi apakah browser Anda mendukung kanvas atau tidak
sumber
Jika Anda akan mendapatkan konteks kanvas Anda, Anda sebaiknya menggunakannya sebagai ujian:
sumber