2011-10-09 22 views
25

मुझे किसी फ़ंक्शन में कोई तत्व पारित करने की आवश्यकता है और फिर माता-पिता को ट्रैवर्स करते समय उस विशिष्ट तत्व से मेल खाना चाहिए। पकड़ (मेरे जैसे किसी के लिए अनजान) यह है कि इस तत्व में कोई आईडी नहीं है। निम्न उदाहरण में, मैं हर तत्व गुलाबी बारी करने के सिवाय एक क्लिक किया कि पर पीलेjQuery - कैसे जांचें कि दो तत्व समान हैं या नहीं?

function colorize(element) { 
    element.parent().find('span').each(function() { 
     if ($(this)===element) { // the problem is this is always false 
      $(this).css('background','yellow'); 
     } else { 
      $(this).css('background','pink'); 
     } 
    }); 
} 
$('span').click(function() { 
    colorize($(this)); 
}); 
+2

http://stackoverflow.com/questions/4441135/how-to-compare-two-doms-or-dom-nodes-in-general –

उत्तर

37

JQuery वस्तुओं की तुलना वापसी सच कभी नहीं होगा कर देना चाहिए, क्योंकि प्रत्येक JQuery वस्तु आ नई वस्तु है, भले ही उनकी चयनकर्ताओं हैं चाहते हैं बराबरी का।

तत्वों की तुलना करने के लिए आप की जाँच करने के लिए कि क्या डोम तत्वों बराबर हैं:

this === element.get(0); 
+0

फिर भी एक ही समस्या देखें। –

+1

@ ए-ओके मैं देखता हूं कि 'तत्व' या तो डीओएम तत्व नहीं है। 'This === element.get (0)' का प्रयोग करें। –

+1

धन्यवाद, यह काम किया। किसी और को इसकी आवश्यकता होने पर, कृपया अपना उत्तर अपडेट करें। :) –

1

आप की जरूरत नहीं है। आप हमेशा एक विशिष्ट तत्व के लिए विशेष शैली को लागू कर रहे हैं, इसलिए उन्हें सभी रंग दें, और उसके बाद विशिष्ट तत्व का रंग बदलें।

function colorize(element) { 
    element.parent().find('span').each(function() { 
     $(this).css('background','pink'); 
    }); 

    element.css('background','yellow'); 
} 

आपकी तुलना के साथ समस्या यह थी कि आप दो वस्तुओं (jQuery ऑब्जेक्ट्स) की तुलना कर रहे थे। जब वस्तुओं, जब तक कि वे एक ही बात की ओर इशारा करते रहे हैं की तुलना, वे असमान माना जाता है:

var o1 = {}; 
var o2 = {}; 
o1 !== o2; 

आप इस के आसपास jQuery आवरण को हटाने के द्वारा काम कर सकते हैं:

function colorize(element) { 
    var realElement = element[0]; 

    element.parent().find('span').each(function() { 
     if (this === realElement) { 
      $(this).css('background','yellow'); 
     } else { 
      $(this).css('background','pink'); 
     } 
    }); 
} 

इस तरह, आप कर रहे हैं डीओएम तत्वों की तुलना डीओएम तत्वों की तुलना में, और संतरे से ऑब्जेक्ट्स या वस्तुओं के लिए सेब नहीं।

+1

सच है, लेकिन यह हैकिश की तरह है। –

+0

धन्यवाद, लेकिन उदाहरण समस्या नहीं है, बस समस्या का मेरा चित्रण। मुझे यह जांचने की ज़रूरत है कि क्या खोज द्वारा मिलान किया गया तत्व फ़ंक्शन पर पास किया गया वही तत्व है। –

+1

अपडेट किया गया। जब आप jQuery का उपयोग करना बंद करते हैं तो बहुत सी समस्याएं दूर होती हैं;) – Zirak

15

उपयोग isEqualNode

this.isEqualNode(element) 

या का उपयोग isSameNode (हटा दिया गया)

this.isSameNode(element) 
+2

ध्यान दें कि 'a.isEqualNode (बी)' '== b' के बराबर नहीं है। 'document.createElement ('div')। isEqualNode (document.createElement ('div')) 'सत्य' है, भले ही नोड्स अलग-अलग तत्व हैं। –

+1

आपके द्वारा लिंक किए गए दस्तावेज़ों में 'isSameNode' को बहिष्कृत करने के बारे में कुछ भी नहीं कहा गया है। तुम क्यों कहते हो यह है? –

14

आप jQuery is() फ़ंक्शन का उपयोग कर सकते हैं। मूल उत्तर here पाया जा सकता है।

function colorize(element) { 
    element.parent().find('span').each(function() { 
     if ($(this).is(element)) { 
      $(this).css('background','yellow'); 
     } else { 
      $(this).css('background','pink'); 
     } 
    }); 
} 
संबंधित मुद्दे