
问题来由
最近在项目中有涉及到排序后回写按钮元素,按钮的事件失效。
这可以分为一类问题:重写元素/动态生成元素后,事件的失效。
想给每一行的 td>button添加点击事件
<td class="action">
<button class="mark" name="ignore"
</button>
</td>
给表格数据排序后,表格中的按钮事件失效。追溯了一下原因,排序后,初始化事件无法获取到button.
类似问题:
- 动态增加删除子节点
- 表格排序后的节点
解决办法
原理是利用冒泡实现事件委托,也就是给生成节点的父节点预先绑定事件。
jq的解决办法:
$('.tablesort').on('click','.mark',function () {})
这里提一下:
早期对页面上后期加载的动态元素,赋事件或值的时候,是使用live的.
由于效率比较低(其实数据不多也感觉不出来),后面使用delegate委托来代替了,
再后面,1.7以后使用on 来代替delegate了. live,delegate在新版本中都还可以用
网上有很多教程是利用 $('.action .mark').live('click',function () {}),但是现在不建议使用
参考
原生js
http://www.jianshu.com/p/88164e43d7b3
- 使用这个事件对象给父节点绑定事件
- 当事件触发的时候判断事件源对象是否是按钮
- 如果是按钮的话再执行事件行为
网友评论