Esistono due metodi popolari per rilevare il supporto canvas nei browser:
Il suggerimento di Matt di verificare l'esistenza di getContext
, usato anche in modo simile dalla biblioteca di Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
Verifica dell'esistenza HTMLCanvasElement
dell'interfaccia, come definito dalle specifiche WebIDL e HTML . Questo approccio è stato raccomandato anche in un post sul blog del team di IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
La mia raccomandazione è una variazione di quest'ultima (vedi Note aggiuntive ), per diversi motivi:
- Ogni browser noto che supporta canvas - incluso IE 9 - implementa questa interfaccia;
- È più conciso e immediatamente ovvio cosa sta facendo il codice;
- L'
getContext
approccio è significativamente più lento in tutti i browser , poiché prevede la creazione di un elemento HTML. Questo non è l'ideale quando è necessario spremere quante più prestazioni possibili (in una libreria come Modernizr, per esempio).
Non ci sono vantaggi evidenti nell'uso del primo metodo. Entrambi gli approcci possono essere falsificati, ma ciò non è probabile che accada per caso.
Note aggiuntive
Potrebbe essere ancora necessario verificare che sia possibile recuperare un contesto 2D. Secondo quanto riferito, alcuni browser mobili possono restituire true per entrambi i controlli precedenti, ma restituiscono null
per .getContext('2d')
. Questo è il motivo per cui Modernizr controlla anche il risultato di .getContext('2d')
. Tuttavia, WebIDL e HTML - ancora una volta - ci offrono un'altra opzione migliore e più veloce :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Si noti che possiamo saltare completamente il controllo dell'elemento canvas e passare direttamente al controllo del supporto per il rendering 2D. L' CanvasRenderingContext2D
interfaccia fa anche parte delle specifiche HTML.
È necessario utilizzare l' getContext
approccio per rilevare il supporto WebGL perché, anche se il browser potrebbe supportare il WebGLRenderingContext
, getContext()
potrebbe restituire null se il browser non è in grado di interfacciarsi con la GPU a causa di problemi del driver e non è presente alcuna implementazione software. In questo caso, il controllo dell'interfaccia consente innanzitutto di saltare il controllo di 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
}
}
Confronto delle prestazioni
Le prestazioni getContext
dell'approccio sono più lente dell'85-90% in Firefox 11 e Opera 11 e circa il 55% più lente in Chromium 18.