Answers:
这是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
。我计算为假,但typeof我返回“数字”。typeof !! i返回“布尔值”。
undefined ? true : false
尽管有点冗长)。
有两种流行的方法可以检测浏览器中的画布支持:
马特(Matt)建议检查的存在getContext
,并由Modernizr库以类似方式使用:
var canvasSupported = !!document.createElement("canvas").getContext;
检查HTMLCanvasElement
接口的存在,如WebIDL和HTML规范所定义。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交互并且没有软件实现,则浏览器可能会返回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
方法的性能在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。这是“ 渐进增强”的简单示例,我(个人)更喜欢“优雅降级”。
, context
第二行的迷路吗?
您可以使用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 :(*/
}