将事件附加到动态生成的HTML
Attaching events to dynamically-generated HTML?
将静态html表转换为JavaScript生成的表时遇到问题。以前,我的js/jQuery代码在表中的数据元素上设置了点击处理程序,如下所示:
$(function() {
$('my_table td').click(function(e) {
...handler code
});
这很好,但我不得不更改我的表,以便在JavaScript:中动态生成内容
// 'table_contents' is "<table><tbody>...</tbody></table>"
$('#my_table').html(table_contents);
当我这样做时,我会丢失单击处理程序。我想这并不奇怪,因为我只是删除了旧的html并用新的html替换它。然而,我不知道如何正确处理这个问题。我可以给我的匿名函数一个名称,并在更改html时调用它吗?还是必须做其他事情,比如向每个新的td
元素显式添加一个事件侦听器?在替换旧的html之后,我是否必须做任何事情来清理,比如释放旧的处理程序/侦听器?js是否存在必须手动修复的内存/资源泄漏?
编辑
很抱歉对此感到愚蠢,但我无法让建议的on/delete解决方案发挥作用。我的测试html是:
<div id="date_test">
<table><tbody><td>42</td></tbody></table>
</div>
我试着用三种不同的方式回应点击td
'42':
$("#date_test").on("click", "td", function() {
alert($(this).text());
});
$('#date_test').delegate('td', 'click', function() {
alert($(this).text());
});
$(function() {
$('#date_test td').click(function() {
alert($(this).text());
})
})
其中,只有第三个有效。请注意,这完全是静态代码;这是3个不同的精简测试用例。对于前两种情况,代码从不执行;我可以输入语法错误而不是警报,这没有什么区别。知道我做错了什么吗?我在jQuery 1.7上。
您可以使用on
方法将事件处理程序委托给祖先元素。假设此时DOM中存在#my_table
,则执行以下代码:
$("#my_table").on("click", "td", function() {
//Do stuff
});
on
方法仅在jQuery 1.7+中可用。如果您使用的是旧版本,则可以使用delegate
。
这之所以有效,是因为DOM事件是从它们通过DOM产生的元素开始的。事件在祖先上捕获,如果起源与选择器匹配,则触发事件处理程序。
这不仅提供了处理源自最初不属于DOM的元素的事件的好处,还可以提高性能,因为它需要更少的事件处理程序(如果将事件处理程序绑定到每个td
,并且有很多td
元素,那么就有很多事件处理程序-使用事件委派意味着只有一个)。
更新(请参阅问题编辑)
第三个示例之所以有效,是因为您已经将代码封装在ready
事件处理程序中。$(function() { ... });
是$(document).ready(function() { ... });
的简写。
这是必要的,因为否则要将事件处理程序绑定到的#date_test
元素将不存在于DOM中。如果您正在执行任何DOM操作,请始终将代码放在就绪的事件处理程序中。
您可以将on
版本或delegate
版本放在就绪事件处理程序函数中,它应该可以工作。
我最近遇到了同样的问题。事实证明,JS加载后进入页面的元素不会附带事件。我通过使用委派很容易地解决了这个问题http://api.jquery.com/delegate/.它通过父元素向上传播事件,直到它们被捕获并执行为止。诀窍是确保将事件委托给一个元素,该元素在第一次加载js时始终存在,因此添加到该容器中的任何新元素都将捕获其事件。
$('#container').delegate('#my_table td', 'click' (function(e) {...
根据您使用的jquery版本,您可以尝试使用jquery.on()
http://api.jquery.com/on/
如果你使用的是旧版本,那么.delete()将为你工作:
http://api.jquery.com/delegate/
您可以使用on()方法http://api.jquery.com/on/
$("#my_table td").on("click", function(event){
alert($(this).text());
});
- 使用jQuery根据动态生成的html动态添加html
- HTML动态更新滑块输入
- 无法从HTML动态表中获取数据
- Python/JavaScript/HTML 动态创建计算机网络图
- 从 html 动态调用 javascript 对象函数
- 通过内部HTML动态创建日历不起作用
- 如何将节点内容从 xml 复制到硬编码的 html(动态到原始 html)
- 为什么我无法使用jQuery将HTML动态添加到页面
- 如何读取html表中复选框的值,该表是作为内部html动态插入到表单元格中的
- 如何使用Javascript获取HTML动态用户输入的值
- 从html动态加载angularjs控制器
- Html动态错误javascript Uncaught TypeError:$不是函数
- 如何将html动态嵌入到框架标记中
- HTML动态裁剪
- 使用jQuery和HTML动态创建标签,并使用jQuery访问其文本值
- HTML动态/响应式元素定位
- 我如何使用下面的html动态创建wordcloud为我的android应用程序
- 使用.html()动态更改数据后单击function
- JavaScript中的Html动态表
- JS/HTML——动态创建带有选项的select元素