在jQuery中执行.replaceWith()时,不会保留事件绑定

在jQuery中执行.replaceWith()时,不会保留事件绑定,jquery,ajax,event-handling,replacewith,Jquery,Ajax,Event Handling,Replacewith,这里有一个简明的例子 请记住.chat reply类绑定了一个click事件处理程序 HTML(回复按钮): 上面成功回调中的“数据”将替换整个容器div,包括child.chat回复按钮。在此replaceWith()之后,单击事件不再绑定到按钮 从逻辑上讲,我试图让最终用户将消息发布到时间线上,然后在时间线上显示该消息,而无需刷新屏幕。抓取现在使用“开”绑定的jquery 1.7: 或者,如果

这里有一个简明的例子

请记住.chat reply类绑定了一个click事件处理程序

HTML(回复按钮):

上面成功回调中的“数据”将替换整个容器div,包括child.chat回复按钮。在此replaceWith()之后,单击事件不再绑定到按钮


从逻辑上讲,我试图让最终用户将消息发布到时间线上,然后在时间线上显示该消息,而无需刷新屏幕。

抓取现在使用“开”绑定的jquery 1.7:

或者,如果<1.7,则使用“live”而不是“bind”,因为它将查找DOM更改并重新应用更改内容的事件。如果没有,您可以在回调上重新应用该事件

要替换的旧api在DOM更改后与活动类型事件处理程序绑定

这个 $(选择器).live(事件,fn)

变成这样 $(文档).on(事件,选择器,fn)

还是用代码

这个

在1.7中变成这个

$(".container").on("click", "a.chat-reply", function(event){
 // do it live!
});

使用各种选项来选择所需的对象。

在单击处理程序中,使用.on()作为委托

$("div.container").on("click", "a.chat-reply", function(even){
  //click handler here
});

事件将“冒泡”到容器,如果它与.chat-replay匹配,它将触发

选择了一个不那么优雅的解决方案,部分原因在于这篇文章:

我创建了一个名为wireUpChatReply()的函数,该函数将单击事件绑定到.chat reply按钮

然后在replaceWith()之后,我调用wireUpChatReply()来重新绑定事件。我在document.ready上给wireUpChatReply打了同样的电话


这并不漂亮,但很有效。

关于实时事件的两个答案并不能解决问题,因为容器本身被替换,事件绑定也消失了

您可以执行以下操作,而不是重新绑定事件(在这种情况下,您需要知道已绑定的事件):

$(".container").parent().on("click", ".container a.chat-reply", function(){
  // do something
});
或者,如果有多个容器:

$(document.body).on("click", ".container a.chat-reply", function(){
  // do something
});

“冒泡”起作用了,但是一旦我执行replaceWith(),这些事件绑定就消失了——当然,仍然如此。my bad,replaceWith将替换整个元素。您可以改为使用.html(content)吗?将替换其内容,而不是.container元素。否则,您必须开始查看.container的祖先以将.on事件处理程序附加到.eww。那会变得很糟糕。我发现另一篇文章建议使用一个函数“连接”事件绑定。然后在replaceWith()之后再次调用它。它并不漂亮,但我可能没有太多的选择。此外,我考虑过.html(内容)方法,但它只是在后端进行了太多的其他工作,使这种方法更有效。这里有一个类似问题的链接:您的代码示例让我有点困惑。如果你不介意澄清一点,那就太好了。Sry块只是从旧的“live”指向“on”,但Vigrond的例子是如何进行“on”。在回调中收到html后附加事件几乎更好。
$("div.container").on("click", "a.chat-reply", function(even){
  //click handler here
});
$(".container").parent().on("click", ".container a.chat-reply", function(){
  // do something
});
$(document.body).on("click", ".container a.chat-reply", function(){
  // do something
});