2012-02-22 2 views
14

나는 이와 같은 뭔가를하려고하면 : 2 개의 jQuery 선택기가 같은 요소를 가리키고 있는지 어떻게 확인합니까?

$(".foo") === $(".foo") // = false 

... 난 거짓 얻을. 대신이 검색어를 사용하면

$(".foo").get(0) === $(".foo").get(0) // = true 

... 사실이됩니다. 바람직하게는 jQuery를 내장이 평등을 테스트 할 수있는 간결한 방법이 있는지 궁금 해요

{a:myObject} !== {a:myObject}; 
[myObject] !== [myObject]; 
myObject  === myObject; 

: 때문입니다

. 내가 작성한 두 번째 방법은 .foo과 일치하는 요소가 하나만 있으면 올바르게 작동합니다. 솔루션은 모든 요소에 대해 작동해야합니다.

분명히 내가 사용하고있는 실제 선택 사항이 더 복잡하기 때문에 ".foo" === ".foo"을 확인하고 싶지는 않습니다. 나는이 예제를 위해 단순화했다. (예 : 나는 $(this)$(".foo") 같은 일을 선택하는 것을 확인 할 수 있습니다.)

+0

가 여기에 그의 대답 반영하는 데모입니다

$.fn.containsSameElements = function(other) { var len = this.length; return other.length == len && this.add(other).length == len; }; 
: http://jsfiddle.net/kAv4X/ – MacMac

+0

@lolwut : 때문에 작동하지 않습니다 '입니다 ()'는 요소 중 적어도 하나 *가 다른 선택자와 일치 하는지를 검사합니다 (즉, 부분 집합). http://jsfiddle.net/dYAH3/에서 살펴보십시오 (첫 번째 경고에서 false로 표시되어야하지만 사실입니다). – Senseful

+0

이 [답변] (http://stackoverflow.com/a/3856290/989121)이 가장 정확합니다. – georg

답변

7

없다 같다, 그러나 트릭해야 다음

과 같이 쓸모가 될 것이다 : 완성도를 들어

$(".foo").sequenceEqual($(".bar")) 

, 컨텐츠와 동일한 방법과 같이 작성할 수 있습니다 :

$.fn.contentsEqual = function(compareTo) { 
    return compareTo && this.length === compareTo.length && this.length === this.filter(compareTo).length; 
} 

지금처럼 쓸모가 될 것이다 :

$(".foo").contentsEqual($(".bar")) 
-1

는 확인 만 JQuery와 내장 명령을 사용하여이 오른쪽을 것 같다 하나

$(oneSelector).filter($(anotherSelector)).length == 1 

경우 ($ (oneSelector) .is는 ($ (anotherSelector))) ... 그들은 jQuery를 객체의 순서 평등을 확인하는 핵심 라이브러리에 아무것도

+6

번호 [docs] (http://api.jquery.com/is/)에서 : * "선택자, 요소 또는 jQuery 객체에 대해 현재 일치하는 요소 집합을 확인하고 적어도 하나 이상이 true이면 true를 반환합니다. ** 이러한 요소 중 일부는 주어진 인수와 일치합니다. "* (필자의 강조). –

+1

'filter'로 업데이트 한 대답은 여전히 ​​옳지 않습니다. 'length'를 '1'이 아닌 원래 매치 된 요소의 길이에 비교하여 검사해야합니다. –

+0

@ T.J.Crowder : 하나의 요소 (질문 참조)를 비교하는 한 괜찮습니다. 어쨌든, filter()는 올바른 방법입니다. jQuery가 내부적으로 is()를 구현하는 방법입니다. – georg

4

두 세트에 모두 이 정확히 포함되어 있는지 확인하려는 경우 정확하게 동일한 번호의

var $this = $("p"), 
    $other = $("p"); 


// same length and $other contains each element of $this 

var equal = $this.length === $other.length 
       && Array.prototype.every.call($this, function(elem) { 
        return $other.index(elem) > -1; 
       }); 
8

난 당신이 $().is 찾고있는 생각 : (아마도 다른 순서로) 국세청은 $.fn.index와 함께 다음 Array#every 일을 할 수 있습니다. Docs here.

var foo, bar; 

foo = $('foo'); 
bar = $('.bar'); 

// This will check to see foo and bar contain the same elements 
foo.is(bar); // true | false 

편집 :이 답변에 대한 jsfiddle을 제공 @lolwut. 의견을 읽은 후, 나는 그것을 업데이트하고이 답변이 OP의 경우에 신뢰할 수 없다고 결정했습니다.

+1

이것은 정답이어야합니다. – MacMac

+3

@lolwut, 아니요, is()는 요소 중 적어도 하나가 주어진 인자와 일치하면 *를 반환합니다 *. –

+0

[T.J. Crowder의 의견] (http://stackoverflow.com/questions/9400500/how-do-i-check-if-2-jquery-selectors-are-pointing-to-the-same-elements/9401119#comment11878467_9400543)에 대한 이것이 왜 작동하지 않는지에 대한 설명. – Senseful

3

pimvdb의 답을 대체 할 수있는 답변으로, add()이 이미 jQuery 객체에있는 요소를 추가하지 않는다는 사실을 활용할 수 있습니다.따라서, 당신은 쓸 수 있습니다 :

이 가 당신은 benekastah의 답변을 확인해야
관련 문제