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