Есть два популярных метода определения поддержки холста в браузерах:
Предложение Мэтта о проверке существования 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.
