2010-06-24 15 views
30

मैं एक सूची के लिए सामग्री जोड़कर कर रहा हूँ का उपयोग कर संलग्न:Jquery - प्रदर्शन करना कॉलबैक के बाद

$('a.ui-icon-cart').click(function(){ 
     $(this).closest('li').clone().appendTo('#cart ul'); 
    }); 

मैं संलग्न सामग्री के लिए आगे कार्य करने के लिए चाहते हैं (परिवर्तन वर्ग, एनिमेशन आदि लागू)

मैं कैसे कर सकता है इस फ़ंक्शन पर कॉलबैक करें जो मुझे संलग्न डेटा पर फ़ंक्शंस करने की अनुमति देगा?

उत्तर

26

jQuery के .each() कॉलबैक फ़ंक्शन लेता है और jQuery वस्तु में प्रत्येक तत्व के लिए यह लागू होता है।

$('a.ui-icon-cart').click(function(){ 
    $(this).closest('li').clone().appendTo('#cart ul').each(function() { 
    $(this).find('h5').remove(); 
    $(this).find('img').css({'height':'40px', 'width':'40px'}); 
    $(this).find('li').css({'height':'60px', 'width':'40px'}); 
    }); 
}); 

आप, साथ ही परिणाम और काम उस पर बजाय संग्रहीत कर सकती है:

$('a.ui-icon-cart').click(function(){ 
    var $new = $(this).closest('li').clone().appendTo('#cart ul') 
    $new.find('h5').remove(); 
    $new.find('img').css({'height':'40px', 'width':'40px'}); 
    $new.find('li').css({'height':'60px', 'width':'40px'}); 
}); 

मैं भी तरह है कि आप बस सीएसएस mofiying के बजाय कि सुझाव है

कुछ इस तरह की कल्पना इस तरह अपने क्लोन ली में एक वर्ग जोड़ें:

$(this).closest('li').clone().addClass("new-item").appendTo('#cart ul'); 

फिर कुछ शैलियों को सेट करें जैसे:

.new-item img, .new-item li { height: 40px; width: 40px; } 
.new-item h5 { display: none } 
+0

हम्म .. दूसरा उदाहरण अभी भी असीमित रूप से बंद हो जाएगा और अधिकांश मामलों में काम नहीं करेगा जब उन्हें कॉलबैक की आवश्यकता होती है * के बाद * एपेंड करने के लिए * – Trip

+0

मुझे यकीन नहीं है कि आप समझते हैं कि एसिंक का मतलब @ ट्रिप --- वह सब उपरोक्त कोड synch है। इस कोड में कोई एसिंक्रोनस कॉल नहीं हैं। यहां तक ​​कि प्रत्येक के अंदर भी कॉलबैक सिंक्रोनस है, इसे तुरंत कहा जाता है। किसी भी उदाहरण में एकमात्र अंतर यह है कि पहले प्रत्येक मिलान के तत्व के लिए वेरिएबल स्टोर करने के लिए प्रत्येक के अंदर एक नया दायरा बनाता है, अन्यथा उन्हें समान रूप से काम करना चाहिए। – gnarf

+1

मैं गलत था! धन्यवाद :) – Trip

4

आप अर्धविराम पर आगे के संचालन को बरकरार रख सकते हैं।

$(this).closest('li').clone().appendTo('#cart ul').addClass('busy').fade('fast'); 

आदि

+2

मैं एक श्रृंखला में यह लागू होगा कैसे:। $ (this) .find ('h5') को हटाने(); \t \t \t $ (इस) .find ('img') सीएसएस ('ऊंचाई', '40px', 'चौड़ाई', '40px')। \t \t \t $ (इस) .find ('ली') सीएसएस ('ऊंचाई', '60px', 'चौड़ाई', '40px')। – user342391

+1

यह मदद नहीं करता है, प्रश्न यह है कि आप एपेंड ऑपरेशन के बाद कॉलबैक कैसे लागू कर सकते हैं। डीओएम संचालन असीमित रूप से किया जाता है। तो श्रृंखला के अगले भाग में संलग्न सामग्री अभी तक दिखाई नहीं दे रही है। – douwe

16

दुर्भाग्य से डोम ऑपरेशंस में कॉलबैक जोड़ना ऐसा कुछ नहीं है जो जावास्क्रिप्ट का उपयोग करके एक साफ फैशन में किया जा सकता है। इस कारण से यह jQuery पुस्तकालय में नहीं है। टाइमर "1ms" के साथ एक सेटटाउटआउट हमेशा कॉल स्टैक के नीचे सेटटाउटआउट में फ़ंक्शन डालता है। यह काम करता है! Underscore.js लाइब्रेरी _.defer में इस तकनीक का उपयोग करती है, जो वही करता है जो आप चाहते हैं।

$('a.ui-icon-cart').click(function(){ 
    $(this).closest('li').clone().appendTo('#cart ul'); 
    setTimeout(function() { 
     // The LI is now appended to #cart UL and you can mess around with it. 
    }, 1); 
}); 
+2

डोम ऑपरेशंस सिंक हैं, '_.defer' कुछ भी – gnarf

+0

का कोई कारण नहीं है धन्यवाद, यह वही है जो मुझे चाहिए! मेरा मामला एक घटना को बाध्य करने से, कंटेनर में एचटीएमएल इकाई को जोड़ रहा था। इसे थोड़ी देर के लिए काम करने के लिए संघर्ष कर रहे थे ... –

+0

बहुत बढ़िया! सबसे स्पष्ट समाधान नहीं है जिसमें मैंने भाग लिया है, लेकिन यह काम करता है :-) – bestprogrammerintheworld

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