38

例如,假设我有

$(element).on('click', function() {/*Some Stuff*/});

在某处定义,然后我想为同一个点击事件添加更多功能。如果我做

$(element).on('click', function() {/*Other Stuff*/});

“其他东西”会覆盖“一些东西”吗?

4

5 回答 5

30

第二个侦听器不会覆盖第一个侦听器。jQuery 事件处理程序是累积添加的,并按照它们附加的顺序执行。

影响一个处理程序是否阻止另一个运行的事情是该函数如何取消浏览器的默认单击处理程序(即如何停止浏览器跟随链接的 url)

如果您使用传统方法:

$(element).on('click', function() {

    /* Some Stuff, do your thing */ 

    return false; 
});

上面的处理程序将停止事件本身并传播到其他处理程序。

但是您可以在不停止其传播或处理程序的情况下停止事件操作:

$(element).on('click', function(e) {

    // prevent the default action at first, just to make it clear :)
    e.preventDefault(); 

    /* do your thing */

    return /* what you want */;
});

这将确保不会发生默认的单击操作,但该事件会继续传递给其他处理程序。jQuery 事件还有一些其他有用的事件传播方法(例如Event.stopPropagation())值得了解。

于 2012-04-23T09:43:09.467 回答
13

不,事件不会被覆盖,它们会被附加或推送到事件处理程序列表中。

这是观察者模式的典型用法。

如果使用了事件,可以使用http://api.jquery.com/off/http://api.jquery.com/die/删除事件.live

于 2012-04-23T09:37:00.693 回答
4

不,不会的。on()就像绑定一样——它将事件添加到$.data("events")

不过,您可以通过显式删除内容off()

于 2012-04-23T09:38:53.593 回答
4

这已经得到了回答,但我想我会添加我通常如何解决这个问题,当我遇到点击监听器被重复的情况时。

我只是用户查询打开关闭方法......

$(元素).off('点击'); //使用on方法移除之前添加的点击监听

$(element).on('click', function() {/一些东西/}); //添加回来并且只运行一次

http://api.jquery.com/off/

.off() 方法删除了使用 .on() 附加的事件处理程序。有关更多信息,请参阅该页面上对委托和直接绑定事件的讨论。不带参数调用 .off() 会删除所有附加到元素的处理程序。通过提供事件名称、命名空间、选择器或处理函数名称的组合,可以在元素上删除特定的事件处理程序。当给定多个过滤参数时,提供的所有参数必须匹配才能删除事件处理程序。

于 2016-01-13T22:37:56.587 回答
1

你误会了;添加另一个处理程序不会覆盖第一个处理程序。

看到这个jsFiddle:http: //jsfiddle.net/ymuBs/

单击链接会将“一”写入控制台。单击该按钮会向链接添加另一个处理程序。现在单击链接会将“一”和“二”写入控制台:

于 2012-04-23T09:38:51.760 回答