假设我有一个嵌入式svg:
<svg
width="5cm"
height="6cm"
viewBox="0 0 5 6"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
...
<a id="foo">...</a>
...
</svg>
我想使用#foo
向.setAttributeNS()
添加任意属性,但只提供属性名称(例如xlink:href
)和值,而不是属性命名空间。
有没有办法查找名称所属的命名空间?似乎应该有,因为我可以硬编码<a xlink:href="...">
并且它将解析为正确的命名空间,因此应该有一些我可以利用的范围。
对于xlink:href
示例,我可以遍历#foo
的祖先,直到找到svg
的{{1}}属性,并将该值用于命名空间,但似乎应该更容易。
答案 0 :(得分:1)
答案在W3规范中:使用lookupNamespaceURI
。
答案 1 :(得分:0)
使用正确的namespaceURI时,如果命名空间已经有前缀,那么DOM实现应该使用它。
var doc = (new DOMParser()).parseFromString(
'<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>',
"application/xml");
doc.documentElement.setAttributeNS(
"http://www.w3.org/1999/xlink",
"href", "data:text/plain,yep");
console.log((new XMLSerializer()).serializeToString(doc));
>>> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="data:text/plain,yep"/>
除此之外,除了以某种方式遍历节点并自己解决之外,确实没有别的办法。
答案 2 :(得分:-1)
setAttribute会工作吗?它不需要命名空间。
或者您可以将null传递给setAttributeNS。