3

我有一个页面,上面有一个产品配置器,这个配置器使用 ajax .load 为不同的产品加载配置器。

如果有人配置产品,点击提交,产品被添加,如果用户再次选择配置器,并加载相同的产品,配置器的所有事件都会加倍。意思是,所有事件都会触发两次......

重置这些事件或防止这些事件多次触发的最佳方法是什么?

4

3 回答 3

3

我不知道你用什么语法来绑定,但如果你使用 jQuery 1.7 使用on()你可以这样:

$("#myButton").off("click").on("click", function(){
    // ....
});

这将确保首先未绑定所有点击事件,然后绑定您的点击事件。但是,这会带来风险,如果您有许多通过命名空间绑定的点击事件,即使这不是您的意图,它们也可能会被删除。

如果事件正在使用命名空间,它可能如下所示:

$("#myButton").off("click.myNamespace").on("click.myNamespace", function(){
    // ....
});

如果您需要绑定一个事件并且只想使用它,然后自动取消绑定,您可以像这样使用one()

$("#myButton").one("click", function(){
    // ....
});

只是为了澄清一下,您当然可以单独使用off()orunbind()而不将它们链接到on()orbind()等​​。unbind()如果您碰巧live()用于绑定,请注意。的许多缺点之一live()是:

.live() 方法以令人惊讶的方式与其他事件方法进行交互,例如,$(document).unbind("click") 删除了所有对 .live() 的调用附加的点击处理程序!

其他资源

click() - 类似于 bind
bind() - jQuery 1.7 之前的静态元素的首选绑定
live() (不要使用) - 自 1.7 以来已弃用但不使用 1.7 之前的任何一个
delegate() - 动态元素的首选绑定pre jQuery 1.7
on() - 自 jQuery 1.7 以来静态/动态元素的首选绑定

于 2012-08-15T22:33:23.777 回答
0

根据您绑定事件的方式,您将希望使用.unbind()or .off()(如果您正在使用.live()它已被弃用,您应该切换到.on()

jQuery 在Namespaced Events上有一个不错的页面,它说明了如何仅取消绑定您添加的事件处理程序。

于 2012-08-15T22:32:40.053 回答
0

我正在使用.live().

我发现对我来说最简单的解决方案是.die()在每个.live()语句之前放一个。

例子:

$('.add').die();
$('.add').live(...............

http://api.jquery.com/die/

于 2012-08-16T15:33:36.463 回答