jQuery OR Selector?


325

jQueryセレクターに「OR」ロジックを含める方法があるかどうか疑問に思っています。たとえば、要素がクラスAまたはクラスBの要素の子孫であることがわかっているので、のようなことをしたいのですelem.parents('.classA or .classB')。jQueryはそのような機能を提供しますか?

回答:


494

コンマを使用します。

'.classA, .classB'

スペースは省略できます。


43
これは実際には「or」セレクターではなく、1つの複数のセレクターに似ていることに注意してください。
アレックス

49
@alex:ただし、同じ要素を2回選択することはありません(連結演算子はこれを行います)。2つ以上のセットのUNIONを作成するため(ANDは共通部分です)、ORセレクターです。
cletus

ありがとう、うまくいきました。デバッグの見落としのため、コンマの使用は「AND」を意味すると考えました。
スアン

38
ANDだろう.classA.classB
ダニエルA.ホワイト

2
実際には、元の質問が何を意味していたかによって異なります...つまり、古典的には 'or'演算子は短絡します。したがって、jquery用語での「or」演算子も、おそらく短絡する可能性があります。
Mathew

71

結合する必要のある複数のjQueryオブジェクトがある場合は、コンマを使用するだけでは不十分な場合があります。

.add()メソッドは、結果セットに選択された要素を追加します。

// classA OR classB
jQuery('.classA').add('.classB');

はより詳細です'.classA, .classB'が、次のようなより複雑なセレクターを作成できます。

// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));

22

私はまさにこの機能のために信じられないほどシンプルな(5行のコード)プラグインを書きました:

http://byrichardpowell.github.com/jquery-or/

「この要素を取得する、またはその要素が存在しない場合はこの要素を使用する」と効果的に言うことができます。例えば:

$( '#doesntExist' ).or( '#exists' );

受け入れられた回答はこれと同様の機能を提供しますが、両方のセレクター(コンマの前後)が存在する場合、両方のセレクターが返されます。

Google経由でこのページにアクセスする可能性のあるすべての人に役立つことを願っています。


4
これは、ブールOR演算子が機能する方法ではありません。両方のセレクターが要素を返す場合、OR演算子は最初のセレクターの要素だけでなく、それらのすべてを返す必要があります。プラグインは、「ifEmpty」または「else」などの名前にする必要があります。
Alp

13
@Alp:"a" || "b"vs null || "b".のバニラJSの動作を検討してください。私たちはここに同じ動作を適用する場合は、$(a).or(b)返す必要があり$(a)、それが存在する場合、それ以外の場合は返す必要があります$(b)。「または」はJSの動作「||」と一致するため、この命名法に問題はないと思います。(または)演算子。
FtDRbwLXw6 2013年

4
私もそれをとして見ていますor。他の人が話しているのは、concatまたはmergeアクションのようなものです。
レオンペルティエ2015年

1
混乱を招く可能性があるため、個人的にはこれを「or」とは呼びません(特別な種類のif / orであるため、技術的に正しい場合でも)。これは、異なるものをと呼ばれ、異なる言語で異なる演算子を持っている効果的にヌル合体、次のとおりです。en.wikipedia.org/wiki/Null_coalescing_operator
JanErikGunnar

用語「xor」(排他的または)は正確な用語ですが、xorは一般的に、一般的な用語では「or」の特定のタイプであるため、多くの場合、人々はxorを検索または検索します。
liljoshu

17

element = element1 ||の標準構成を使用したい場合 element2はJavaScriptが真実である最初のものを返すため、正確にそれを行うことができます。

element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');

実際に見つかった最初の要素を返します。しかし、おそらくより良い方法は、jQueryセレクターのコンマ構成(見つかった要素の配列を返す)を次のように使用することでしょう。

element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];

最初に見つかった要素を返します。

私は時々それを使用して、リスト内のアクティブな要素を見つけるか、アクティブな要素がない場合はいくつかのデフォルトの要素を見つけます。例えば:

element = $('ul#someList').find('li.active, li:first')[0] 

これは、アクティブなクラスのliを返すか、存在しない場合は最後のliを返します。

どちらでも機能します。ただし、||として、パフォーマンスが低下する可能性があります。真実な何かが見つかるとすぐに処理を停止しますが、配列アプローチは、すでに見つかった場合でもすべての要素を見つけようとします。次に、|| コンストラクトは、返されるセレクターを見つける前に複数のセレクターを通過する必要がある場合、パフォーマンスの問題が発生する可能性があります。これは、コンストラクトごとにメインのjQueryオブジェクトを呼び出す必要があるためです(これがパフォーマンスヒットかどうかはわかりませんが、それはそれがそうである可能性があることは論理的に思えます)。ただし、一般的に、セレクターがかなり長い文字列である場合は、配列アプローチを使用します。


find( '。somethingToBeFound、.somethingElseToBeFound')は||と同じではないと思います 構築します。.somethingElBeToFoundが.somethingToBeFoundより前にDOMにあるかどうかを確認するため、.somethingToBeFoundが存在していても返されます。
レモ

0

最後に、ハックする方法を見つけました:

div:not(:not(.classA,.classB)) > span

(選択はクラスでDIV classAOR classB直接の子のスパンで)


-2

Daniel A. White Solutionはクラスに最適です。

1がインデックスであるdonee_1_cardのような入力フィールドを見つけなければならない状況があります。

私の解決策は

$("input[name^='donee']" && "input[name*='card']")

どれほど最適かはわかりませんが。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.