2013-04-20 8 views
6

http://jsfiddle.net/garnwraly/sfrwU/2/है (': पहला') एक ही तत्व होना चाहिए के लिए अलग-अलग (गलत?) परिणाम देता है।

अंदर jsFiddle केवल

<li> 
    <button id="bam">click</button> 
</li> 

के एचटीएमएल दिया जाता है और इस स्क्रिप्ट

$('body').on('click', 'button', function (e) { 
    //console.log(e.currentTarget == $('button')[0]); //true; 
    //console.log($('li').is('li:first')); //true 

    console.log($(e.currentTarget).parent().is('li:first')) //false 
    console.log($('button').parent().is('li:first')); //true 
    console.log($($('button')[0]).parent().is('li:first')); //false 
}); 

क्यों $(e.currentTarget).parent().is('li:first') गलत है?

+0

यह डीओएम को बुलबुला कर सकता है - जब आप किसी बच्चे तत्व पर क्लिक करते हैं तो क्लिक बुलबुले अपने मूल तत्वों तक। –

+0

@ jqueryrocks जो यहां नहीं हो रहा है; इसका अर्थ है 'पहले' – Pointy

+0

'$ (e.currentTarget) [0] == $ ('बटन') [0]' 'सत्य 'है, इसलिए मुझे नहीं पता कि यह कैसे है मुमकिन। बहुत अजीब। – mpen

उत्तर

4

jQuery कोड के माध्यम से चरण डीबगिंग के बाद यह दौड़ने के बाद, यह विधि is() विधि के भीतर विधि का उपयोग करने के तरीके के साथ एक मुद्दा साबित हुआ। जैसा कि हम जानते हैं, you can pass a context into the method, और आंतरिक रूप से, इस संदर्भ का उपयोग is() विधि (और विभिन्न चयनकर्ताओं के लिए अलग-अलग सेट किया जा रहा है) के साथ किया जा रहा है।

जब $(e.currentTarget) का उपयोग किया जाता है, तो संदर्भ ईवेंट को ट्रिगर करने वाले बटन पर सेट होता है। जबकि $('button') का उपयोग किया जाता है, संदर्भ Document ऑब्जेक्ट पर सेट होता है। यह समझ में आता है जब आप सोचते हैं कि इन चयनकर्ताओं को कैसे स्कॉप्ड करने की आवश्यकता है।

jQuery(selector, this.context).index(this[0]) >= 0 

उस आधार पर, जब $ (e.currentTarget), jQuery() विधि करने के लिए फोन के रूप में चलाया जाता है मूल्यांकन करने के लिए:

jQuery("li:first", "button#bam").index(this[0]) >= 0 

यहाँ is() विधि के प्रासंगिक हिस्सा है

जो स्पष्ट रूप से लौट रहा है -1, और false

+0

पुष्टि की! '$ (E.currentTarget) का उपयोग करना। माता-पिता()। Is.call (दस्तावेज़, 'li: first') 'सही तरीके से काम करता है। इस समाधान के साथ अद्यतन पहेली: http://jsfiddle.net/garnwraly/sfrwU/29/ – CheapSteaks

3

मुझे लगता है कि यह हो सकता है कि :first केवल मिलान से संबंधित है - यदि jQuery ऑब्जेक्ट को DOM तत्व से बनाया गया है, तो कोई चयनकर्ता मिलान नहीं चल रहा है। ध्यान दें कि

console.log($(document.getElementById('bam')).is(':first')); 

false लॉग भी करता है।

मुझे नहीं लगता कि व्यवहार सही है, और एक बग शायद लॉग किया जाना चाहिए, लेकिन अगर यह ठीक से काम करता है तो मुझे नहीं लगता कि इस मामले में परीक्षण :first वास्तव में कोई अच्छा काम करता है। यदि आप एक तत्व से शुरू होने वाले पैरेंट नोड में डीओएम को नेविगेट करने के लिए .parent() का उपयोग करते हैं, तो यह पूछने के लिए व्यर्थ है कि माता-पिता पहला तत्व है - हमेशा एक अभिभावक (कोर्स की डीओएम रूट को छोड़कर) होगा, और हमेशा सिर्फ एक।

यदि आप :first-child के साथ ऐसा करते हैं, जो वास्तव में दिलचस्प होगा लेकिन जरूरी नहीं है, तो यह काम करता है क्योंकि :first-child वास्तव में डोम की संरचना के बारे में है। :first क्वालीफायर सिर्फ पहले मिलान किए गए तत्व होने के बारे में है।

+0

धन्यवाद पॉइंट में गुजर रहा है! मुझे लगता है मैं 'के लिए एक वैध का उपयोग किया है लगता है: हालांकि first' चयनकर्ता, अपने मूल बेला में कोड सिर्फ त्रुटि पुन: पेश करने मैं की संरचना के साथ एक कंटेनर है पर्याप्त होना करने के लिए कम हो गया था ...

not important what's in here
और मैं पहले 'div.orange' से संबंधित बटन पर क्लिक करने के लिए थोड़ा अलग व्यवहार करना चाहता हूं। – CheapSteaks

+0

क्षमा करें भूल गए टिप्पणियां प्रारूपित नहीं कर सकते हैं। यहां एक पहेली दिखा रही है कि क्यों 'पहला बच्चा' मेरे उपयोग के मामले के लिए मेरे लिए काम नहीं करेगा http://jsfiddle.net/garnwraly/sfrwU/25/ – CheapSteaks

+0

@CheapSteaks अच्छी तरह से '$ (जो कुछ भी) जांच रहा है .index() === 0' '.is (': first') 'की जांच के रूप में, अवधारणात्मक रूप से होना चाहिए। – Pointy

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