Existem dois métodos populares para detectar o suporte de tela nos navegadores:
A sugestão de Matt de verificar a existência de getContext
, também usada de maneira semelhante pela biblioteca Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
Verificando a existência da HTMLCanvasElement
interface, conforme definido pelas especificações WebIDL e HTML . Essa abordagem também foi recomendada em um post da equipe do IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
Minha recomendação é uma variação deste último (consulte as Notas adicionais ), por vários motivos:
- Todo navegador que suporta telas - incluindo o IE 9 - implementa essa interface;
- É mais conciso e instantaneamente óbvio o que o código está fazendo;
- A
getContext
abordagem é significativamente mais lenta em todos os navegadores , porque envolve a criação de um elemento HTML. Isso não é ideal quando você precisa reduzir o máximo de desempenho possível (em uma biblioteca como Modernizr, por exemplo).
Não há benefícios visíveis no uso do primeiro método. Ambas as abordagens podem ser falsificadas, mas não é provável que isso aconteça por acidente.
Notas Adicionais
Ainda pode ser necessário verificar se um contexto 2D pode ser recuperado. Segundo informações, alguns navegadores móveis podem retornar true para as duas verificações acima, mas retornar null
para .getContext('2d')
. É por isso que Modernizr também verifica o resultado de .getContext('2d')
. No entanto, WebIDL e HTML - novamente - nos oferecem outra opção melhor e mais rápida :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Observe que podemos pular a verificação do elemento canvas inteiramente e passar diretamente à verificação do suporte à renderização 2D. A CanvasRenderingContext2D
interface também faz parte da especificação HTML.
Você deve usar a getContext
abordagem para detectar o suporte WebGL porque, mesmo que o navegador suporte o WebGLRenderingContext
, getContext()
pode retornar nulo se o navegador não conseguir fazer interface com a GPU devido a problemas de driver e não houver implementação de software. Nesse caso, a verificação da interface primeiro permite que você pule a verificação 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
}
}
Comparação de desempenho
O desempenho da getContext
abordagem é 85-90% mais lento no Firefox 11 e Opera 11 e cerca de 55% mais lento no Chromium 18.