33

昨日、変数に割り当てたjquery-selectorで問題が発生しましたが、気が狂いました。

テストケースを使用したjsfiddleは次のとおりです。

  • .elem を私の obj var に割り当てます
  • 両方の長さをコンソールに記録します。結果 => 4
  • #3 を DOM から削除
  • obj をコンソールにログ記録 => 削除された #3 はまだそこにあり、長さは 4 のままです。jquery クエリがスナップショット化されていることがわかりましたか? 変数に、できませんか?できませんか? 更新します
  • log .elem to the console.. yep Result => 3 で #3 はなくなった
  • ここで、新しい幅 300 で .elem を更新します
  • obj と obj.width をログに記録すると 300 になります。スナップショットは更新されましたか? 興味深いのは、4 つの div のうち 3 つが新しい幅を持っていることですが、削除された #3 はそうではありません...

別のテスト: domtree に li 要素を追加し、obj と .elem をログに記録します。.elem には新しい li があり、obj にはありません。これはまだ古いスナップショットであるためです。

http://jsfiddle.net/CBDUK/1/

この obj を新しいコンテンツで更新する方法はありませんか? 新しい obj を作成したくありません。私のアプリケーションでは、そのオブジェクトに多くの情報が保存されているため、破棄したくありません...

4

6 に答える 6

64

はい、スナップショットです。さらに、ページ DOM ツリーから要素を削除しても、その要素へのすべての参照が魔法のように消えるわけではありません。

次のように更新できます。

var a = $(".elem");

a = $(a.selector);

ミニプラグイン:

$.fn.refresh = function() {
    return $(this.selector);
};

var a = $(".elem");

a = a.refresh();

ただし、この単純なソリューションは、複雑なトラバーサルでは機能しません。.selectorそれらのスナップショットを更新するには、プロパティのパーサーを作成する必要があります。

形式は次のようになります。

$("body").find("div").next(".sibling").prevAll().siblings().selector
//"body div.next(.sibling).prevAll().siblings()"

インプレースミニプラグイン:

$.fn.refresh = function() {
    var elems = $(this.selector);
    this.splice(0, this.length);
    this.push.apply( this, elems );
    return this;
};

var a = $(".elem");
a.refresh() //No assignment necessary
于 2012-08-08T16:26:41.180 に答える
1

@Esailja ソリューションも気に入りましたが、 this.selector にはフィルターに関するいくつかのバグがあるようです。だから私は自分のニーズに合わせて修正しました、多分それは誰かに役立つでしょう

これは、jQuery 1.7.2 が、より高いバージョンでフィルター処理されたスナップショットの更新をテストしなかったためです。

$.fn.refresh = function() { // refresh seletor
    var m = this.selector.match(/\.filter\([.\S+\d?(\,\s2)]*\)/); // catch filter string
    var elems = null;
    if (m != null) { // if no filter, then do the evarage workflow
        var filter = m[0].match(/\([.\S+\d?(\,\s2)]*\)/)[0].replace(/[\(\)']+/g,'');
        this.selector = this.selector.replace(m[0],''); // remove filter from selector
        elems = $(this.selector).filter(filter); // enable filter for it
    } else {
        elems = $(this.selector);
    }
    this.splice(0, this.length);
    this.push.apply( this, elems );
    return this;
};

コードはそれほど美しくありませんが、フィルタリングされたセレクターでは機能しました。

于 2013-04-17T10:16:06.337 に答える
0

これを使用remove()すると、DOM の一部のみが削除されますが、すべての子または関連する要素は削除されません。代わりempty()に、要素で使用すると、問題はなくなります。

例えば:

 $('#parent .child).find('#foo').empty();

たぶんそれは誰かに役立つかもしれません!

于 2017-08-15T13:49:18.140 に答える