【问题标题】:Feature detection of absolute url images inside foreignObjectforeignObject内部绝对url图片的特征检测
【发布时间】:2014-01-13 08:57:54
【问题描述】:

经过一番研究,我发现 Chrome 和 Opera 会在具有绝对路径的 foreignObject 中渲染图像,而 Firefox 仅在它们为 data-uri 格式时才会渲染图像,因为它不加载任何外部资源。

我尝试了几种方法,但我找不到一种方法来检测这种行为,例如我尝试检查 foreignObject 中图像的尺寸,但它们总是正确的,Firefox 只是绘制一个透明矩形具有相同的图像大小。

你知道怎么做吗?

代码 这种情况很难重现,但可以这样测试:

  • 转到谷歌主页
  • 在 Chrome 上打开 firebug 控制台或 javascript 控制台
  • 执行此代码:

var img = new Image();

img.src="data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc1MzgnIGhlaWdodD0nMTkwJz48Zm9yZWlnbk9iamVjdCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJz48aW1nIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLml0L2ltYWdlcy9zcnByL2xvZ28xMXcucG5nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9Im1hcmdpbjogMHB4OyIvPjwvZm9yZWlnbk9iamVjdD48L3N2Zz4=";

document.body.appendChild(img);

在 Chrome 上徽标图像可见,在 Firefox 上则不可见。 svg代码是base64编码的,这是原始代码:

<svg xmlns="http://www.w3.org/2000/svg" width="538" height="190">
<foreignObject width="100%" height="100%">
<img src="https://www.google.it/images/srpr/logo11w.png" xmlns="http://www.w3.org/1999/xhtml" style="margin: 0px;">
</foreignObject>
</svg>

【问题讨论】:

  • 能否提供一些示例代码?

标签: javascript image svg browser-feature-detection


【解决方案1】:

如果用户代理(浏览器)不支持此功能,您可以使用回退技术,因此如果浏览器不支持此功能将呈现“不支持外来对象”:

<switch>
  <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" requiredExtensions="http://www.w3.org/1999/xhtml">
    <foreignObject >
    </foreignObject>
  </g>
  <text font-size="10" font-family="Verdana">
     No foreign Object supported
  </text>
</switch>

或者如果你想在 JavaScript 中检测它,最简单的你可以尝试:

if(typeof SVGForeignObjectElement !== 'undefined')
   alert('It support feature');

或者你可以使用hasFeature

var flag= document.implementation.hasFeature("feature","version");

参数

功能 是一个表示特征名称的 DOMString。

版本 是一个 DOMString ,表示定义功能的规范版本。

【讨论】:

  • hasFeature 为 Firefox、Opera 和 Webkit 中的 foreignObject 元素返回 true。 typeOf 也将返回 true,因为 foreignObject 是所有这些 UA 中支持的元素。
  • 问题不在于检查对foreignObject的支持,我知道该怎么做,Chrome和Firefox都支持它。我想知道如何检查 foreignObject 是否加载绝对 URL 图像。我考虑过使用 hasFeature 但我必须检查什么功能?我还没有找到任何可以解决我的问题的方法
【解决方案2】:
  1. 构造一个包含&lt;foreignObject&gt; 标签的SVG 文件,该标签链接到外部png 或gif 图像。如果图像是单一颜色的,可能会更容易。
  2. 使用 HTML &lt;img&gt; 标签加载图像,例如&lt;img id="imgRect" style="display:none" width="100" height="50" src="test.svg"&gt;
  3. 将图像复制到画布中
  4. 加载图像后,在画布上您希望看到显示外部 png 的位置读取颜色

这将适用于 Firefox,因为它不会污染画布,并且在将 SVG 图像加载到画布时使其只写。我不确定 Chrome 是否仍然污染画布,如果是,那么第 4 步将失败。

这是第 3 步的一些代码。

var canvas = document.getElementById("canvas1");
var ctx = canvas.getContext("2d");
var img = document.getElementById("imgRect");
ctx.drawImage(img, 0, 0);

【讨论】:

  • 正如您已经说过的,Chrome 无法访问包含 SVG 图像的画布上的图像数据,因为它会被污染,因此测试仅适用于 Firefox,它是唯一无法加载的浏览器外部图像和测试无论如何都会失败,所以结果几乎等于 Firefox 的用户代理嗅探而不是特征检测。
  • 我希望 Chrome 在某些时候能够像 Firefox 一样工作,这方面存在开放的 chromium 错误。 Firefox 不会改变,它会一直这样工作。
  • 这有很多开销,只是为了检测一个特征。
  • 确实如此,但这正是 OP 所要求的。显然,您会在每个会话中执行一次,并将结果缓存在 cookie 或其他东西中。
猜你喜欢
  • 2012-06-23
  • 2017-03-06
  • 2012-12-16
  • 2017-07-25
  • 2018-02-16
  • 2023-03-18
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多