2009-04-20 76 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()功能的实时传播。