2012-02-22 20 views
14

Ben bu gibi şeyler denerseniz: 2 jQuery seçicilerinin aynı öğelere mi işaret ettiklerini nasıl kontrol ederim?

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

... boş yere olsun. Bunun yerine, bu sorguyu,

... deneyin. tercihen jQuery yerleşik bu eşitlik, test etmek için herhangi özlü bir yol olup olmadığını merak ediyorum

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

çünkü: var

. Yazdığım 2. yöntem sadece .foo ile eşleşen en çok bir öğede doğru çalışıyor. Çözüm, herhangi bir öğe için çalışmalıdır.

Açıkçası, kullanıyorum gerçek seçimler daha karmaşık olduğundan, yalnızca ".foo" === ".foo" denetlemek istemiyorum. Bu örnek için bunları basitleştirdim. (Örneğin ben $(this)$(".foo") aynı şeyi seçilmesi olup olmadığını kontrol etmek isteyebilirsiniz.)

+0

, burada onun cevabını yansıtan bir demo

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

+0

@lolwut: beri çalışmıyor 'dır () 'sadece, elemanların en az birinin * diğer seçiciyle (yani, bir alt kümesiyle) eşleştiğini kontrol eder. Bir göz atın: http://jsfiddle.net/dYAH3/ (ilk uyarıda yanlış söylemek gerekir, ama doğru söylüyor). – Senseful

+0

Bu [cevap] (http://stackoverflow.com/a/3856290/989121) en doğru gibi görünüyor. – georg

cevap

7

yoktur eşittir, ancak hile yapmak gerekir aşağıdadır:

$.fn.sequenceEqual = function(compareTo) { 
    if (!compareTo || !compareTo.length || this.length !== compareTo.length) { 
    return false; 
    } 
    for (var i = 0, length = this.length; i < length; i++) { 
    if (this[i] !== compareTo[i]) { 
     return false; 
    } 
    } 
    return true; 
} 

şöyle kullanılabilir olacaktır: Hangi bütünlüğü için

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

bir içeriği aynı yöntem şöyle yazılabilir:

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

şöyle kullanılabilir olacaktır: Hangi

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

Tamam, sadece jquery yerleşiklerini kullanarak, bu hak gibi görünüyor biri

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

if ($ (oneSelector) sının ($ (anotherSelector))) ... onlar jQuery nesnelerin dizisi eşitliğini kontrol etmek çekirdek kütüphanesinde şey

+6

Hayır. [Docs] 'dan (http://api.jquery.com/is/): * "Bir seçici, öğe veya jQuery nesnesine karşı geçerli eşleşen öğe grubunu kontrol edin ve en az bir ** ise true değerini döndürün Bu unsurların ** ifadesi verilen argümanlarla örtüşüyor. "* (vurgu). –

+1

"Filter" ile güncellenmiş cevabınız hala doğru değil, ancak ileriye doğru atılmış büyük bir adım. "1" i, orijinal eşleştirilen öğeler kümesinin uzunluğuna karşı kontrol etmelisiniz. –

+0

@ T.J.Crowder: Tek bir elemanı karşılaştırdıkları sürece (soruya bakınız), sorun değil. Her neyse, filter() doğru yoldur, jQuery'nin uyguladığı budur() dahili olarak. – georg

4

Her iki kümenin de tam olarak aynı eleme içerip içermediğini kontrol etmek isterseniz

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

Sana $().is aradığınız düşünüyorum: (muhtemelen farklı bir sırayla) nts, $.fn.index ile birlikte daha sonra Array#every işi yapabilirdi. 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 

Düzenleme: Bu yanıt için bir jsfiddle sağladı @lolwut. Yorumları okuduktan sonra güncelledim ve OP'nin davası için bu cevabın güvenilir olmadığını belirledim.

+1

Doğru cevap bu olmalı. – MacMac

+3

@lolwut, nope, 'is()', 'true 'öğesinin en az biri belirtilen argümanlar * ile eşleşirse döner. –

+0

[T.J. Crowder'ın yorumu] (http://stackoverflow.com/questions/9400500/how-do-i-check-if-2-jquery-selectors-are-pointing-to-the-same-elements/9401119#comment11878467_9400543) Bunun neden çalışmadığına dair açıklama. – Senseful

3

pimvdb'nin cevabına bir alternatif olarak (ki bu çok güzel, sadece bunu eksiksiz olarak sağlamaktayım), add()'un jQuery nesnesinde halihazırda bulunan öğeleri eklemeyeceği gerçeğinden faydalanabilirsiniz.Bu nedenle, yazabilirsiniz:

Sen benekastah cevabını kontrol etmelidir