未定义%tagElement%上href的命名空间前缀NS1,setAttributeNS

时间:2015-05-16 09:03:21

标签: svg safari namespaces xml-namespaces setattribute

我在尝试通过代码将svg转换为base64 url​​时在safari中出现此错误:

1 1
2 2

问题是,当您使用NS设置属性(setAttributeNS)时,safari设置NS \ d +名称空间并且不在svg中设置xmlns:NS \ d +属性,所以它看起来像

$svgCopy = $('svg').clone()
html = $('<div>').append($svgCopy).html()
imgSrc = 'data:image/svg+xml;base64,' + btoa(html)
imgEl.src = imgSrc

当您在Chrome中复制此类svg时 - 您没有这样的问题,因为此svg元素将如下所示:

<use NS1:href="#source" />

结果(在svg副本上)我们收到无效文件。

UPD:@Robert <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#source" /> 一切正常:

setAttributeNS

如果没有正确的通话,它将无法在Chrome中使用。

1 个答案:

答案 0 :(得分:6)

我找不到更好的解决方案,而不是简单地用以下内容替换这些事件:

el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#source')

现在效果很好。

编辑: Firefox根目录需要html = html.replace(/NS\d+:href/gi, 'xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href') ,Safari喜欢这样,所以现在我将这个属性添加到R​​oot:

xmlns:xlink="http://www.w3.org/1999/xlink

...并更正SVG副本的HTML以便在base64中进一步使用:

draw.canvas.setAttributeNS('http://www.w3.org/2000/svg', 'xlink', 'http://www.w3.org/1999/xlink')