jQuery不适用于文档加载后创建的元素

时间:2013-11-03 21:18:07

标签: javascript jquery html

我用jQuery创建了两个元素:

一张照片 和关闭按钮

我编写了代码以删除doument.ready函数:

$( ".deletepreview" ).click(function() {
    code = $(this).data("prevcode");
    $('#'+code).remove();
    $(this).remove();
});

但它不起作用,我认为这是因为代码不会搜索文档加载后创建的代码。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:31)

如果您希望在动态添加的元素上处理事件,则需要通过on()使用委派事件:

$(document).on("click", ".deletepreview",function() {
  var code = $(this).data("prevcode");
  $('#'+code).remove();
  $(this).remove();
});

我稍微修改了你的例子:除非你需要,否则总是在闭包中用var声明变量。

答案 1 :(得分:8)

对于动态创建的元素,请尝试使用on代理,例如:

  

事件处理程序仅绑定到当前选定的元素;他们   在您的代码调用.on()时页面上必须存在。   要确保元素存在且可以选择,请执行事件   绑定在文档就绪处理程序中的元素   页面上的HTML标记。如果将新HTML注入页面,   选择元素并在新HTML之后附加事件处理程序   放入页面。或者,使用委派事件来附加事件   处理程序,如下所述。

     

委派事件的优势在于它们可以处理来自的事件   稍后添加到文档中的后代元素。通过   选择一个保证在当时存在的元素   委托事件处理程序附加,您可以使用委托事件   避免频繁附加和删除事件处理程序的需要。这个   element可以是a中视图的容器元素   例如,模型 - 视图 - 控制器设计,或者如果事件是文档   handler希望监视文档中的所有冒泡事件。该   文档元素在之前的文档头部中可用   加载任何其他HTML,因此可以安全地在那里附加事件   等待文件准备好。

代码:

$('body').on('click', '.deletepreview', function() {
  var code = $(this).data('prevcode');
  $('#'+code).remove();
  $(this).remove();
});