2

我正在使用 jQuery 数据表来显示一些数据。每行都有一个编辑按钮,我用 注册了一个单击处理程序live(),以便它与分页一起使用。我是按班级做的,因为我必须为每一行做。类似于: 具有实时点击事件功能的数据表

这很好用,但是当用户再次进行搜索并且我执行 ajax 请求以获取一组新结果时,就会出现问题。

我只是将 dom 中的现有表替换为新表。现在,当我单击第 1 行时,它会弹出第 1 行的编辑对话框。我单击第 2 行,它会弹出第 1 行的编辑对话框。我再次单击第 2 行,它会弹出第 2 行的编辑对话框。

然后我一次又一次地点击第 3 行。它在显示第 3 行的对话框之前三次弹出第 2 行的编辑对话框。

这不断增加。我不明白如果我用 jQuery 替换 div 中的整个 dataTable 为什么要注册多个事件?

万一这很重要,我在我的对话框初始化程序中将 autoopen 设置为 false 并且我明确地打开和关闭它。

编辑(更多细节)

我很难创建一个示例......但是更多细节......我发现由于我使用live()函数来注册跨分页的调用,因此存在点击注册机制。因此,当我用相同的结构替换表时,由于第一次调用live(). 但是我默认情况下会再次调用live(),现在注册了两个点击事件。然后当我再次替换时,注册了三个事件点击。click()在检查单击事件是否已注册后,我尝试通过使用 jQuery 注册事件来克服这个问题。帮助处理多个事件部分,但不跨数据表页面注册事件。

4

2 回答 2

0

live和ajax有这个问题。我最终做的是在收到 ajax 响应后重新注册事件点击。如果没有示例,很难推荐解决方案,但想法是使用绑定/单击(用于默认/初始显示)在页面加载时附加单击事件,然后在成功的 ajax 响应时再次重新注册单击事件。当然,将事件绑定代码放在函数等可重用组件中,这样就可以轻松调用它。

于 2012-10-06T05:56:54.470 回答
0

修复了问题

问题是我不能只注册数据表行中元素的点击事件。这些事件不会跨数据表页面注册。

使用 live() 注册事件有帮助,在页面更改时,事件将自动注册。

但是对于我每次搜索都会导致另一个问题的用例,我会用新的数据表替换数据表。新的数据表将再次注册这些事件。所以这意味着要为同一个元素调用多个处理程序。因为 live() 函数在同一个类上被调用了两次,并且 jquery 不应该比较两个回调处理程序是否相同。

我转向不同的方向,并尝试使用页面事件(http://datatables.net/docs/DataTables/1.9.beta.1/ #page_details)。这没有帮助,因为在使用新页面上的事件刷新内容之前调用了页面更改事件。

我还尝试使用 click() 而不是 live() 并仅在尚未使用此处给出的示例注册时才绑定 click https://stackoverflow.com/a/6361507/161628。这种技术适用于表替换,但不适用于多个页面。

最终我找到了 .die() 函数。我在调用 live() 函数之前调用它。对 live() 的调用确保在页面更改时注册事件处理程序,而对 die() 的调用确保我取消注册之前在该类的元素上生成的 live() 事件。我避免以这种方式多次调用 live() 函数。

于 2012-10-06T16:04:13.897 回答