1

我遇到了一个奇怪的问题,切换按钮的可见性似乎会影响在该按钮上调用点击事件的次数。

如果我使用:$('button').on('click'...),单击按钮,只要在单击它之前完成整个页面加载,就会发生 1 次单击事件。相反,如果我通过 AJAX 加载包含按钮的页面片段,然后单击按钮,则该on()函数会触发多个单击事件,每次以这种方式加载页面时都会添加一个。

我可以通过使用来限制这些多次点击$('button').one('click', ...但我想知道这是否太hack-ish,最好先解决导致多次点击事件触发的原因。

在切换可见性-/+ AJAX 页面加载影响点击处理程序触发多少点击事件之前是否遇到过这个问题?

谢谢,

蒂姆

4

2 回答 2

1

我想这根本不是因为 One() 的 jQuery Docs 的hack-ish第一行描述了这个函数的设计目的。

将处理程序附加到元素的事件。每个元素最多执行一次处理程序。

这很容易说它可以防止多次引发事件。

该函数的内部工作原理也与@mgraph 提到的相同,在文档中提到:

此方法的第一种形式与 .bind() 相同,只是处理程序在第一次调用后是未绑定的。jQuery 1.7 中引入的后两种形式与 .on() 相同,只是在委托元素第一次发生事件后删除了处理程序,无论选择器是否匹配任何内容。

再详细一点——

此方法通常使用/将事件绑定到处理程序,并且一旦事件发生一次且仅一次,它使用/取消绑定事件.bind().on().unbind().off()

于 2012-04-28T20:14:43.003 回答
1

如果您通过 AJAX 加载元素,您希望使用 .on() 的绑定属性将其绑定到页面加载时存在的元素。例如,$("body").on("click", "p", ...不仅在页面加载时,而且在任何 AJAX 调用之后,都会将 click 元素绑定到 p 标签。如果您只是这样做$("p").on("click", ...,则只会在页面加载时将 click 事件绑定到 p 元素。因此,在第一个示例中,您选择要绑定到的元素的父元素(希望比主体更具体),然后在对 .on() 的调用中指定该元素。因此,在您的情况下,您可能想尝试,$('body').on('click','button', ...).

哦,顺便说一句,从 jQuery 1.7 开始,.on() 和 .off() 方法更适合在 .bind() 和 .unbind() 元素上附加和删除事件处理程序。

于 2012-04-28T20:19:40.690 回答