jQuery 如何在 class 上添加处理程序,但前提是尚未安装?

jQuery how to add a handler on a class but only if isn't already installed?

我有一系列节点,我想向其添加点击处理程序,这些节点将切换一个动作,点击一次并设置一些内容,再次点击并清除它。

问题是同一处理程序被安装了不止一次,因此单击会导致调用处理程序。

如何检查是否为 class 安装了处理程序,然后仅在尚未安装时安装?

我知道已经有类似的 posts,但是在阅读这些之后我找不到解决我的问题的方法,我安装了 class.[=14 的处理程序=]

[编辑],我的代码:

    //Need to detect is handler has already been installed before adding the handler below:
    $('.btnExpCol').click(function() {
    //Do something when any element with this class is clicked
    });

很多评论都是基于 'id',如果你重新阅读我的 post,我使用的是 'class' 选择器,但是这个问题现在已经解决了解决方案效果很好。

[新代码,现在有效]:

    $('.btnExpCol').off("click").on("click", function() {
    //Do something when any element the has this class is clicked
    });

有几种方法可能有效。 1) 在安装处理程序时更改元素(添加 class)并在添加时使用 :not(.hashandler) 以确保不会添加两次。

2) 不要这样做。相反,只需将一个处理程序(永远)添加到根 $(document).on('click','.myclass',function(){...});

任何 "myclass" 个元素将 运行 单击时的功能。

先尝试 unbinding 然后 binding 再试一次

$("#id").unbind("click").bind("click",function(){...

更喜欢这个(感谢@charlietf)

$("#someid").off("click").on("click",function(){...

我会用 off and then adding it again with on 禁用它。

但是如果你想去做,这应该给你一个起点:

<a href="#" id="link">Link</a>

$("#link").on("click", function(e){
    alert("link clicked");
});

$.each($._data($("#link")[0], "events"),function(i, v){
    if(v[0].type === "click") {
      alert("the click handler is set, do not add new");
    }
});

https://jsfiddle.net/nygy1s9j/10/

取自 this question 的想法,经过 jquery 3.1.1

测试