2009-04-20 75 views
19

當我replaceWith一個元素帶出一個DOM,然後replaceWith它回來,註冊到它的事件不會觸發。我需要事件保持完好。活動沒有註冊後replaceWith

這裏是我的javascript:

var replacement = $(document.createElement('span')); 
var original = $(this).replaceWith(replacement); 

replacement 
    .css('background-color', 'green') 
    .text('replacement for ' + $(this).text()) 
    .click(function() { 
     replacement.replaceWith(original); 
    }); 

Live demo

在演示中,當你點擊一個元素,它會被替換使用replaceWith另一個元素。當您單擊新元素時,將使用replaceWith替換爲原始元素。然而,點擊處理程序不再工作(我認爲它應該)。

+1

您是否最終使用活動重新附件,或者您是否能夠使Live活動正常工作?我正在做同樣的事情,並希望從您的經驗中學習。 – 2011-02-04 03:00:52

+0

@Erick T,我很抱歉,但我真的不記得了。差不多兩年前我問過這個問題。我認爲使用`$ .fn.live`不起作用,因爲我正在處理實際的元素,而不是選擇器。 (`$ .fn.delegate`(它當時不存在)可能會作爲`live`替代品)。由於我選擇的答案,我假設我最終重新附加了事件處理程序。您也可以嘗試深入克隆元素(IIRC可能會將事件處理程序保留在最新的jQuery中)。 – strager 2011-02-04 03:07:49

回答

11

因爲當您替換原始元素時,綁定到它的事件將被刪除。你需要在調用之後重新連接上originalclick事件處理程序replacement.replaceWith(original)

$(function() 
{ 
    function replace() 
    { 
     var replacement = $(document.createElement('span')); 
     var original = $(this).replaceWith(replacement); 

     replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .click(function() 
     { 
      replacement.replaceWith(original); 
      original.click(replace); 
     }); 
    } 

    $('.x').click(replace); 
}); 
+2

我希望有一個自動/優雅的方式來做到這一點。我想這個解決方案將不得不做。 – strager 2009-04-21 02:25:42

4

UPDATElive()bind()已棄用,在贊成on()

您可以使用live()bind()事件,這是你新的代碼:

$(function() { 
$('.x').live('click', function() { 
    var replacement = $(document.createElement('span')); 
    var original = $(this).replaceWith(replacement); 

    replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .bind('click', function() { 
      replacement.replaceWith(original); 
     }); 
}); 
}); 

-Live事件工作與jQuery 1.3和上部。

如果您想停止使用die()功能的實時傳播。