Існує два популярні методи виявлення підтримки полотна в браузерах:
Пропозиція Метта перевірити наявність 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()
може повернути нуль, якщо браузер не в змозі взаємодіяти з графічним процесором через проблеми з драйверами і не існує реалізації програмного забезпечення. У цьому випадку спочатку перевірка інтерфейсу дозволяє пропустити перевірку на 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.