Es gibt zwei beliebte Methoden zum Erkennen der Canvas-Unterstützung in Browsern:
Matts Vorschlag , die Existenz von zu überprüfen getContext
, wird ebenfalls in ähnlicher Weise von der Modernizr-Bibliothek verwendet:
var canvasSupported = !!document.createElement("canvas").getContext;
Überprüfen der Existenz der HTMLCanvasElement
Schnittstelle, wie in den WebIDL- und HTML- Spezifikationen definiert. Dieser Ansatz wurde auch in einem Blogbeitrag des IE 9-Teams empfohlen .
var canvasSupported = !!window.HTMLCanvasElement;
Meine Empfehlung ist aus mehreren Gründen eine Variation der letzteren (siehe Zusätzliche Hinweise ):
- Jeder bekannte Browser, der Canvas unterstützt - einschließlich IE 9 - implementiert diese Schnittstelle.
- Es ist prägnanter und sofort klar, was der Code tut.
- Der
getContext
Ansatz ist in allen Browsern erheblich langsamer , da ein HTML-Element erstellt wird. Dies ist nicht ideal, wenn Sie so viel Leistung wie möglich erzielen möchten (z. B. in einer Bibliothek wie Modernizr).
Die Verwendung der ersten Methode bietet keine nennenswerten Vorteile. Beide Ansätze können gefälscht werden, dies ist jedoch nicht zufällig.
Zusätzliche Bemerkungen
Möglicherweise muss noch überprüft werden, ob ein 2D-Kontext abgerufen werden kann. Berichten zufolge können einige mobile Browser für beide oben genannten Prüfungen true zurück, aber Rückkehr null
zu .getContext('2d')
. Deshalb prüft Modernizr auch das Ergebnis von .getContext('2d')
. WebIDL & HTML bietet uns jedoch erneut eine bessere und schnellere Option:
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Beachten Sie, dass wir die Überprüfung des Canvas-Elements vollständig überspringen und direkt zur Überprüfung der Unterstützung für 2D-Rendering übergehen können. Die CanvasRenderingContext2D
Schnittstelle ist auch Teil der HTML-Spezifikation.
Sie müssen den getContext
Ansatz zum Erkennen der WebGL- Unterstützung verwenden, da der Browser, obwohl er die unterstützt WebGLRenderingContext
, getContext()
möglicherweise null zurückgibt, wenn der Browser aufgrund von Treiberproblemen keine Schnittstelle zur GPU herstellen kann und keine Softwareimplementierung vorliegt. In diesem Fall können Sie bei der ersten Überprüfung der Schnittstelle die Überprüfung überspringen 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
}
}
Leistungsvergleich
Die Leistung des getContext
Ansatzes ist in Firefox 11 und Opera 11 um 85-90% langsamer und in Chromium 18 um etwa 55% langsamer.