2009-05-21 16 views
24

में नया एक वापस लौटना, आप jQuery में किसी तत्व को कैसे प्रतिस्थापित करते हैं और हटाए गए तत्व के बजाय प्रतिस्थापन तत्व लौटाया गया है?एक तत्व को प्रतिस्थापित करना और jQuery

मेरे पास निम्न परिदृश्य है। मेरे पास कई चेकबॉक्स हैं और एक बार जब आप उनमें से किसी एक पर क्लिक करते हैं, तो चेकबॉक्स को लोडिंग आइकन द्वारा प्रतिस्थापित किया जाता है। एक बार कुछ AJAX सामान होता है, तो लोडिंग आइकन को एक टिक आइकन द्वारा प्रतिस्थापित किया जाता है।

का उपयोग jQuery के replaceWith, आप की तरह कुछ करना चाहते हैं: क्योंकि replaceWith रिटर्न तत्व यह है कि हटा दिया गया था, नहीं एक जो जोड़ दिया गया

$("input[type='checkbox']").click(function() { 

    $(this).replaceWith("<img src='loading.jpg' alt='loading'/>"); 
    $.post("somepage.php"); 
    $(this).replaceWith("<img src='tick.jpg' alt='done'/>"); 

}); 

बहरहाल, यह काम नहीं करता। तो AJAX सामान पूरा होने के बाद, loading.jpg बस हमेशा के लिए रहेगा।

क्या कोई तरीका है कि मैं इसे चुनने के बिना प्रतिस्थापन तत्व वापस कर सकता हूं?

अग्रिम धन्यवाद।

उत्तर

22

, लोडिंग छवि एक वर्ग दें तो पद कॉलबैक में, छवि तुम सिर्फ इंजेक्शन गया है खोजने के लिए एक चयनकर्ता के रूप में वर्ग का उपयोग ।

$("input[type='checkbox']").click(function() { 
    $(this).replaceWith("<img src='loading.jpg' alt='loading' class='loading-image' />"); 
    $.post("somepage.php", function() { 
     $('.loading-image').replaceWith("<img src='tick.jpg' alt='done'/>"); 
    }); 
}); 

आप इन एक समय में चल के कई हो सकता है, तो आप this के निकटतम माता पिता हो और का उपयोग इस संदर्भ के रूप में जब वर्ग के लिए खोज कर सकते हैं।

EDIT: नया तत्व संग्रहीत करने के लिए एक चर का उपयोग करने वाला एक और विकल्प और कक्षा को लागू करने की आवश्यकता को हटा देता है और फ़ंक्शन लौटाते समय नए तत्व की खोज को हटा देता है।

$("input[type='checkbox']").click(function() { 
    var loading = $("<img src='loading.jpg' alt='loading' />"); 
    $(this).replaceWith(loading); 
    $.post("somepage.php", function() { 
     loading.replaceWith("<img src='tick.jpg' alt='done'/>"); 
    }); 
}); 
+4

एक .loading-image क्लास का उपयोग करने के बजाय, क्या आप केवल लोडिंग आईएमजी के संदर्भ को नहीं रख सकते हैं और कॉलबैक में डाल सकते हैं, इसके बजाय इसे $ ('लोडिंग-इमेज') के साथ पुनः खोज रहे हैं? – cdmckay

+0

प्रश्न (और उत्तर) प्रतिस्थापित करने के लिए विशिष्ट था जिसके द्वारा निकाला गया तत्व लौटाता है, न कि तत्व बनाया गया था। आप तत्व बना सकते हैं और एक चर में इसका संदर्भ संग्रहीत कर सकते हैं, फिर प्रतिस्थापन करें। उस स्थिति में, मुझे लगता है कि हाँ आप संदर्भ का उपयोग कर सकते हैं और इसे फिर से नहीं देख सकते हैं। – tvanfosson

2

आप इसे एक विशिष्ट आईडी सूचकांक का उपयोग कर दे सकता है:

$("input[type='checkbox']").click(function() { 
    var index = $("input[type='checkbox']").index(this); 
    $(this).replaceWith("<img src='loading.jpg' id='myLoadingImage" + index + "' alt='loading'/>"); 
    $.post("somepage.php"); 
    $('#myLoadingImage'+index).replaceWith("<img src='tick.jpg' alt='done'/>"); 

}); 
+0

क्षमा करें, मुझे स्पष्ट होना चाहिए था। मेरे पास इनमें से कई चेकबॉक्स हैं, इसलिए मैं आईडी पर भरोसा नहीं कर सकता। –

+0

मैंने कोड अपडेट किया। अब यह चेकबॉक्स की अनुक्रमणिका का उपयोग कर एक अद्वितीय आईडी प्राप्त करता है। –

+0

