jquery $('body').on('click')总是需要.off('click')以避免多个事件触发

Kin*_*ias 4 jquery jquery-on

我有一个页面,我列出我的船员(show_crew.php).该页面使用无限滚动插件运行,就像Google Images一样.首先,我显示10个条目.如果用户到达show_crew.php的底部,则会将旧的"show_crew.php"附加到旧的"show_crew.php",显示接下来的10个条目.

我在show_crew.php中嵌入了一些Jquery函数,我通过它绑定事件

$('body').on('click', 'myButton[rel=<? echo $user['id'] ?>]', function() {
    console.log('foo');
})?
Run Code Online (Sandbox Code Playgroud)

现在,由于show_crew.php被多次追加,因此该事件也多次绑定到同一按钮.我可以通过$('body').off('click', 'myButton')EACH TIME 解决这个问题.

这看起来很难看.有更优雅的方式吗?

谢谢,亚光

zzz*_*Bov 18

您只需要绑定委派的事件一次.每次加载内容时都不要重新绑定.

使用格式$('body').on('click', '...selector...', function () {...})将事件处理程序委托给<body>元素.这意味着主体将捕获所有click事件并检查它们是否发生在匹配的元素上...selector....如果是这样,它将触发事件处理程序,就好像它是在匹配的元素上触发的一样.

一旦添加了委托侦听器,就不必担心重新绑定,因为<body>可以更改子节点,并且委托将保留新元素.这是一件非常好的事情.

  • @MatthiasLang:但是你不必每次都绑定监听器. (2认同)
  • @MatthiasLang为所有按钮提供类似的类,然后使用该类进行绑定,而不是为每个用户绑定事件. (2认同)
  • @MatthiasLang,没有必要关心`[id]`是什么.使用类,如果在事件处理程序中需要上下文,`this`是对匹配元素的引用.`$(this).attr('id')`如果你真的需要它,它会得到处理程序中匹配元素的`[id]`属性. (2认同)