2012-04-18 15 views
2

私はjQuery要素を持っています。次のすべての兄弟を検索したいと思っています。jqueryの選択をDOMのソートなしで一緒に追加する方法

私は私のような何かができると思っているだろう:

myDiv.nextAll("li").add(myDiv.prevAll("li")).each(function() 
{ 
    if (match) { return this; } 
} 

しかし、これは動作しません。私がjqueryを呼び出すと、DOMに表示される順番でコレクションをソートするように見えます。というのも、常に最初に一致する要素に戻るということです。私はこれを解決する簡単な方法は考えられません。

答えて

3

ほとんどのjQuery操作では、DOM要素をDOMソート順に並べるのは間違いありません。これがjQueryの仕組みです。通常は非常に便利で重要なので、これを行います。

しかし、私はあなたが2つの別々の検索を行う必要があることを意味すると思いますので、物事は正しい順序で検索されます。最初の検索結果が見つからなかった場合は、2番目のいずれかを実行します。私は考えることができる

function fn() { 
    if (match) {return this;} 
} 

var results = myDiv.nextAll("li").each(fn); 
if (!results.length) { 
    results = myDiv.prevAll("li").each(fn); 
} 

唯一の他のソリューションは、ソートされていない要素を使用して独自のjQueryオブジェクトを作成することです。自動でソートする.add()のような組み込みメソッドを使用するのではなく、jQuery DOM要素配列を手動で操作する必要があります。この特定のケースでは、これは上記のコードよりも少ないコードではなく、prevAll()が不要な場合でもすべてのDOM要素を取得するため、問題を解決するための効率的な方法ではありません。あなたのコメントパー

、あなたはDOM順にソートprevAll()の項目をしたい場合、あなたはこのような何かしなければならないでしょう:

function fn() { 
    if (match) {return this;} 
} 

var results = myDiv.nextAll("li").each(fn); 
if (!results.length) { 
    results = $().add(myDiv.prevAll("li")).each(fn); 
} 

余分.add()はjQueryのDOMに.prevAll()結果をソートするようになりますが注文。

+0

リファクタリングのために+1私は実際に答えたものの代わりに考えていました。 –

+0

申し訳ありませんが、ここで私の質問は100%明確ではありませんでした。次の要素で一致するものが見つからない場合は、前の要素の先頭から開始します。 prevAllはDOM順序では実際にソートされないので、これは前のものに移動します。 – Porco

+0

@Porco - 'prevAll()'の結果をDOMの順序でソートする追加のオプションを私の答えに追加しました。 – jfriend00

関連する問題