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

Namespace prefix NS1 for href on %tagElement% is not defined, setAttributeNS

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

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

问题是,当您使用 NS (setAttributeNS) 设置属性时,safari 会设置 NS\d+ 命名空间,但不会在 svg 中设置 xmlns:NS\d+ 属性,因此看起来像

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

当你在 Chrome 中复制这样的 svg 时 - 你没有这样的问题,因为这个 svg 元素看起来像这样:

<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#source" />

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

UPD:@Robert setAttributeNS 一切正常:

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

如果调用不当,它将无法在 Chrome 中运行。

我没有找到比将这些事件简单地替换为更好的解决方案:

html = html.replace(/NS\d+:href/gi, 'xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href')

现在效果很好。

编辑: Firefox 在根目录下需要 xmlns:xlink="http://www.w3.org/1999/xlink,而 Safari 喜欢这样,所以现在我将此属性添加到根目录:

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

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

// Firefox, Safari root NS issue fix
html = html.replace('xlink=', 'xmlns:xlink=')
// Safari xlink NS issue fix
html = html.replace(/NS\d+:href/gi, 'xlink:href')