Standardowym sposobem radzenia sobie z sytuacjami, w których przeglądarka nie obsługuje <canvas>
tagu HTML5, jest osadzenie niektórych treści zastępczych, takich jak:
<canvas>Your browser doesn't support "canvas".</canvas>
Ale reszta strony pozostaje taka sama, co może być nieodpowiednie lub wprowadzające w błąd. Chciałbym znaleźć sposób na wykrycie braku obsługi płótna, aby móc odpowiednio przedstawić resztę mojej strony. Co byś polecił?
elem.getContext == undefined
.!undefined = true
, a!true = false
więc to pozwala nam zwrócić wartość logiczną zamiast undefined lub kontekst.var i = 0
. i zwraca wartość false, ale typeof i zwraca „number”. typeof !! i zwraca „boolean”.undefined ? true : false
(choć trochę dłuższe).toDataURL
. Opera Mini obsługuje tylko podstawowe renderowanie płótna bez obsługi tekstowego interfejsu API . W ten sposób można wykluczyć Operę Mini , tylko w celach informacyjnych.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: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 .Moja rekomendacja jest odmianą tego ostatniego (patrz Dodatkowe uwagi ) z kilku powodów:
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ę: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ąć sprawdzaniegetContext
: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.źródło
false
zarówno swoim przykładem i kopalni, wydaje się, że nie zapewniająCanvasRenderingContext2D
interfejs. Jak dotąd nie mogłem przetestować S60, nadal jestem bardzo ciekawy i może to zrobić wkrótce.Zwykle sprawdzam,
getContext
kiedy tworzę obiekt płótna.Jeśli jest obsługiwany, możesz kontynuować konfigurację kanwy i dodać ją do DOM. To jest prosty przykład Progresywnego Wzmocnienia , który ja (osobiście) wolę od Graceful Degradation.
źródło
, context
w drugiej linii?var
instrukcja na funkcję).Dlaczego nie spróbować modernizr ? Jest to biblioteka JS, która zapewnia możliwość wykrywania.
Zacytować:
źródło
return !!document.createElement('canvas').getContext
To zdecydowanie najlepszy sposób testowania.źródło
Może tu występować problem - niektórzy klienci nie obsługują wszystkich metod płótna.
źródło
Możesz użyć skryptu canisuse.js, aby wykryć, czy Twoja przeglądarka obsługuje kanwę, czy nie
źródło
Jeśli chcesz uzyskać kontekst swojego płótna, równie dobrze możesz użyć go jako testu:
źródło