using .nextAll()
、次にuse .filter()
のすべての要素を取得し、条件の結果を返します。条件がtrue
になると、要素は保持されます。
次に、the .first()
に一致するように絞り込みます。
nextEl = someEl.nextAll().filter(function() {
return (someCondition);
}).first();
た場合、または
は、試験された多くの要素があるでしょう、そしてあなたは、条件が満たされたとき
.each()
、その後、
return false;
を使用し、条件にすべてのそれらの余分回実行する必要はありません。これにより、ループが停止します。
var nextEl;
someEl.nextAll().each(function() {
if(someCondition) {
nextEl = this; // reference the matched element
return false; // break the loop
}
});
EDIT:あなたがすべて次の要素を選択したくない場合は、私がネイティブに行く、とwhile
ループを使用すると思い、このような何か:
var nextEl = someEl[0];
while(nextEl = nextEl.nextSibling) {
if(someCondition) {
break;
}
}
条件が満たされるとすぐにループが解除され、nextEl
への最新の割り当てが要素になります。
条件が満たされない場合、要素がなくなるとループが終了し、はnull
またはundefined
(いずれも覚えていません)です。
これは非常に簡単な方法です。
EDIT:
ここでの機能バージョンです。開始要素とテストを実行する関数を受け入れます。見つかった一致、つまりundefined
を返します。
function nextMatch(el, func) {
while(el = el.nextSibling) {
if(func()) {
return el;
}
}
}
// nextEl will contain the match, or "undefined"
var nextEl = nextMatch(someEl, function() {
return (someTest);
});
var someOtherEl = nextMatch(someEl, function() {
return (someOtherTest);
});
LAST EDIT:
私は、同様のプラグインにそれを作るかもしれない推測:
(function($) {
$.fn.nextMatch = function(func) {
return this.map(function() {
var el = this;
while(el = el.nextSibling) {
if(el.nodeType === 1 && func.call(el)) {
return el;
}
}
});
}
})(jQuery);
var nextEl = someEl.nextMatch(function() {
return (someTest);
});
だから、今ではjQueryのタイプのソリューションの多くはです。次のすべての兄弟をフェッチせず、一致が見つかるとwhile
ループが引き続き破損するため、パフォーマンスはさらに向上するはずです。
あなたはそれが別のセレクタによって満たされなかった状態であることを完全に確信していますか? – zincorp
はい。また、最初にすべての要素を選択してからfilter()を使用することは望ましくありません。これはパフォーマンスの観点からは最適ではありません。 – tillda
ネイティブコードバージョンを 'nextMatch()'と呼ばれるプラグインに変換するように答えを更新したので、条件がそれよりも多く実行されず、nextAll()で次のすべての兄弟をフェッチしません。 '。 – user113716