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

IT技术 javascript internet-explorer svg browser-detection vml
2021-03-19 18:06:47

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

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

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

VML 有什么等价物吗?

不幸的是 - 在 Firefox 中,我可以很高兴地在 VML 中完成所有渲染而不会出错 - 只是屏幕上没有任何react。从脚本中很难检测到这种情况。

6个回答

我建议对 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 目前对报告功能非常挑剔,feature#Shape尽管具有相对可靠的 SVG 支持返回 false feature#BasicStructure替代建议的意见https://bugs.webkit.org/show_bug.cgi?id=17400,给我我预计火狐/歌剧/ Safari /铬(真)和IE(假)的答案。

请注意,该implementation.hasFeature方法将忽略通过插件的支持,因此如果您想检查例如适用于 IE 的 Adob​​e SVG 查看器插件,您需要单独执行此操作。我想 RENESIS 插件也是如此,但还没有检查。

好决定。我几乎走在那个矿上。
2021-04-28 18:06:47
developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/... 说这个已经去掉了,不知道他的api有没有替代品?
2021-04-28 18:06:47
@masterxilo:Win7 上的 Chrome 35.0.1916.114 为 #BasicStructure 返回 true。尽管如此,它仍然为 #Shape 返回 false - 您确定您尝试了正确的方法吗?
2021-05-19 18:06:47

SVG 检查在 Chrome 中对我不起作用,所以我查看了 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;
  }

对于 VML 检测,以下是谷歌地图的作用(搜索“ 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 的意思:它允许创建任意元素,包括 vml 元素 ( <v:shape>)。看起来是对adjacency属性的测试,可以判断创建的元素是否真的被解释为vml对象。

对于 SVG 检测,这很好用:

function supportsSvg() {
    return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0")
}
嗯,Linux 和 Windows 上的最新 firefox 都失败了。然而,有趣的是,它成功了:“ w3.org/TR/SVG11/feature#Shape
2021-04-27 18:06:47
这是来自 wout 的 svg.js github.com/wout/svg.js/blob/master/src/svg.js#L67的有效 SVG 支持检查
2021-05-10 18:06:47
仅供参考,您必须定义 v 命名空间前缀 document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML');
2021-05-15 18:06:47
好的,这很好。VML 检测工作正常,但 SVG 检测在 Firefox 中失败。事实上,firefox 拒绝了howtocreate.co.uk/tutorials/jsexamples/hasFeature.html上的所有 SVG 功能
2021-05-16 18:06:47
作为对 Firefox 的妥协,我将我的旧 window.SVGAngle 检查与非常好的功能检查结合起来,如果其中一个成功,则支持它。如果您可以修复、改进或删除 supportsSvg 功能,我可以接受您的回答。
2021-05-17 18:06:47

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

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

raphaeljs 演示令人难以置信。+1 使我对此感兴趣。
2021-04-20 18:06:47
拉斐尔确实令人难以置信,我喜欢它并推荐给大家。但是对于我想做的一件特定的事情来说太慢了。我也觉得 raphael 检测 svg 的方式不是很好(我现在不记得那是什么),并想知道是否有更好、更正式的方法来做到这一点,因此提出了这个问题。
2021-05-05 18:06:47
var svgSupport = (window.SVGSVGElement) ? true : false;

如果您假设非 SVG 浏览器是 IE5.5 或更高版本并且可以支持 VML,则可以工作。在 IE6、Firefox 8、Chrome 14.0 上测试。

Raphael 非常酷,但它不支持组的概念,这可能会受到限制,具体取决于您在做什么。不过,德米特里可能会因为我这么说而生气。

我可以建议吗 var svgSupport = !!(window.SVGSVGElement);
2021-04-26 18:06:47
您可以!我真的不了解 jack 对 JavaScript 的了解。
2021-05-09 18:06:47