Istnieją dwie popularne metody wykrywania obsługi kanwy w przeglądarkach:
Sugestia Matta, aby sprawdzić, czy istnieje getContext
, również używana w podobny sposób przez bibliotekę Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
Sprawdzanie istnienia HTMLCanvasElement
interfejsu zgodnie ze specyfikacjami WebIDL i HTML . Takie podejście zostało również zalecane w poście na blogu zespołu IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
Moja rekomendacja jest odmianą tego ostatniego (patrz Dodatkowe uwagi ) z kilku powodów:
- Każda znana przeglądarka obsługująca kanwę - w tym IE 9 - implementuje ten interfejs;
- Jest bardziej zwięzłe i od razu oczywiste, co robi kod;
getContext
Podejście jest znacznie wolniejsze we wszystkich przeglądarkach , ponieważ polega na tworzeniu elementu HTML. Nie jest to idealne rozwiązanie, gdy trzeba wycisnąć jak najwięcej wydajności (na przykład w bibliotece takiej jak Modernizr).
Nie ma zauważalnych korzyści z zastosowania pierwszej metody. Oba podejścia można sfałszować, ale nie jest to przypadkowe.
Dodatkowe uwagi
Wciąż może być konieczne sprawdzenie, czy można pobrać kontekst 2D. Podobno niektóre przeglądarki mobilne mogą zwracać wartość true dla obu powyższych sprawdzeń, ale zwracają w null
przypadku .getContext('2d')
. Dlatego Modernizr sprawdza również wynik .getContext('2d')
. Jednak WebIDL i HTML - znowu - daje nam inną lepszą, szybszą opcję:
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Zauważ, że możemy całkowicie pominąć sprawdzanie elementu canvas i przejść od razu do sprawdzania obsługi renderowania 2D. CanvasRenderingContext2D
Interfejs jest również częścią specyfikacji HTML.
Państwo musi użyć getContext
podejście do wykrywania WebGL wsparcia, ponieważ, mimo że przeglądarka może wspierać WebGLRenderingContext
, getContext()
może zwrócić NULL jeśli przeglądarka nie jest w stanie współpracować z GPU z powodu problemów ze sterownikami i nie ma wdrożenie oprogramowania. W takim przypadku sprawdzenie interfejsu najpierw pozwala pominąć sprawdzanie 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
}
}
Porównanie wydajności
Wydajność tego getContext
podejścia jest o 85-90% wolniejsza w przeglądarkach Firefox 11 i Opera 11 oraz o około 55% wolniejsza w Chromium 18.