Существует два популярных метода определения поддержки canvas в браузерах:
Предложение Мэтта о проверке существования getContext
, также аналогичным образом использованное библиотекой Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
Проверка существования интерфейса HTMLCanvasElement
, как определено спецификациями WebIDL и HTML . Этот подход был также рекомендован в сообщении в блоге от команды IE 9 .
var canvasSupported = !!window.HTMLCanvasElement;
Моя рекомендация - это вариант последнего (см. Дополнительные примечания ) по нескольким причинам:
- Каждый известный браузер, поддерживающий canvas - включая IE 9 - реализует этот интерфейс;
- Более лаконично и мгновенно понятно, что делает код;
- Подход
getContext
- значительно медленнее во всех браузерах , поскольку он предполагает создание элемента HTML. Это не идеально, когда вам нужно максимально снизить производительность (например, в такой библиотеке, как Modernizr).
Нет заметных преимуществ использования первого метода. Оба подхода могут быть подделаны, но это вряд ли произойдет случайно.
Дополнительные примечания
Возможно, все еще необходимо проверить, можно ли получить 2D-контекст. Как сообщается, некоторые мобильные браузеры могут возвращать true для обеих вышеуказанных проверок, но возвращать null
для .getContext('2d')
. Вот почему Modernizr также проверяет результат .getContext('2d')
. Тем не менее, WebIDL & HTML - опять же - дает нам еще один лучший, более быстрый вариант:
var canvas2DSupported = !!window.CanvasRenderingContext2D;
Обратите внимание, что мы можем полностью пропустить проверку элемента canvas и перейти непосредственно к проверке поддержки 2D-рендеринга. Интерфейс CanvasRenderingContext2D
также является частью спецификации HTML.
Вы должны использовать getContext
подход для обнаружения поддержки WebGL , поскольку, даже если браузер может поддерживать WebGLRenderingContext
, getContext()
может вернуть null , если браузер не может взаимодействовать с графическим процессором из-за проблем с драйверами и отсутствует программная реализация. В этом случае проверка интерфейса сначала позволяет пропустить проверку 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
}
}
Сравнение производительности
Производительность подхода getContext
медленнее на 85-90% в Firefox 11 и Opera 11 и примерно на 55% медленнее в Chromium 18.
& EMSP; & EMSP; & EMSP; & EMSP;