La forma estándar de lidiar con situaciones en las que el navegador no admite la <canvas>
etiqueta HTML5 es incrustar contenido alternativo como:
<canvas>Your browser doesn't support "canvas".</canvas>
Pero el resto de la página sigue siendo la misma, lo que puede ser inapropiado o engañoso. Quisiera alguna forma de detectar la falta de soporte del lienzo para poder presentar el resto de mi página en consecuencia. ¿Qué recomendarías?
elem.getContext == undefined
,.!undefined = true
, y!true = false
, así que esto nos permite devolver un bool, en lugar de indefinido o el contexto.var i = 0
. evalúo como falso, pero typeof i devuelve "número". typeof !! i devuelve "boolean".undefined ? true : false
(aunque un poco más largo).toDataURL
. Y Opera Mini solo admite la representación básica del lienzo sin compatibilidad con API de texto . Opera Mini se puede excluir de esta manera , solo por referencia cruzada.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: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 .Mi recomendación es una variación de este último (ver Notas adicionales ), por varias razones:
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 :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 elWebGLRenderingContext
,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 degetContext
: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.fuente
false
tanto para tu ejemplo como para el mío, parece que no proporcionan laCanvasRenderingContext2D
interfaz. Hasta ahora no he podido probar el S60, todavía tengo mucha curiosidad y puedo hacerlo pronto.Normalmente ejecuto una comprobación para
getContext
cuando creo mi objeto de lienzo.Si es compatible, puede continuar con la configuración del lienzo y agregarlo al DOM. Este es un ejemplo simple de mejora progresiva , que yo (personalmente) prefiero a la degradación agraciada.
fuente
, context
en la segunda línea?var
declaración por función).¿Por qué no probar modernizr ? Es una biblioteca JS que proporciona capacidad de detección.
Citar:
fuente
return !!document.createElement('canvas').getContext
esa es definitivamente la mejor manera de probar.fuente
Puede haber un problema aquí: algunos clientes no admiten todos los métodos de lienzo.
fuente
Puede usar el script canisuse.js para detectar si sus navegadores son compatibles con el lienzo o no
fuente
Si va a obtener el contexto de su lienzo, podría usarlo como prueba:
fuente