我想将元素存储为数组中的键,将对象存储为值,例如 -
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。
编辑:我对此的回答,如果你有更好的答案,请写下来:)(灵感来自卡萨布兰卡的回答)
id的数组:key-integer节点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 :(得分:1)
我建议您不要使用数组来实现此目的,而是利用DOM元素作为对象:
document.getElementById('something').info = {data: 'something', fn: function () { } };
但是在某些旧浏览器中你可能会遇到内存泄漏的一些问题(阅读:ie6)。如果你使用jQuery的数据存储,那就修复了:
$("#something").data("info", {data: 'something', fn: function () { } });
答案 1 :(得分:1)
我无法通过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