Existen dos métodos populares para detectar el soporte de lienzo en los navegadores:
La sugerencia de Matt de verificar la existencia de getContext
, también utilizada de manera similar por la biblioteca Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
Comprobación de la existencia de la HTMLCanvasElement
interfaz, tal como se define en las especificaciones WebIDL y HTML . Este enfoque también fue recomendado en una publicación de blog del equipo de IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
Mi recomendación es una variación de este último (ver Notas adicionales ), por varias razones:
- Todos los navegadores conocidos que soportan el lienzo, incluido IE 9, implementan esta interfaz;
- Es más conciso e instantáneamente obvio lo que está haciendo el código;
- El
getContext
enfoque es significativamente más lento en todos los navegadores , ya que implica la creación de un elemento HTML. Esto no es ideal cuando necesita exprimir tanto rendimiento como sea posible (en una biblioteca como Modernizr, por ejemplo).
No hay beneficios notables al usar el primer método. Ambos enfoques pueden ser falsificados, pero no es probable que esto suceda por accidente.
Notas adicionales
Todavía puede ser necesario verificar que se pueda recuperar un contexto 2D. Según se informa, algunos navegadores móviles pueden ser válidos para las dos comprobaciones anteriores, pero también null
para .getContext('2d')
. Es por eso que Modernizr también verifica el resultado de .getContext('2d')
. Sin embargo, WebIDL y HTML, nuevamente, nos brindan otra opción mejor y más rápida :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Tenga en cuenta que podemos omitir la comprobación del elemento del lienzo por completo y pasar directamente a la comprobación de la compatibilidad con la representación 2D. La CanvasRenderingContext2D
interfaz también es parte de la especificación HTML.
Usted debe usar el getContext
método para la detección de WebGL apoyo porque, a pesar de que el navegador puede apoyar el WebGLRenderingContext
, getContext()
puede devolver nulo si el navegador no es capaz de interactuar con la GPU debido a problemas con los controladores y no hay ninguna aplicación de software. En este caso, la comprobación de la interfaz primero le permite omitir la comprobación de 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
}
}
Comparación de rendimiento
El rendimiento del getContext
enfoque es 85-90% más lento en Firefox 11 y Opera 11 y aproximadamente 55% más lento en Chromium 18.