हालांकि tvanfosson की तुलना में तेज़, यह अभी भी एक अपर्याप्त खोज है, Keeper के उत्तर पर एक नज़र डालें। – cdmckay

13

एक तत्व बनाएँ और replaceWith को पैरामीटर के रूप में इसका इस्तेमाल करते हैं?

 

$('input[type=checkbox]').click(function() { 
    var img = document.createElement('img'); 
    img.src = 'loading.jpg'; 
    $(this).replaceWith(img); 
    $.post('somepage.php', function() { 
     $(img).replaceWith('<img src="tick.jpg" alt="done"/>'); 
    }); 
}); 
 
+0

मुझे यह पसंद है, अतिरिक्त कक्षाओं या आईडी के साथ कोई अव्यवस्था नहीं है, आप जानते हैं कि वास्तव में कौन सी आईएमजी प्रतिस्थापित करने के लिए है। बहुत साफ। –

+1

+1 इसे तब तक नहीं देखा जब तक कि मैंने इसी तरह के कोड के साथ अपना जवाब अपडेट नहीं किया। नया तत्व बनाने के लिए मैं अभी भी jQuery का उपयोग करता हूं। – tvanfosson

-1

क्यों इस तरह एक मध्यवर्ती jQuery वस्तु नहीं बनाने के लिए, ...

$("input[type='checkbox']").click(function() { 
    var insertedElement = $("<img src='loading.jpg' alt='loading'/>"); 
    $(this).replaceWith(insertedElement); 
    $.post("somepage.php"); 
    var anotherInsertedElement = $("<img src='tick.jpg' alt='done'/>"); 
    $(this).replaceWith(anotherInsertedElement); 
    //do something with either of the inserted elements 
}); 
+0

आपके पास इस कोड –

+0

में सिंटैक्स त्रुटियां हैं, इसके अतिरिक्त, मूल चेकबॉक्स $ (यह) का संदर्भ प्रतिस्थापन के बाद खो गया है विधि के साथ, इसलिए सिंटैक्स त्रुटियों को ठीक करने के बाद भी, यह काम नहीं करता है। –

+0

इसके अलावा, $। पोस्ट अतुल्यकालिक है। – cdmckay

0

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

आपकी सबसे अच्छी शर्त पोस्ट कॉलबैक फ़ंक्शन का उपयोग करना है जो tvanfosson सुझाता है।

0

इसे जांचें।

$.fn.replaceWithMod = function(obj) { 
var $a = $(obj); 
this.replaceWith($a); 
return $a; 
}; 

var newObj = $('a').replaceWithMod('<div>New Created Object</div>'); 
$(newObj).css('color','green'); 
0

मैं क्योंकि मैं कोड की एक पंक्ति में नए आइटम के लिए एक सूचक को पुनः प्राप्त करने में सक्षम होना चाहते एक समान परिणाम प्राप्त करने के एक छोटे से प्लगइन लिखा था।

(function($){ 
    $.fn['overwrite'] = function(target){ 
     $(target).replaceWith(this); 
     return this; 
    } 
}(jQuery)); 

प्रयोग उदाहरण:

$("input[type='checkbox']").click(function() { 
    var $loading = $("<img src='loading.jpg' alt='loading' class='loading-image' />").overwrite(this); 
    $.post("somepage.php", function() { 
     $loading.replaceWith("<img src='tick.jpg' alt='done'/>"); 
    }); 
}); 
0

अगर वहाँ विशेष रूप से replaceWith विधि का उपयोग करने एक आवश्यकता नहीं है - आप replaceAll तरीका है जिसके replaceWith के विपरीत है इस्तेमाल कर सकते हैं।

जवाब यहाँ देखें: (answer to a similar question asked a year later) replaceAll वस्तु पैरामीटर या मिलान किया तत्वों के साथ पैरामीटर के रूप में पारित कर दिया चयनकर्ता मिलान तत्व के रूप में पारित कर दिया में प्रत्येक तत्व बदल देता है और मिलान किया तत्वों (नई सामग्री) देता है।

इस तरह, tvanfosson के जवाब में संपादित करें (और कीपर के जवाब में कोड) इस प्रकार दिखाई देगा:

$("input[type='checkbox']").click(function() { 
    var loading = $("<img src='loading.jpg' alt='loading' />").replaceAll($(this)); 
    $.post("somepage.php", function() { 
     loading.replaceWith("<img src='tick.jpg' alt='done'/>"); 
    }); 
}); 

यह केवल एक लाइन में कम है, लेकिन संक्षिप्तता के लिए और replaceAll उपयोग करने का विकल्प शामिल करने के लिए() मैंने इस जवाब को इस पुराने और अधिक देखे जाने वाले प्रश्न में जोड़ने के लिए उपयुक्त देखा।

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