2011-11-14 5 views
13

चलो कहते हैं कि मैं एक <ul> सूची करते हैं:कुछ jQuery ऑब्जेक्ट्स में फ़ंक्शन कैसे जोड़ें, लेकिन दूसरों को नहीं?

<ul class="products"> 
    ... 
</ul> 

मैं jQuery के साथ यह चयन करने के लिए है, तो उस वस्तु के लिए कुछ कार्यों को जोड़ने चाहते हैं। उदाहरण के लिए, मैं addProduct(productData) फ़ंक्शन और deleteProduct(productId) फ़ंक्शन जोड़ना चाहता हूं। हालांकि, मैं चाहता हूं कि फ़ंक्शंस केवल उस ऑब्जेक्ट में जोड़ा जाए जो चयनकर्ता द्वारा लौटाया गया हो। तो उदाहरण के लिए, इस तरह कुछ:

var productList = $.extend($('ul.products'), { 
    addProduct: function(productData) { 
     // add a new li item 
    }, 
    deleteProduct: function(productId) { 
     // delete li with id 
    } 
}); 

मैं jQuery का उपयोग करके यह कैसे करूँगा? यहां मुख्य बिंदु यह है कि मैं केवल एक jQuery चयनकर्ता द्वारा लौटाए गए उदाहरण में फ़ंक्शंस जोड़ना चाहता हूं। दूसरे शब्दों में, मैं jQuery के प्रोटोटाइप को संशोधित नहीं करना चाहता हूं या प्लगइन नहीं बनाना चाहता, क्योंकि इससे सब कुछ सब कुछ उपलब्ध हो जाएगा, जबकि मैं केवल एक विशिष्ट उदाहरण में फ़ंक्शंस जोड़ना चाहता हूं।

+1

क्या मैं पूछ सकता हूं कि इस पद्धति का अंतिम उद्देश्य क्या है? –

+0

मैं इसे विधि श्रृंखला में सक्षम होना चाहता हूं, उदाहरण के लिए '$ ('ul.products')। FadeIn()। AddProduct (डेटा);'। साथ ही, यह अन्य jQuery विधियों को कैसे बुलाया जाता है इसके साथ संगत रहता है। –

उत्तर

9

आप केवल addProduct और तरीकों कि एकल jQuery वस्तु पर सुविधा के लिए चाहते हैं, तो क्या तुम ठीक से काम करेंगे मिल गया है; लेकिन addProduct और विधियों के अस्तित्व को संरक्षित रखने के लिए आपको उस jQuery ऑब्जेक्ट का संदर्भ रखना होगा/केवल इसका उपयोग करना होगा।

हालांकि, इन addProduct और विधियां उस विशेष jQuery ऑब्जेक्ट के लिए अद्वितीय हैं; आपके द्वारा बनाए गए किसी भी अन्य jQuery ऑब्जेक्ट्स पर विधियां मौजूद नहीं होंगी;

var productList = $.extend($('ul.products'), { 
    addProduct: function(productData) { 
     // add a new li item 
    }, 
    deleteProduct: function(productId) { 
     // delete li with id 
    } 
}); 

// Using this particular jQuery object (productList) will work fine. 
productList.addProduct(); 
productList.removeProduct(); 

// However, addProduct() does not exist on new jQuery objects, even if they use 
// the same selector. 
$('ul.products').addProduct(); // error; [object Object] has no method 'addProduct' 

सबसे अच्छा तरीका ऐसा करते हैं करने के लिए जाने-बैक-टू-मूल बातें करने के लिए और अलग addProduct और काम करता है, जो एक jQuery वस्तु को स्वीकार परिभाषित किया जाएगा। यदि आप इन कार्यों को प्रतिबंधित करना चाहते हैं तो वे केवल ul.products चयनकर्ता पर काम करते हैं, आप कर सकते हैं;

function addProduct(obj) { 
    obj = obj.filter('ul.products'); 

    // do something with `obj` (its a jQuery object) 
} 

यह दृष्टिकोण के रूप में यह jQuery.fn एपीआई संगत रहता है की सिफारिश की जाएगी; अन्यथा आप addProduct और removeProduct से कुछjQuery.fn उदाहरणों पर नहीं बल्कि अन्य लोगों को, या दूसरों में उनका उपयोग अनावश्यक जोड़ देंगे। इस दृष्टिकोण के साथ हालांकि addProduct और removeProduct हमेशा वहां रहते हैं, लेकिन अगर वे उनका उपयोग नहीं करना चाहते हैं तो किसी भी तरह से न आएं।


ऐतिहासिक नोट्स

