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