jQuery 또는 선택기?


325

jQuery 선택기에 "OR"논리를 갖는 방법이 있는지 궁금합니다. 예를 들어, 요소가 classA 또는 classB 클래스를 가진 요소의 자손이라는 것을 알고 있으며 다음과 같은 일을하고 싶습니다 elem.parents('.classA or .classB'). jQuery는 이러한 기능을 제공합니까?

답변:


494

쉼표를 사용하십시오.

'.classA, .classB'

공간을 생략하도록 선택할 수 있습니다.


43
이것은 실제로 하나의 여러 선택기와 같은 '또는'선택기가 아니라는 점에 유의해야합니다.
alex

49
@alex : 그러나 같은 요소를 두 번 선택하지는 않습니다 (연결 연산자가 할 것입니다). 두 개 이상의 세트의 UNION을 생성하기 때문에 실제로는 OR 선택기입니다 (AND는 교차입니다).
cletus

고마워요. 디버깅 감독으로 인해 쉼표를 사용하는 것이 'AND'를 의미한다고 생각했습니다.
Suan

38
AND될 것 .classA.classB입니다.
Daniel A. White

2
그것은 원래의 질문이 암시 한 것에 달려있다. 즉, 고전적으로 '또는'연산자는 단락 될 것이다. 따라서 jquery 용어의 '또는'연산자는 단락 될 수 있습니다.
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 : 바닐라 JS에서 "a" || "b"vs. 의 동작을 고려하십시오 null || "b". 여기에 동일한 동작을 적용하면 존재하는 경우 $(a).or(b)반환해야 $(a)하며, 그렇지 않은 경우 반환해야합니다 $(b). "or"가 JS "||"의 동작과 일치하기 때문에이 명명법에는 문제가 없다고 생각합니다. (또는) 운영자.
FtDRbwLXw6

4
나는 또한 그것을으로 본다 or. 다른 사람들이 말하는 것은 concat또는 merge행동 과 더 비슷합니다 .
레온 펠티에

1
개인적으로 나는 이것을 "또는"이라고 부르지 않을 것입니다. 혼동으로 이어질 수 있습니다 (기술적으로 정확하거나 if의 특별한 종류 일지라도). 이것은 다른 일을 전화를 다른 언어로 다른 사업자가되어 효과적으로 널 (null) 유착이다 : en.wikipedia.org/wiki/Null_coalescing_operator
JanErikGunnar

'xor'(제외 또는)라는 용어는 정확한 용어이지만 xor는 일반적으로 일반적인 용어로 특정 유형의 'or'이므로 xor를 검색하거나 검색 할 때 종종 검색됩니다.
liljoshu

17

element = element1 ||의 표준 구문을 사용하려는 경우 JavaScript가 진실한 첫 번째 것을 리턴하는 element2, 당신은 정확히 그렇게 할 수 있습니다 :

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

실제로 찾은 첫 번째 요소를 반환합니다. 그러나 더 나은 방법은 jQuery 선택기 쉼표 구문 (발견 된 요소의 배열을 반환)을 다음과 같은 방식으로 사용하는 것입니다.

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

첫 번째로 찾은 요소를 반환합니다.

나는 때때로 그것을 사용하여 목록에서 활성 요소를 찾거나 활성 요소가없는 경우 기본 요소를 찾습니다. 예를 들면 다음과 같습니다.

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

활성 클래스가있는 리를 반환하거나 존재하지 않는 경우 마지막 리를 반환합니다.

작동합니다. 그러나 || 배열 접근 방식은 이미 요소를 찾았더라도 모든 요소를 ​​찾으려고 시도하지만 진실한 것을 발견하면 처리를 중지합니다. 그런 다음 || 생성자는 반환 할 선택기를 찾기 전에 여러 선택기를 거쳐야 할 경우 잠재적으로 성능 문제가 발생할 수 있습니다. 그것은 논리적 일 수 있습니다). 그러나 일반적으로 선택기가 다소 긴 문자열 인 경우 배열 방식을 사용합니다.


find ( '. somethingToBeFound, .somethingElseToBeFound')는 || 구성합니다. .somethingElseToBeFound가 .somethingToBeFound보다 먼저 DOM에 있으면 .somethingToBeFound가 존재하더라도 리턴됩니다.
remo

0

마지막으로 해킹 방법을 찾았습니다.

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

( 직접 하위 범위가 있는 클래스 classAOR classB로 div를 선택 )


-2

Daniel A. White Solution은 수업에 적합합니다.

donee_1_card 와 같은 입력 필드를 찾아야하는 상황이 있습니다. 여기서 1은 색인입니다.

내 솔루션은

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

비록 그것이 얼마나 최적인지는 확실하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.