Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在浏览器中检测对VML或SVG的支持_Javascript_Internet Explorer_Svg_Browser Detection_Vml - Fatal编程技术网

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

Javascript 如何在浏览器中检测对VML或SVG的支持,javascript,internet-explorer,svg,browser-detection,vml,Javascript,Internet Explorer,Svg,Browser Detection,Vml,我正在编写一点javascript,需要在SVG和VML之间进行选择(或者两者兼而有之,或者其他什么,这是一个奇怪的世界)。 虽然我知道目前只有IE支持VML,但我更愿意检测功能而不是平台 SVG似乎有一些您可以使用的属性:例如window.SVGAngle 这是检查SVG支持的最佳方法吗 VML是否有任何等价物 不幸的是,在firefox中,我可以很高兴地在VML中进行所有渲染,而不会出错,只是屏幕上什么也没有发生。从脚本中很难检测到这种情况。对于VML检测,以下是内容(搜索“函数Xd”):

我正在编写一点javascript,需要在SVG和VML之间进行选择(或者两者兼而有之,或者其他什么,这是一个奇怪的世界)。 虽然我知道目前只有IE支持VML,但我更愿意检测功能而不是平台

SVG似乎有一些您可以使用的属性:例如window.SVGAngle

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

VML是否有任何等价物


不幸的是,在firefox中,我可以很高兴地在VML中进行所有渲染,而不会出错,只是屏幕上什么也没有发生。从脚本中很难检测到这种情况。

对于VML检测,以下是内容(搜索“
函数Xd
”):


我建议对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目前对报告功能非常挑剔,尽管有相对可靠的SVG支持,但对于
feature#Shape
返回false。
feature#BasicStructure
备选方案在对的评论中给出了建议,并给出了我在Firefox/Opera/Safari/Chrome(true)和IE(false)上预期的答案


请注意,
implementation.hasFeature
方法将忽略通过插件提供的支持,因此,如果您想检查IE的Adobe SVG Viewer插件等,则需要单独进行检查。我想RENESIS插件也是如此,但还没有检查。

您可能想跳过这一步,使用JS库,它将允许您跨浏览器绘制向量,如果这是您的意图的话。然后,库将处理这个问题,如果支持,则输出到SVG,如果不支持,则返回到canvas、VML、flash、silverlight等,具体取决于可用的内容

执行此操作的库示例如下,没有特定顺序:

  • dojo.gfx()
  • Raphaël()
  • SVGWeb()

SVG检查在Chrome中对我不起作用,因此我查看了Modernizer库在其检查()中的作用

根据他们的代码,这是对我有用的:

function supportsSVG() {
    return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', "svg").createSVGRect;
  }
如果您假设非SVG浏览器是IE5.5或更高版本,并且可以支持VML,那么它是有效的。 在IE6、Firefox 8、Chrome 14.0上测试

拉斐尔很酷,但它不支持群体的概念,群体的概念可能会受到限制,这取决于你在做什么。 不过,德米特里可能会因为我这么说而解雇我。

另一方面。。。 当您在提供页面之前想知道: 刮取此页: 用于传入的浏览器/用户代理。 免责声明: 我还没有实现这个。 我希望caniuse.com会发布一个api来与之合作


MarkT

您可能想签出,因为它支持实际检测SVG功能,而不是用户代理嗅探,后者很容易被破坏。

SVG检查在Chrome中不起作用,因为它指定了1.0版。这应该更好地发挥作用:

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

好的,这很好。VML检测工作正常,但在firefox中SVG检测失败。事实上,firefox拒绝所有SVG功能。作为firefox的折衷方案,我正在将我的旧window.SVGAngle检查与非常好的功能检查相结合,如果其中一个成功,那么它就得到了支持。如果您可以修复、改进或删除supportsSvg函数,我可以接受您的答案。嗯,linux和windows上最新的firefox都无法做到这一点。然而,有趣的是,它成功的原因是:“仅供参考,您必须定义v名称空间前缀document.namespaces.add('v','urn:schemas-microsoft-com:vml','#default#vml');这是wout的SVG.js中的SVG支持检查,raphaeljs演示令人难以置信+拉斐尔真是不可思议,我喜欢它,并向大家推荐它。但对于我想做的一件事来说,它太慢了。我也不觉得raphael检测svg的方式很好(我不记得现在是什么),我想知道是否有更好的、更正式的方法来实现它,因此我提出了这个问题。是的,我也希望使用API来实现这一点。在我的例子中,我使用的是静态文件,所以这不是一个选项,但这是一个好主意!!(window.SVGSVGElement)你可以!我对JavaScript不太了解。是的,现在Modernizer是对这个问题的一个很好的回应。打得好。我差一点就走上了那个矿井。@masterxilo:chrome35.0.1916.114在Win7上返回true for#BasicStructure。但对于#Shape,它仍然返回false-您确定您尝试了正确的方法吗?说这是删除的,你知道他的api是否有其他选择吗?关于这个论点的有趣文章:
function supportsSVG() {
    return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', "svg").createSVGRect;
  }
var svgSupport = (window.SVGSVGElement) ? true : false;
document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.1")