您可以使用 jQuery 提供的以下两种方法:
第一个是.live()方法,另一个是.delegate()方法。
第一个的用法很简单:
$(document).ready(function() {
$("#dynamicElement").live("click", function() {
//do something
});
}
如您所见,第一个参数是您要绑定的事件,第二个参数是处理该事件的函数。它的工作方式并不完全像“重新渲染”。执行此操作的常用方法($("#dynamicElement").click(...) 或 $("#dynamicElement").bind("click", ...))通过在 DOM 正确加载($(document).ready(...))时将确定事件的事件处理程序附加到 DOM 元素来工作。现在,很明显,这不适用于动态生成的元素,因为它们在 DOM 首次加载时并不存在。
.live() 的工作方式是,它不是将通风处理程序附加到 DOM 元素本身,而是将其附加到 document 元素,利用 JS 和 DOM 的冒泡属性(当您单击动态生成的元素并且没有附加事件处理程序,它一直在寻找顶部直到找到一个)。
听起来很整洁,对吧?但是这个方法有一点技术问题,正如我所说,它将事件处理程序附加到 DOM 的顶部,所以当你点击元素时,你的浏览器必须遍历整个 DOM 树,直到找到合适的事件处理程序。顺便说一句,这个过程非常低效。这就是 .delegate() 方法出现的地方。
让我们假设以下 HTML 结构:
<html>
<head>
...
</head>
<body>
<div id="links-container">
<!-- Here's where the dynamically generated content will be -->
</div>
</body>
</html>
因此,使用 .delegate() 方法,您可以将其附加到父 DOM 元素,而不是将事件处理程序绑定到 DOM 的顶部。一个 DOM 元素,您确定它将位于 DOM 树中动态生成的内容的某个位置。离他们越近,效果就越好。所以,这应该会变魔术:
$(document).ready(function() {
$("#links-container").delegate("#dynamicElement", "click", function() {
//do something
});
}
这是一个很长的答案,但我喜欢解释它背后的理论哈哈。
编辑:您应该更正您的标记,它是无效的,因为:1)锚点不允许使用值属性,以及 2)您不能有 2 个或更多标签同一个身份证。试试这个:
<a class="removeLineItem" id="delete-1">Delete</a>
<a class="removeLineItem" id="delete-2">Delete</a>
<a class="removeLineItem" id="delete-3">Delete</a>
并确定点击了哪个锚点
$(document).ready(function() {
$("#links-container").delegate(".removeLineItem", "click", function() {
var anchorClicked = $(this).attr("id"),
valueClicked = anchorClicked.split("-")[1];
});
}
使用该代码,您将在 anchorClicked 变量中存储单击的链接的 id,并在 valueClicked 中存储与锚点关联的数字。