防止绑定事件在 ajax 更新后失效
08 Nov 2014 - by @liuyuel

问题:

最近在为网页元素添加点击事件,在测试过程中发现元素的点击事件在有 ajax 更新后失效。就是说假如为页面上的 button 加上一个点击事件:

$('button').on('click', function() {
  console.log('click');
});

之后页面可能通过 ajax 或者其他原因,新增了一些 button 元素,而这些新增的 button 是没有点击事件的。这是因为上面的 $.on 只为在代码执行时已经存在的元素绑定。

解决办法:

通过 Google 我们可以很快找到解决办法,那就是用 $.live

$('button').live('click', function() {
  console.log('click');
});

然而,由于种种原因$.live 已经被新版本的 jQuery 拿掉了。不过,$.on 也统合了 $.live 方法,所以,我们可以稍作改写:

$(document).on('click', 'button', function() {
  console.log('click');
});

这样,问题就真正解决了。

Bonus:

由于本人项目使用 dojo,所以也得找出 dojo 版本的解决之道啊。

// dojo version 1.7
dojo.require('dojox.NodeList.delegate');

dojo.query(document).delegate("button", "onclick", function() {
  console.log("click");
});