La manière standard de gérer les situations où le navigateur ne prend pas en charge la <canvas>
balise HTML5 consiste à intégrer du contenu de secours comme:
<canvas>Your browser doesn't support "canvas".</canvas>
Mais le reste de la page reste le même, ce qui peut être inapproprié ou trompeur. Je voudrais un moyen de détecter le non-support du canevas afin de pouvoir présenter le reste de ma page en conséquence. Que recommanderais-tu?
elem.getContext == undefined
.!undefined = true
, et!true = false
, donc cela nous permet de renvoyer un booléen, plutôt que non défini ou le contexte.var i = 0
. i donne la valeur false, mais typeof i renvoie «nombre». typeof !! i renvoie "booléen".undefined ? true : false
(bien qu'un peu plus long).toDataURL
. Et Opera Mini ne prend en charge que le rendu de canevas de base sans prise en charge d'API de texte . Opera Mini peut être exclu de cette façon , juste pour référence croisée.Il existe deux méthodes populaires pour détecter la prise en charge du canevas dans les navigateurs:
Suggestion de Matt de vérifier l'existence de
getContext
, également utilisée de manière similaire par la bibliothèque Modernizr:Vérification de l'existence de l'
HTMLCanvasElement
interface, telle que définie par les spécifications WebIDL et HTML . Cette approche a également été recommandée dans un article de blog de l'équipe IE 9 .Ma recommandation est une variante de ce dernier (voir Notes complémentaires ), pour plusieurs raisons:
getContext
approche est nettement plus lente sur tous les navigateurs , car elle implique la création d'un élément HTML. Ce n'est pas idéal lorsque vous avez besoin de réduire au maximum les performances (dans une bibliothèque comme Modernizr, par exemple).Il n'y a aucun avantage notable à utiliser la première méthode. Les deux approches peuvent être falsifiées, mais cela ne se produira probablement pas par accident.
Notes complémentaires
Il peut encore être nécessaire de vérifier qu'un contexte 2D peut être récupéré. Selon certaines informations, certains navigateurs mobiles peuvent renvoyer true pour les deux vérifications ci-dessus, mais revenir
null
pour.getContext('2d')
. C'est pourquoi Modernizr vérifie également le résultat de.getContext('2d')
. Cependant, WebIDL & HTML - encore une fois - nous offre une autre option meilleure et plus rapide :Notez que nous pouvons ignorer entièrement la vérification de l'élément canvas et passer directement à la vérification de la prise en charge du rendu 2D. L'
CanvasRenderingContext2D
interface fait également partie de la spécification HTML.Vous devez utiliser l'
getContext
approche pour détecter la prise en charge de WebGL car, même si le navigateur prend en charge leWebGLRenderingContext
,getContext()
peut renvoyer null si le navigateur ne parvient pas à s'interfacer avec le GPU en raison de problèmes de pilote et qu'il n'y a pas d'implémentation logicielle. Dans ce cas, la vérification de l'interface en premier vous permet d'ignorer la vérification degetContext
:Comparaison des performances
Performance du
getContext
approche sont 85 à 90% plus lentes dans Firefox 11 et Opera 11 et environ 55% plus lentes dans Chromium 18.la source
false
pour votre exemple et le mien, il semble qu'ils ne fournissent pas l'CanvasRenderingContext2D
interface. Je n'ai pas encore pu tester le S60, je suis toujours très curieux et je le ferai peut-être bientôt.J'exécute généralement une vérification
getContext
lorsque je crée mon objet canevas.S'il est pris en charge, vous pouvez continuer la configuration du canevas et l'ajouter au DOM. Ceci est un exemple simple d' amélioration progressive , que je préfère (personnellement) à la dégradation gracieuse.
la source
, context
sur la deuxième ligne?var
instruction par fonction).Pourquoi ne pas essayer modernizr ? C'est une bibliothèque JS qui offre une capacité de détection.
Citation:
la source
return !!document.createElement('canvas').getContext
c'est certainement la meilleure façon de tester.la source
Il peut y avoir un piège ici - certains clients ne prennent pas en charge toutes les méthodes de canevas.
la source
Vous pouvez utiliser le script canisuse.js pour détecter si votre navigateur prend en charge canvas ou non
la source
Si vous voulez obtenir le contexte de votre canevas, vous pouvez aussi bien l'utiliser comme test:
la source