2012-02-22 6 views
14

अगर मैं इस जैसे कुछ प्रयास करें:मैं कैसे जांचूं कि 2 jQuery चयनकर्ता एक ही तत्व (ओं) को इंगित कर रहे हैं या नहीं?

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

... मैं गलत मिलता है। यदि मैं इसके बजाय इस क्वेरी को आज़माता हूं,

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

... मुझे सच है।

कारण है कि:

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

मैं अगर वहाँ इस समानता, अधिमानतः jQuery में बनाया के लिए परीक्षण करने के लिए किसी भी संक्षिप्त तरीका है सोच रहा हूँ। दूसरी विधि जो मैंने लिखा है केवल तभी सही तरीके से काम करता है जब .foo से मेल खाता है। समाधान किसी भी तत्व के लिए काम करना चाहिए।

स्पष्ट रूप से मैं केवल ".foo" === ".foo" की जांच नहीं करना चाहता क्योंकि वास्तविक चयन का उपयोग मैं अधिक जटिल हूं। मैंने बस इस उदाहरण के लिए उन्हें सरल बना दिया। (उदाहरण के लिए मुझे लगता है कि $(this)$(".foo") के रूप में एक ही बात को चुन रही है की जाँच कर सकते हैं।)

+0

आप benekastah के जवाब की जांच करनी चाहिए, यहाँ एक डेमो है कि उसके जवाब को दर्शाता है: http://jsfiddle.net/kAv4X/ – MacMac

+0

@lolwut: कि के बाद से काम नहीं करता है 'है () 'केवल जांच करता है कि * तत्वों में से कम से कम एक * अन्य चयनकर्ता से मेल खाता है (यानी यह सबसेट है)। एक नज़र डालें: http://jsfiddle.net/dYAH3/ (इसे पहली चेतावनी में झूठ बोलना चाहिए, लेकिन यह सच कहता है)। – Senseful

+0

यह [उत्तर] (http://stackoverflow.com/a/3856290/989121) सबसे सटीक प्रतीत होता है। – georg

उत्तर

7

jQuery वस्तुओं के अनुक्रम समानता की जाँच करने के कोर पुस्तकालय में कुछ भी नहीं है, हालांकि निम्नलिखित चाल करना चाहिए:

$.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; 
} 

कौन सा तो जैसे useable होगा:

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

पूर्णता के लिए, एक सामग्री बराबर विधि इतनी तरह लिखा जा सकता है:

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

कौन सा तो जैसे useable होगा:

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

ठीक है, केवल jQuery builtins का उपयोग कर, यह सही हो रहा है एक

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

अगर ($ (oneSelector) .is ($ (anotherSelector))) ... वे बराबर

+6

संख्या [डॉक्स] से (http://api.jquery.com/is/): * "किसी चयनकर्ता, तत्व या jQuery ऑब्जेक्ट के विरुद्ध तत्वों के मौजूदा मिलान किए गए सेट की जांच करें और यदि कम से कम एक ** सत्य हो ** इन तत्वों में से दिए गए तर्कों से मेल खाता है। "* (मेरा जोर)। –

+1

'फ़िल्टर' के साथ आपका अपडेट किया गया उत्तर अभी भी सही नहीं है, हालांकि यह एक बड़ा कदम आगे है। आपको मिलान किए गए तत्वों के मूल सेट की लंबाई के विरुद्ध 'लंबाई' की जांच करनी होगी, न कि '1'। –

+0

@ टी.जे.क्रॉडर: जब तक वे एक एकल तत्व की तुलना करते हैं (प्रश्न देखें), यह ठीक है। वैसे भी, फ़िल्टर() सही तरीका है, इस प्रकार jQuery कार्यान्वयन आंतरिक रूप से() है। – georg

4

यदि आप यह जांचना चाहते हैं कि दोनों सेट में बिल्कुल समान eleme है

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 

संपादित: @lolwut इस उत्तर के लिए एक jsfiddle प्रदान की है। टिप्पणियों को पढ़ने के बाद, मैंने इसे अपडेट किया और यह निर्धारित किया कि यह उत्तर ओपी के मामले के लिए विश्वसनीय नहीं है।

+1

यह सही जवाब होना चाहिए। – MacMac

+3

@ लॉल्वट, नहीं, 'है()' 'सत्य 'वापस कर देगा यदि * कम से कम एक तत्व दिए गए तर्कों से मेल खाता है *। –

+0

एक नज़र डालें [टीजे। क्रॉउडर की टिप्पणी] (http://stackoverflow.com/questions/9400500/how-do-i-check-if-2-jquery- चयनकर्ता-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; 
}; 
संबंधित मुद्दे

 संबंधित मुद्दे