0

我有一个对象数组。这些对象的属性之一是对 DOM 元素的 jQuery 引用,该元素可能在任何给定时间实际附加到 DOM,也可能不附加到 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 属性)。

4

2 回答 2

0

我会使用 ID,因为你有一个。不知道这是否是最干净的解决方案,但它会起作用。

像这样调用你的例子:

$('#' + Array[0].element.attr('id')).find('img');

希望这对你有用。

于 2013-03-25T19:05:46.250 回答
0

可悲的是,这归因于我自己的愚蠢。在我的代码中,我错误地引用了该元素。

我实际上是在做以下事情:

self.cache.items[index].html.find('#image_' + index); 

在重新排序元素之后,我故意在之后重置索引,因此在排序/重新排序之后调用它时,元素不正确。

通过切换到类选择器,一切都得到了修复。

self.cache.items[index].html.find('.image_item'); 

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

于 2013-03-25T19:56:03.843 回答