2011-02-19 85 views
7

考虑这个SVG/XML和JavaScript:正确的方式来获得命名空间声明属性的值

<svg id="foo" xmlns="http://www.w3.org/2000/svg" 
       xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <use id="bar" xlink:href="#whee" /> 
</svg> 
... 
var foo = document.getElementById('foo'); 
var bar = document.getElementById('bar'); 
var xlnk = foo...; // What is correct here? 
var link = bar.getAttributeNS(xlnk,'href'); 

显然,我可以使这项工作与xlnk = "http://www.w3.org/1999/xlink";但是,我的问题是动态获取svg元素上的xmlns:xlink属性的正确方法是什么?

下面的代码碰巧在Safari/Chrome/FF中工作,但它真的有效吗?
var xlnk = foo.getAttribute('xmlns:xlink');

以下代码返回在这些浏览器为空字符串:
var xlnk = foo.getAttributeNS("http://www.w3.org/2000/svg", "xlink");

回答

5

getAttributeNS()规范文档的第二个参数为:

“的属性的local name检索”。

Namespaces in XML, 3rd Editionxmlns前缀是reserved并用作PrefixedAttName的一部分以限定NSAttName

由于NSAttName没有“本地部分”和QName,它似乎并不认为xmlns:xlink是名称空间+本地名称,而是属性名称本身。由于这与通常符合标准的浏览器的实验结果一致,我确信以下代码是有效且正确的:

var xlnk = foo.getAttribute('xmlns:xlink');