是否存在需要getAttributeNode和/或getAttributeNodeNS的实际用例?

问题描述:

有人可以想到一个实际使用案例据此我们会有史以来需要使用getAttributeNode和/或getAttributeNodeNS是否存在需要getAttributeNode和/或getAttributeNodeNS的实际用例?

据我所知,getAttribute和/或getAttributeNS解决所有用例,因此这个问题。

+1

所以,你会建议他们从语言中删除它? – DOK 2011-06-03 15:18:35

+1

@DOK我的问题是明确的 – Pacerier 2011-06-03 15:37:54

它可以让您获取该项目作为一个节点,这是一个由其他DOM组件共享的接口,如元素,处理指令,注释等,因此您可以像对待其他项目一样对待它。不知道为什么,但你可以... :)

例如:

<button id="choose_attr">choose attribute node</button> 
<button id="choose_text">choose text node</button> 
<button id="getchosennodevalue">get chosen node's value</button> 

<script> 
var chosenNode; 
document.getElementById('choose_attr').addEventListener('click', function (e) { 
    chosenNode = e.target.getAttributeNode('id'); // Attribute node 
}, false); 
document.getElementById('choose_text').addEventListener('click', function (e) { 
    chosenNode = e.target.firstChild; // Text node 
}, false); 

document.getElementById('getchosennodevalue').addEventListener('click', function() { 
    alert(chosenNode.nodeValue); // We can get the value with a shared property, no matter if it is a text node, comment node, element, attribute node, etc. 
}, false); 
</script> 

即使你只使用存储属性节点的变量,人们可能更愿意拥有它已经预先内置与字符串等其他类型不同的特殊对象。

尽管你的问题是关于getAttributeNode *,就一般情况下使用属性节点而言,我认为它可能更适用于类似document.createAttribute的地方,您可以在其中创建并传递此类节点以设置它一个元素后面。但是获得一个现有的属性确实看起来不那么普遍的效用(尽管人们可以想象一种情况,即你正在传递属性节点,有时是在没有元素的情况下重新创建,有时从现有元素中检索 - 使用getAttributeNode可以避免构建你的自己的对象具有getter和setter,并使用相同的接口来处理它们)。

+0

以及我不明白这个例子证明为什么我们有'getAttributeNode' – Pacerier 2011-06-03 15:40:52

+0

它只是演示了一种多态性,无论节点的类型 - 允许你方便地对待一个属性节点其他节点(尽管节点接口也有'nodeType',允许您区分节点,如属性节点与其他节点,您需要区分其类型)。 – 2011-06-03 15:49:34

如果您需要在单个对象中封装属性名称和值(以及命名空间,如果适用),则可以使用它们。在通过JavaScript处理HTML用户界面时,用例可能很少见。但是,浏览器实现DOM specification,并且必须提供这些方法才能符合规范。当DOM没有被用来操纵基于HTML的用户界面时,DOM有很多用例。

确实很少有理由使用getAttributeNode()。不过,我发现它在过去作为Internet Explorer的getAttributesetAttribute错误的解决方法很有用。例如,采取以下HTML:

<div id="test" onclick="alert()"> 

和下面的代码:

var test = document.getElementById("test"); 
alert(typeof test.getAttribute("onclick")); 

Internet Explorer 7和下将在警报报告function,不像新版本和其他浏览器,其正确地报告string。解决方法涉及getAttributeNode()

alert(typeof test.getAttributeNode("onclick").nodeValue); 

在所有浏览器中正确输出string,虽然是在小的性能成本。同样的问题适用于可以通过属性设置的布尔值和其他非字符串属性。当然,如果IE没有这个bug的话,这是没有必要的,但是这让我很感谢getAttribute()

我已经为您设置了一个示例来测试和玩— http://jsfiddle.net/PVjn5/。在jQuery.com上也有关于它的a ticket I filed