存储HTML节点作为数组键

问题描述:


我要存储的元素在我的数组和对象为值的键,例如 -
存储HTML节点作为数组键

var arr = []; 
arr[ document.getElementById('something') ] = { data: 'something' , fn : function(){ } }; 

但问题是:如果我将再增加元素的关键是:document.getElementById('otherthing')。 然后将尝试获得值:arr[ document.getElementById('something') ].data,我会得到值arr[ document.getElementById('otherthing') ]
例如:

var arr = []; 
arr[ document.getElementById('something') ] = { data: 'something' , fn : function(){ } }; 
arr[ document.getElementById('otherthing') ] = { data: 'otherthing' , fn : function(){ alert('k'); } }; 
alert(arr[ document.getElementById('otherthing') ].data); // alerts "otherthing" 
alert(arr[ document.getElementById('something') ].data); // alerts "otherthing" but suppose to alert "something" 

我怎样才能解决这个问题,我通过`吨ID存储,因为我要支持其他节点没有-ID
谢谢,Yosy。

编辑:我的答案,如果你有更好的答案请写吧:)(由casablanca`s启发接听)
数组ID:关键整数节点ID,值的节点它自
与数据阵列,并与我的身份证的FN键,它会看起来像这样:

var idArray = [],nodeArray = []; 

idArray[0] = document.getElementById('hello_ducks'); 
nodeArray[0] = { data: 'hello ducks!!' , fn : function(){ alert('k'); } }; 

idArray[1] = document.getElementById('hello'); 
nodeArray[1] = { data: 'hello' , fn : function(){ } }; 

var testNode = document.getElementById('hello_ducks'), foundId = -1 /*found id*/; 
// Do we have testNode in our array? 
for(var i = 0 ; i < idArray.length; i++){ 
    if(idArray[i] === testNode){ 
    foundId = i; 
    } 
} 

// Do we found our element? 
if(foundId >= 0) { 
    alert(nodeArray[foundId].data); // "hello ducks!!" 
} 
+0

如果你想使用jQuery,有一个'.data'方法,这可能是你想要的。 HTTP://api.jquery。com/data/ – 2010-10-04 19:40:20

+0

查看我更新的答案以获得更简单的方法。 – casablanca 2010-10-04 20:30:53

我不能老是用ID保存,因为我要支持其他节点没有-ID

你应该记住为了从数组中取回节点,你必须以某种方式识别它。如果一个节点没有任何这样的唯一标识符,那么以后如何从数组中检索它,甚至将它存储在第一位?

在像C++这样的低级语言中,每个对象都隐式地拥有一个唯一的地址,但是在JavaScript中没有这样的东西,所以您需要手动提供某种标识对象的方法,并且DOM ID是这是做这件事最方便的方法。

如果您的一些节点最初没有ID,最好的处理方法是简单地分配您自己的唯一ID。


更新:您发布的工作,但因为你需要每一个你需要找一个节点时,搜索整个阵列它不是非常有效的解决方案。为什么不简单地将自己的ID分配给那些没有的ID?例如:

var nextID = 0; 
function getID(elem) { 
    if (elem.hasAttribute('id') == false || elem.id == '') 
    elem.id = 'dummy-' + (++nodeID); 
    return elem.id; 
} 

这样,您就可以随时使用的ID作为关键字:

var nodeArray = []; 

var e = document.getElementById('hello'); 
nodeArray[getID(e)] = { ... }; 

var e = /* element obtained from somewhere, doesn't have an ID */ 
nodeArray[getID(e)] = { ... }; // still works 
+0

我想我将它存储为:nodeName(div)+ id/class + parentNodeName,并与对象值我将添加“节点”属性,以检查这是否是我需要的节点 – Yosi 2010-10-04 20:04:54

+0

@Yosy:任何方案将工作,但只要确保每个元素都有唯一的键。如果使用元素类名称,则最终可能会针对不同的元素使用相同的密钥。 – casablanca 2010-10-04 20:09:29

+0

我目前正在创建的组件需要与第三方组件一起工作,如果我给它一个ID,它可能会销毁第三方组件? – Yosi 2010-10-04 20:34:00

我建议,而不是使用数组为了这个目的,你把DOM-的优势元素是物体:

document.getElementById('something').info = {data: 'something', fn: function() { } }; 

但是,您可能最终会遇到某些旧浏览器中的内存泄漏问题(请参阅:ie6)。如果你使用jQuery的数据存储,而不是被固定:

$("#something").data("info", {data: 'something', fn: function() { } }); 
+0

我不能这样做,我需要将元素存储在数组中。 – Yosi 2010-10-04 20:03:19

+0

也许你可以解释为什么? – Magnar 2010-10-04 20:09:40