32

我知道我们可以使用 jQueryon()函数附加事件并使用off().

在现有项目中,我有时会遇到类似于以下的代码:

$("#SomeId").off("click").on("click");

或者有时在使用类似于此的命名空间时:

$("#SomeId").off("click.namespace").on("click.namespace"); 

据我所知,您只能将单个事件附加到事件的特定命名空间。

例如,如果我只是这样做on("click"),它将附加我指定的功能,覆盖当前分配的功能,添加到“点击”事件。

如果我这样做on("click.namespace"),它将附加我指定的函数,覆盖当前分配的函数,添加到click.namespace.

off("click")通过将 an 链接到on("click)ifon()已经替换分配给指定 event/event.namespace 的任何函数来删除任何事件有什么意义?

它是我们代码中的冗余语法还是我错过了它的原因?

编辑 - 谢谢kapa
我现在感觉有点傻,我纠正了我上面的错误知识。执行on("click.namespace1")了几次,我现在观察到该data("events")对象不断添加到单击事件数组中。

我认为这回答了我自己的问题。这就是为什么人们会使用off("event.namespace")来确保没有其他任何东西附加到那个确切的 event/event.namespace。

4

3 回答 3

46

实际上,您可以将多个事件处理程序附加到同一个事件,而不仅仅是一个。即使使用了命名空间。看看这个快速演示

实际上,命名空间的一个优点是您可以标记一组事件处理程序,并在以后轻松删除它们以避免多次附加它们。这就是这条线的作用:

$("#SomeId").off("click.namespace").on("click.namespace"); 
于 2012-06-11T12:13:21.727 回答
3

您可能想尝试.one('click.namspace')而不是.on('click.namespace').

$('p')
  .off('click.namespace', clickCB)
  .one('click.namespace', clickCB); // note the .one() here

这样可以确保 click 不会被多次调用否则,.on(...)只会继续添加click-event-handlers (clickCBs)到元素上的click.namespace事件,并且会在触发p之前多次调用。.off()

祝你好运...

于 2018-12-18T04:20:49.327 回答
0

如果有一个现有的处理程序(因为您可能有多个,在这种情况下,它们将链接),并且它调用.stopPropagation(),那么您的处理程序将不会被调用。编写上面的代码可以避免这个问题。

于 2012-06-11T12:15:19.887 回答