इस उत्तर मूल रूप से नवंबर 2011 में, जब jQuery 1.7 जारी किया गया था में लिखा गया था। तब से एपीआई काफी बदल गया है। उपर्युक्त उत्तर jQuery के वर्तमान 2.0.0 संस्करण के लिए प्रासंगिक है।

पहले 1.9, एक छोटे से अधिक इस्तेमाल किया विधि jQuery.sub मौजूद थे कहा जाता है, जो संबंधित तुम क्या करने की कोशिश कर रहे हैं क्या (लेकिन आप मदद नहीं करेगा जब तक आप अपने दृष्टिकोण को बदल) है। यह एक नया jQuery कन्स्ट्रक्टर बनाता है, ताकि आप कर सकें;

var newjQuery = jQuery.sub(); 
newjQuery.fn.addProduct = function() { 
    // blah blah 
}; 
newjQuery.fn.deleteProduct = function() { 
    // blah blah 
}; 

var foo = newjQuery('ul.products'); 
foo.deleteProduct(); 
foo.addProduct(); 

var bar = jQuery('ul.products'); 
bar.deleteProduct(); // error 
bar.addProduct(); // error 

हालांकि सावधान रहो, $ विधि उर्फ ​​वर्ष jQuery वस्तु संदर्भ होता है, बल्कि newjQuery उदाहरण से।

jQuery.sub को jQuery से 1.9 में हटा दिया गया था।अब यह as a plugin उपलब्ध है।

1

आप इस प्रकार अपने स्वयं के jQuery तरीकों बना सकते हैं:

$.fn.addProduct = function(){ 
    var myObject = $(this); 
    // do something 
} 

// Call it like: 
$("ul.products").addProduct(); 

यह हालांकि थोड़ा मुश्किल है, क्योंकि आप तरीकों कि सूची में अलग होते हैं कर रहे हैं। इसलिए, यह सुनिश्चित करने के लिए कि आपको कम से कम ऑब्जेक्ट के प्रकार पर कुछ जांच जोड़नी चाहिए और यदि मौजूदा ऑब्जेक्ट है तो कोड को सही तरीके से संभाल लें, आइए इनपुट इनपुट कहें।

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

+0

यही वह है जिसे मैं ढूंढ रहा था और यह काम करता था क्योंकि मुझे उम्मीद थी कि यह चाहिए/चाहिए .. और, ऐसा लगता है कि मूल सवाल अच्छी तरह से जवाब देता है .. यह क्यों नीचे मतदान किया गया था? – wasatchwizard

+0

मुझे मारता है ... मुझे नहीं लगता कि यह गलत क्यों है। लेकिन अगर आप चाहें तो आप ऊपर चढ़ सकते हैं। किसी भी स्थिति में। खुशी है कि मैं किसी भी मदद की हो सकती है;) –

+0

पार्टी के देर से मुझे पता है, लेकिन ओपी ने अपने प्रश्न में कहा; * हालांकि, मैं चाहता हूं कि फ़ंक्शंस केवल उस ऑब्जेक्ट में जोड़ा जाए जो कि चयनकर्ता द्वारा वापस किया जाता है। *, सभी jQuery ऑब्जेक्ट्स की बजाय, जो यह उत्तर करता है ... हो सकता है कि डाउनवोट का कारण हो (हालांकि मैं ' एम डाउनवॉटर नहीं) – Matt

1

मुझे लगता है कि आप उस DOM ऑब्जेक्ट में कोई फ़ंक्शन जोड़ना चाहते हैं।

$(function(){ 
    // [0] gets the first object in array, which is your selected element, you can also use .get(0) in jQuery 
    $("#test")[0].addProduct = function(info){ 
     alert("ID: " + this.id + " - Param: " + info); 
    }; 


    $("#test")[0].addProduct("productid"); 
}); 

स्क्रिप्ट से ऊपर सचेत wil "ID: परीक्षण - परम: productId"

एक लाइव उदाहरण: http://jsfiddle.net/jJ65A/1/

या सामान्य जावास्क्रिप्ट

$(function(){ 
    document.getElementById("test").addProduct = function(info){ 
     alert(info); 
    }; 
}); 
-1

मुझे लगता है कि हो सकता है सिर्फ प्रतिनिधि का उपयोग किया jQuery में:

$(".parentclass").delegate("childclass","eventname",function(){}); 
+0

या तो आपने गलत प्रश्न का उत्तर दिया, या आपने सवाल नहीं पढ़ा ... यह सवाल पूछने के लिए कोई प्रासंगिकता नहीं है। – Matt

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