2011-06-20 17 views
5

मैं एक jQuery प्लगइन लिख रहा हूँ, लेकिन मैं समस्या आ रही है:घटना क्लिक करें jQuery प्लगइन में ठीक से काम नहीं करता है

मेरे HTML तत्व

<a id="trac"></a> 

मेरे जेएस कि प्लगइन कॉल

$('#trac').myplugin(); 

मेरे प्लगइन

$.fn.myplugin = function(){ 
    var $root; 
    return this.each(function(){ 
     $root = $(this); 
     $root.live('click',function(){ 
      console.log('here'); 
     }); 
    }); 
} 

ऐसा होता है कि "यहां" कभी प्रदर्शित नहीं होता है। लेकिन अगर मैं का उपयोग करें ...

$('#trac').live('click',function(){ 
    console.log('here'); 
}); 

... "यहाँ" प्रदर्शित होता है। मुझे समझ में नहीं आ रहा है कि यह क्यों हो रहा है क्योंकि $ रूट और $ ('# trac') बिल्कुल वही jQuery ऑब्जेक्ट हैं।

मैं इसे कैसे ठीक कर सकता हूं?

धन्यवाद!

+1

अपने प्लगइन से पहले भरी हुई है इसे कहा जाता है और क्या आप 'document.ready() 'arround' $ (' # trac ') का उपयोग करते हैं। myplugin(); '? – powtac

+0

आप प्लगइन क्या करना चाहते हैं? आप" .live() "का उपयोग क्यों कर रहे हैं – Pointy

+0

हां, यह एक दस्तावेज़ के अंदर लोड किया गया है। पहले से ही) –

उत्तर

8

".live()" फ़ंक्शन को एक चयनकर्ता की आवश्यकता है, और आपकी प्लगइन में आप इसे एक नहीं दे रहे हैं। आपके द्वारा बनाई गई jQuery ऑब्जेक्ट ($(this)) एक वैध ऑब्जेक्ट है लेकिन इसमें कोई चयनकर्ता स्ट्रिंग शामिल नहीं है।

$root.click(function() { ... }); 

विस्तार से बता दें:

आप सीधे हैंडलर बाँध सकता है "। ... क्योंकि $ जड़ और $ ('# Trac') बिल्कुल एक जैसे हैं" आप कहते हैं, समस्या यह है कि यह वास्तव में सच नहीं है। जब आप एक चयनकर्ता स्ट्रिंग के साथ एक jQuery ऑब्जेक्ट बनाते हैं, तो ऑब्जेक्ट उस चयनकर्ता स्ट्रिंग को चारों ओर रखता है। जब आप "$ (यह)" से "$ रूट" बनाते हैं तो कोई स्ट्रिंग नहीं होती है। ".live()" फ़ंक्शन <body> तत्व पर हैंडलर बनाकर और फिर उस चयनकर्ता के खिलाफ बुलबुले प्रत्येक ईवेंट के लक्ष्य का परीक्षण करके संचालित होता है।

<div id="mystuff">hi</div> 
<div id='answer'>empty</div> 

$.fn.myplugin = function() { 
    this.live('click', function() { 
     $('#answer').text('here'); 
    }); 
} 
$('#mystuff').myplugin(); 

इस में दिखाया गया है:

+0

महान जवाब! बहुत बहुत धन्यवाद! –

+0

मुझे यह जवाब भी पसंद है। –

0

मैं मैं क्या आप दूसरों के लिए कर रहे हैं लगता है कि आप प्लगइन simplfy कर सकते हैं के रूप में करने के लिए कुछ वैकल्पिक दिखाने के लिए सवाल, लेकिन करने के लिए एक "प्रत्यक्ष" जवाब के रूप में अन्य उत्तर चाहते उदाहरण: http://jsfiddle.net/FgUEB/, इस प्रकार "यह" चयनकर्ता हो जाता है और फिर आप "लाइव क्लिक" संलग्न कर सकते हैं - बिना किसी जटिलता के - जो, यदि आप इसे अपने तरीके से करते हैं (निश्चित रूप से चयनकर्ता के साथ) इस घटना को कई बार तत्वों पर रखेगा यदि इसमें कई हैं - जो आपके उदाहरण में आपके द्वारा निहित है।

jQuery.fn.newMethod = function(){ 
    return this.each(function(){ 
     alert(typeof this); 
    }); 
}; 

इस कीवर्ड को आंतरिक फ़ंक्शन (अलर्ट में) के संदर्भ में संदर्भ वर्तमान HTML तत्व को संदर्भित करता है। चूंकि यह एक jQuery नहीं है आपत्ति है। यह (इस jQuery तरीके उपलब्ध नहीं होगा (हालांकि, आप jQuery वस्तु में लपेट उन तरीकों jQuery के रूप में वापस पाने के लिए कर सकते हैं)

jQuery.fn.newMethod = function(){ 
    return this.each(function(){ 
     jQuery(this).css({'background-color':'red'});//each inner element 
    }); 
}; 
संबंधित मुद्दे