在拼接/排序数组时如何保留jQuery DOM元素引用?

时间:2013-03-25 18:59:47

标签: javascript jquery

我有一个对象数组。这些对象的一个​​属性是对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属性)。

2 个答案:

答案 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'); 

多么尴尬!我向所有人道歉。