A maneira padrão de lidar com situações em que o navegador não suporta a <canvas>
tag HTML5 é incorporar algum conteúdo de fallback como:
<canvas>Your browser doesn't support "canvas".</canvas>
Mas o restante da página permanece o mesmo, o que pode ser inapropriado ou enganoso. Gostaria de detectar uma forma de não suporte da tela para poder apresentar o restante da minha página de acordo. O que você recomendaria?
elem.getContext == undefined
,.!undefined = true
, e!true = false
, portanto, isso nos permite retornar um bool, em vez de indefinido ou o contexto.var i = 0
. avalia como false, mas typeof retorna "number". typeof !! i retorna "boolean".undefined ? true : false
(embora um pouco mais demorado).toDataURL
. E o Opera Mini suporta apenas renderização básica de tela sem suporte à API de texto . O Opera Mini pode ser excluído dessa maneira , apenas para referência cruzada.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: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 .Minha recomendação é uma variação deste último (consulte as Notas adicionais ), por vários motivos:
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 :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 oWebGLRenderingContext
,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 degetContext
: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.fonte
false
para o seu exemplo e o meu, parece que eles não fornecem aCanvasRenderingContext2D
interface. Ainda não consegui testar o S60, ainda estou muito curioso e posso fazê-lo em breve.Normalmente, procuro verificar
getContext
quando crio meu objeto de tela.Se for suportado, você poderá continuar a configuração da tela e adicioná-la ao DOM. Este é um exemplo simples de Aperfeiçoamento Progressivo , que eu (pessoalmente) prefiro à Degradação Graciosa.
fonte
, context
na segunda linha?var
instrução por função).Por que não tentar modernizr ? É uma biblioteca JS que fornece capacidade de detecção.
Citar:
fonte
return !!document.createElement('canvas').getContext
Essa é definitivamente a melhor maneira de testar.fonte
Pode haver uma pegadinha aqui - alguns clientes não suportam todos os métodos de tela.
fonte
Você pode usar o script canisuse.js para detectar se o seu navegador suporta tela ou não
fonte
Se você quiser obter o contexto da sua tela, use-a como teste:
fonte