我有一个对象数组。这些对象的一个属性是对DOM元素的jQuery引用,该元素在任何给定时间实际上可能或可能不会附加到DOM;
例如:
Array = [{
name : 'whatever 1',
element : $('<div id="item_1" class="item"><img src="" /></div>')
},
{
name : 'whatever 2',
element : $('<div id="item_2" class="item"><img src="" /></div>')
}];
当这个数组不受影响时,我可以分离并将这些元素附加到DOM而不会有任何麻烦,并且在元素上使用标准的jQuery方法。
例如:
Array[0].element.find('img');
......工作正常。
但是如果我对这个数组进行排序或拼接,我就会丢失引用。
我理解为什么会发生这种情况,但我想知道的是,是否存在这方面的问题,以便在排序或拼接整个阵列本身时可以不断更改,附加,分离,修改此元素?
提前致谢。
编辑:
以下是我的重新排列功能的代码示例:
rearrangeItems : function(){
var self = this;
var offset = 0;
// get number of items that are less than insertindex
for(var i = 0; i < self.cache.selecteditems.length; i++) {
if(self.cache.selecteditems[i] < self.cache.rearrangepos){
offset++;
}
}
//subtract the offset from the intended insertion index
var rearrangeindex = self.cache.rearrangepos - offset;
var removedItems = [];
//sort the selected element indexes into ascending order
self.cache.selecteditems.sort(function (a, b) {
if (a < b) return -1;
else if (b < a) return 1;
return 0;
});
//remove the selected array elemens from the overall array and push them into the temporary array
for(var i = 0; i < self.cache.selecteditems.length; i++) {
var index = self.cache.selecteditems[i];
removedItems.push(self.cache.items.splice(index - removedItems.length, 1)[0]);
}
//Add the selected array elements back into the main array at the correct insertion point
self.cache.items.splice.apply(self.cache.items, [rearrangeindex, 0].concat(removedItems));
}
调用此函数时,所有数组元素都按预期重新排序。
在重新排序之前,我可以执行以下操作:
self.cache.items[index].html.find('img');
然后,它将导致一个空对象(html属性相当于我上面示例中的element属性)。
答案 0 :(得分:0)
我会使用ID,因为你有一个。不知道这是否是最干净的解决方案,但它会起作用。
像这样调用你的例子:
$('#' + Array[0].element.attr('id')).find('img');
希望这适合你。
答案 1 :(得分:0)
可悲的是,这归结于我自己的愚蠢。在我的代码中,我错误地引用了元素。
我实际上是在做以下事情:
self.cache.items[index].html.find('#image_' + index);
重新排序元素之后我故意重置索引,因此在排序/重新排序后调用它时元素不正确。
通过切换到类选择器,一切都已修复。
self.cache.items[index].html.find('.image_item');
多么尴尬!我向所有人道歉。