Javascript 仅对CSS类下的一个按钮执行单击事件

Javascript 仅对CSS类下的一个按钮执行单击事件,javascript,jquery,Javascript,Jquery,我有一些JavaScript来执行逻辑,即当单击按钮时,doSomething()。我知道按钮的类别,但是页面上有多个按钮使用同一类别。下面的代码的问题是,当我只希望执行一次时,doSomething()函数对页面上的每个按钮执行一次 var myButtonClass = $(".my-button-class"); if (myButtonClass) { myButtonClass.click(function (event) { if (someCondition

我有一些JavaScript来执行逻辑,即当单击按钮时,
doSomething()
。我知道按钮的类别,但是页面上有多个按钮使用同一类别。下面的代码的问题是,当我只希望执行一次时,
doSomething()
函数对页面上的每个按钮执行一次

var myButtonClass = $(".my-button-class");
if (myButtonClass) {
    myButtonClass.click(function (event) {
        if (someCondition) {
            doSomething();
        }
    });
}
我知道按按钮div选择会更好,但是按钮div的名称都会根据按钮的数量而有所不同(例如,
#my-button-div1
#my-button-div2
,等等),并且按钮的数量是不确定的

有没有办法只做一次这个活动?我不在乎类中的哪个按钮恰好被单击,我只需要事件触发一次,然后它就完成了

更新:要明确的是,如果用户再次单击页面上的另一个按钮,我仍然希望执行逻辑,因此我不希望完全解除事件绑定。我只是不希望页面上的每个按钮都执行一次。例如,假设我有4个按钮。现在,只要单击一个按钮,它就会执行如下操作:

alert!
alert!
alert!
alert!
我只需要其中一个提醒。基本上,每当用户单击页面上的任何按钮时,我都需要它进入
警报每次单击仅一次

可以使用和分别绑定和解除绑定元素上的事件

$('.my-button-class').on('click', function (event) {
    if (someCondition) {
        doSomething();

        // Unbind the event on all the elements having the class
        $('.my-button-class').off('click');

        // To unbind the event on only the clicked element
        // $(this).off('click');
    }
});

旁注:
如果(myButtonClass){
将始终计算为
true
。即使未找到元素且对象始终为truthy,jQuery也会返回一个对象。若要检查DOM中是否存在元素,请在jQuery对象
$('someSelector')上使用
length
属性.length>0

如果给处理程序一个受闭包保护的局部布尔变量,则可以创建一个只执行一次的函数

运行下面的代码段以查看它的运行情况

$(“.my button class”)。单击(函数(){
var=false;
返回函数(){
如果(!已执行){
已执行=真;
doSomething();
}
};
}());
函数doSomething(){
警惕(“你应该只见到我一次!”);
}

点击我!

不点击我!
修改后,您就不会有奇怪的if语句,并允许其他点击处理程序在绑定到其他地方时愉快地工作

更新:
var clickHandler=函数handleClick(事件){
doSomething();
}
var=true;
函数doSomething(){
警惕(‘警惕’);
}
函数doTheBinding(){
如果(单击){
$('.my button class')。在('click',clickHandler)上;
bindClicks=false;
}
}
//你想打多少次就打多少次,但它还是会打一次
doTheBinding();
doTheBinding();
doTheBinding();

点击我!
点击我!
点击我!

单击我!
Maybe$('.my button class').off('Click',this);因此它保持其他单击bindings@juz是的,也可以使用,但对我来说
$(这个).something
看起来非常清晰易读。这不是我的意思,这与句柄回调有关。我有一个更干净、无bug的解决方案。请参阅我的答案。这里的问题是,当用户单击同一个(或另一个)时,我仍然希望它执行一次再次单击按钮。我只是不希望页面上的每个按钮都执行一次。哦,如果按他的方式执行,它应该只执行一次,如果它仍然执行多次..您正在绑定上。('click'))绑定倍数times@FionaCat86这很让人困惑。你的问题似乎很清楚。你能创建一个有这个问题的代码段吗?我不知道它如何在一开始就为每个按钮执行一次。@FionaCat86我添加了另一个代码段来回答这个问题。你想让我删除我答案的第一部分吗你可以选择它作为答案吗?我更新了我的问题以使其更清楚。这里的问题是我仍然需要触发事件(仅一次)如果再次单击任何按钮。那么现在修改的按钮如何?它仍然感觉@FionaCat86多次绑定了“on”回调。这将多次调用alert。这不如我的回答好,因为在我的回答中,有一些闭包表示其他人意外/故意更改了
bindClicks
变量代码。我同意你@4castle的观点,全局作用域并没有那么好。它是为了找出真正的问题所在。在另一方面,你可能希望稍后通过解除所有绑定并再次切换bindClicks来重新绑定。
if(myButtonClass){
即使在没有元素的情况下也将始终是真的……因此在单击之后解除事件绑定。。。