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:
var canvasSupported = !!document.createElement("canvas").getContext;
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 .
var canvasSupported = !!window.HTMLCanvasElement;
Ma recommandation est une variante de ce dernier (voir Notes complémentaires ), pour plusieurs raisons:
- Chaque navigateur connu prenant en charge le canevas - y compris IE 9 - implémente cette interface;
- C'est plus concis et instantanément ce que fait le code;
- L'
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 :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
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 le WebGLRenderingContext
, 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 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
}
}
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.