ext*_*mpl 6 safari svg namespaces setattribute xml-namespaces
我试图通过代码将svg转换为base64 url时在safari中出现此错误:
$svgCopy = $('svg').clone()
html = $('<div>').append($svgCopy).html()
imgSrc = 'data:image/svg+xml;base64,' + btoa(html)
imgEl.src = imgSrc
Run Code Online (Sandbox Code Playgroud)
问题是,当您使用NS设置属性(setAttributeNS)时,safari设置NS\d +名称空间并且不在svg中设置xmlns:NS\d +属性,所以它看起来像
<use NS1:href="#source" />
Run Code Online (Sandbox Code Playgroud)
当您在Chrome中复制此类svg时 - 您没有这样的问题,因为此svg元素将如下所示:
<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#source" />
Run Code Online (Sandbox Code Playgroud)
在结果(在svg副本上)我们得到无效文件.
UPD:@Robert setAttributeNS一切都还可以:
el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#source')
Run Code Online (Sandbox Code Playgroud)
如果没有正确的电话,它将无法在Chrome中使用.
我找不到更好的解决方案,而不是简单地用以下方法替换这些事件:
html = html.replace(/NS\d+:href/gi, 'xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href')
Run Code Online (Sandbox Code Playgroud)
现在它运作良好.
编辑: Firefox需要xmlns:xlink="http://www.w3.org/1999/xlinkroot,Safari喜欢它,所以现在我将这个属性添加到Root:
draw.canvas.setAttributeNS('http://www.w3.org/2000/svg', 'xlink', 'http://www.w3.org/1999/xlink')
Run Code Online (Sandbox Code Playgroud)
...并更正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')
Run Code Online (Sandbox Code Playgroud)