2012-01-26 91 views
4

這應該很簡單吧?然而,我不能在任何地方找到這種功能的例子。問題是,我做了一個replaceWith()之後,我想對那些寫入DOM的元素做些事情,但是如果我在replaceWith()調用之後嘗試對它們做些什麼,它們現在還不存在我需要確保replaceWith()完全完成。我只是想要這樣的工作:如何擴展jQuery的replaceWith函數來接受回調函數?

$('#foo').replaceWith('some text', function() { 
    //do something else here 
}); 

想法?

+5

能告訴你,當你嘗試做處理它隨即不工作的代碼? 'replaceWith'不是異步的,所以這應該可以正常工作。 *編輯*我的賭注是你試圖用'#foo'做一些事情,但它不會存在,因爲你只是替換它... – lonesomeday

+3

爲什麼你需要一個回調,如果'replaceWith'不是異步?你可以在調用'replaceWith'之後馬上調用你的方法。 – ShankarSangoli

+1

http://stackoverflow.com/questions/2465431/jquery-fadeout-replacewith-animate-almost-working http://stackoverflow.com/questions/5248721/jquery-replacewith-fade-animate – Alex

回答

4

你可以讓自己的函數調用replaceWith

$.fn.replaceWithCallback = function(replace, callback){ 
    var ret = $.fn.replaceWith.call(this, replace); // Call replaceWith 
    if(typeof callback === 'function'){ 
     callback.call(ret); // Call your callback 
    } 
    return ret; // For chaining 
}; 
+3

我知道我很晚在這可能會幫助別人。這不是這個問題的正確解決方案。雖然一個函數會被他的需求調用,但它不可能作爲回調工作。他在他的要求中明確提到「如果我在replaceWith()調用之後嘗試對它們做些什麼,它們不存在,所以我需要**確保replaceWith()完全結束**」。它可能在函數執行前以某種方式替換返回值,但那只是運氣。所以我建議不要使用這種方法來創建回調。 –

+1

@ Jehanzeb.Malik:'replaceWith'是同步的。我的猜測是他試圖使用緩存的jQuery對象。像'var $ a = $('#foo'); $ a.replaceWith( 'A');'。試圖使用'$ a'將不起作用,因爲該元素不再存在。 –

+0

我有同樣的問題,嘗試:'toUpdate.find('。inscription')。replaceWith(inscription);''initAddInscription(toUpdate.find('。inscription'));' –

0

做簡單的創建回調功能:

$("#myElement").replaceWith(function() { 
 
    // call a function 
 
);

和替換單詞而不是內部HTML :

$("#derp").text(function(index, text) { 
 
    // call a function here 
 
    return text.replace('old', 'new'); 
 
});