如何在浏览器中检测对VML或SVG的支持?

我正在写一点JavaScript,需要在SVG或VML(或者两者兼有,或其他的东西,这是一个奇怪的世界)之间进行select。 虽然我知道,现在只有IE浏览器支持VML,我宁愿检测function比平台。

SVG似乎有几个属性,你可以去:window.SVGAngle例如。

这是检查SVG支持的最佳方法吗?

VML有没有等价物?

不幸的是 – 在Firefox中,我可以非常高兴地在VML中完成所有的渲染,没有任何错误 – 屏幕上什么都没有发生。 从脚本中检测这种情况是相当困难的。

对于VML检测,这里是谷歌地图 (search“ function Xd ”):

 function supportsVml() { if (typeof supportsVml.supported == "undefined") { var a = document.body.appendChild(document.createElement('div')); a.innerHTML = '<v:shape id="vml_flag1" adj="1" />'; var b = a.firstChild; b.style.behavior = "url(#default#VML)"; supportsVml.supported = b ? typeof b.adj == "object": true; a.parentNode.removeChild(a); } return supportsVml.supported } 

我明白了你对FF的意思:它允许创build任意元素,包括vml元素( <v:shape> )。 它看起来像是对adjacency属性的testing,它可以确定创build的元素是否被真正解释为一个vml对象。

对于SVG检测,这很好地工作:

 function supportsSvg() { return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0") } 

我build议一个调整crescentfresh的答案 – 使用

 document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") 

而不是

 document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0") 

检测SVG。 WebKit目前对报表function非常挑剔,尽pipe具有相对稳定的SVG支持,但对于feature#Shape #Shape,返回false。 在https://bugs.webkit.org/show_bug.cgi?id=17400的评论中提供了;feature#BasicStructure替代feature#BasicStructure ,并给出了我对Firefox / Opera / Safari / Chrome(true)和IE(false )。

请注意, implementation.hasFeature方法将忽略通过插件的支持,所以如果你想检查IE浏览器的Adobe SVG Viewer插件,你需要单独做这件事。 我想像RENESIS插件也是如此,但没有检查。

在Chrome浏览器中,SVG检查function对我来说不起作用,因此我查看了Modernizer库在检查中的作用( https://github.com/Modernizr/Modernizr/blob/master/modernizr.js )。

根据他们的代码,这是对我来说是什么工作:

 function supportsSVG() { return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', "svg").createSVGRect; } 

你可能想跳过这个,并使用一个JS库,这将允许你做vector绘图跨浏览器,如果是这样的意图。 然后库会处理这个,输出到SVG(如果支持的话)或者回退到canvas,VML,flash,silverlight等,如果没有的话,取决于可用的内容。

这样做的库的例子,没有特定的顺序:

 var svgSupport = (window.SVGSVGElement) ? true : false; 

如果您认为非SVG浏览器是IE5.5或更高版本,并且可以支持VML,则可以工作。 testingIE6,Firefox 8,Chrome 14.0。

拉斐尔是非常酷的,但它不支持组的概念,这可能是有限的,取决于你在做什么。 不过,德米特里可能会激励我这样说。

因为它指定版本1.0,所以SVG检查在Chrome中不起作用。 这应该会更好:

 document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.1") 

另一方面…当你想知道你服务的页面之前:刮这个页面: http : //caniuse.com/#cats=SVG&statuses=rec&nodetails=1对于传入的浏览器/用户代理。 免责声明:我还没有实现这一点。 正如我希望caniuse.com将发布一个API与合作。

MARKT