0

私はオブジェクトの配列を持っています。これらのオブジェクトのプロパティの 1 つは、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 プロパティは、上記の例の要素プロパティに相当します)。

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 に答える