回答:
これは、Modernizrで使用されている手法であり、基本的にはキャンバスで機能する他のすべてのライブラリです。
function isCanvasSupported(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
あなたの質問はサポートされていない場合の検出に関するものだったので、次のように使用することをお勧めします。
if (!isCanvasSupported()){ ...
elem.getContext == undefined
。!undefined = true
、および!true = false
、これにより、未定義またはコンテキストではなく、ブール値を返すことができます。
var i = 0
。iはfalseと評価されますが、typeof iは「number」を返します。typeof !! iは「boolean」を返します。
undefined ? true : false
(ただし、少し長くなります)。
toDataURL
。また、Opera Miniは基本的なキャンバスレンダリングのみをサポートし、テキストAPIはサポートしていません。Opera Miniは、相互参照のために、この方法で除外できます。
ブラウザでのキャンバスのサポートを検出するには、2つの一般的な方法があります。
の存在をチェックするというマットの提案getContext
。Modernizrライブラリでも同様に使用されます。
var canvasSupported = !!document.createElement("canvas").getContext;
WebIDLおよびHTML仕様でHTMLCanvasElement
定義されている、インターフェースの存在の確認。このアプローチは、IE 9チームのブログ投稿でも推奨されていました。
var canvasSupported = !!window.HTMLCanvasElement;
私の推奨は、いくつかの理由により、後者のバリエーションです(「追加情報」を参照)。
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()
返すことがヌルのブラウザが原因ドライバの問題にGPUとのインタフェースすることができず、何のソフトウェア実装がない場合。この場合、最初にインターフェースを確認すると、次の確認をスキップできます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
アプローチのパフォーマンスは、Firefox 11とOpera 11では85〜90%遅く、Chromium 18では約55%遅くなっています。
false
例と私の両方に返されましたが、CanvasRenderingContext2D
インターフェースを提供していないようです。私はまだS60をテストすることができませんでした、しかし私はまだ非常に好奇心が強く、すぐにそうするかもしれません。
私は通常getContext
、キャンバスオブジェクトを作成するときにチェックを実行します。
(function () {
var canvas = document.createElement('canvas'), context;
if (!canvas.getContext) {
// not supported
return;
}
canvas.width = 800;
canvas.height = 600;
context = canvas.getContext('2d');
document.body.appendChild(canvas);
}());
サポートされている場合は、キャンバスのセットアップを続行してDOMに追加できます。これはProgressive Enhancementの簡単な例であり、私は(個人的に)Graceful Degradationよりも優先しています。
, context
2行目の迷いですか?
modernizrを試してみませんか?これは、検出機能を提供するJSライブラリです。
見積もり:
border-radiusのようなクールな機能を利用できるようにするために、CSSでifステートメントを実行したいと思ったことはありませんか?まあ、Modernizrを使えば、まさにそれを達成できます!
return !!document.createElement('canvas').getContext
これが間違いなくテストする最良の方法です。
canisuse.jsスクリプトを使用して、ブラウザーがキャンバスをサポートしているかどうかを検出できます
caniuse.canvas()
キャンバスのコンテキストを取得する場合は、それをテストとして使用することもできます。
var canvas = document.getElementById('canvas');
var context = (canvas.getContext?canvas.getContext('2d'):undefined);
if(!!context){
/*some code goes here, and you can use 'context', it is already defined*/
}else{
/*oof, no canvas support :(*/
}