问题
问题是
<base>我的HTML页面中有一个标签。因此,用于标识过滤器的IRI不再相对于当前页面,而是相对于
<base>标记中指示的URL
。
例如,此URL也是我主页的URL
http://example.com/my-folder/。
对于除主页之外的网页,
http://example.com/my-folder/site/other-page/例如,
#blurred在计算绝对URL
http://example.com/my-folder/#blurred。但是对于一个简单的GET请求,没有Javascript,因此也没有AngularJS,这只是我的基本页面,没有加载模板。因此,
该页* 面上 不存在 该
#blurred过滤器。 *
在这种情况下, Firefox 不会呈现
<rect>(这是正常行为,请参阅W3Crecommandation)。Chrome 根本不应用过滤器。
对于主页,
#blurred还将计算为绝对URL
http://example.com/my-folder/#blurred。但是这次,这也是当前的URL。无需发送GET请求,因此 存在*
#blurred过滤器。 *
我应该已经看到了对的额外请求
http://example.com/my-folder/,但是为了防御起见,它在对Javascript文件的大量其他请求中丢失了。
解决方案
如果
<base>标记是强制性的,则解决方案是使用绝对IRI标识过滤器。在AngularJS的帮助下,这非常简单。在控制器或链接到SVG的指令中,注入
$location服务并使用
absUrl()getter:
$scope.absUrl = $location.absUrl();
现在,在SVG中,只需使用以下属性:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <defs> <filter id="blurred"> <feGaussianBlur stdDeviation="5"/> </filter> </defs> <rect fill="red" height="200" width="300" /></svg>



