2012-02-22 12 views
14

私はこのような何かをしようとした場合:2つのjQueryセレクタが同じ要素を指しているかどうかを確認するにはどうすればよいですか?

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

を...私はfalseを得ます。代わりにこのクエリを試してみると、

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

...私は本当です。この等価性をテストするための任意の簡潔な方法があるかどうか、私は、好ましくは、jQueryのに組み込まれて、思ったんだけど

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

:ためだ

。私が書いた2番目の方法は、.fooに一致する要素が1つしかない場合にのみ正しく動作します。ソリューションは、あらゆる量の要素に対して機能するはずです。

明らかに私が使用している実際の選択がより複雑であるため、".foo" === ".foo"をチェックしたくありません。私はこの例のために単純化しました。 (例:私は$(this)$(".foo")と同じものを選択していることを確認することをお勧めします。)

+0

をあなたはここで、benekastahの答えをチェックアウトする必要があります彼の答えを反映デモです: 'であるので、(動作しません:http://jsfiddle.net/kAv4X/ – MacMac

+0

@lolwutを) 'は、要素の少なくとも1つが他のセレクタと一致するかどうかをチェックするだけです(つまり、サブセットです)。 http://jsfiddle.net/dYAH3/を見てください(最初のアラートでは誤っているはずですが、それは真実です)。 – Senseful

+0

この[回答](http://stackoverflow.com/a/3856290/989121)が最も正確であるようです。 – georg

答えて

7

等しいjQueryのオブジェクトのシーケンスの平等をチェックするためのコアライブラリには何もただし、以下のトリックを行う必要があり、存在しません:

そうのような使用可能であろう

:完全について

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

、コンテンツ等しい方法がそうように書くことができる:

ようなので使用可能であろう
$.fn.contentsEqual = function(compareTo) { 
    return compareTo && this.length === compareTo.length && this.length === this.filter(compareTo).length; 
} 

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

[OK]を、唯一のjqueryの組み込み関数を使用して、これは($(oneSelector)場合は、右1

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

のようです.is($(anotherSelector)))...彼らは

+6

No. [docs](http://api.jquery.com/is/):* "セレクタ、要素、またはjQueryオブジェクトに対して現在一致している要素のセットをチェックし、少なくとも1つ以上あればtrueを返します**これらの要素のうちのいくつかは、与えられた引数と一致します。 "*(私の強調)。 –

+1

あなたの更新された答えは 'filter'でまだ正しくはありませんが、大きな前進です。 'length'を' 1'ではなく、一致する要素の元の長さに対してチェックする必要があります。 –

+0

@ T.J.Crowder:1つの要素(質問参照)を比較する限り、問題ありません。とにかく、filter()は正しい方法です。これはjQueryがis()を内部的に実装する方法です。 – georg

4

両方のセットにが正確にの同じ要素が含まれているかどうかを確認する場合は、 NTS(おそらく異なる順序で)、その後、$.fn.indexとの組み合わせでArray#everyが仕事をすることができます:

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を探していると思います。 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、nope、is()は、要素の少なくとも1つが与えられた引数*と一致する場合に 'true'を返します。 –

+0

[T.J.クラウダーのコメント](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オブジェクトに存在する要素を追加しないという事実を利用することができます。したがって、あなたが書くことができます。

$.fn.containsSameElements = function(other) { 
    var len = this.length; 
    return other.length == len && this.add(other).length == len; 
}; 
関連する問題