Javascript 单击后立即删除单击事件处理程序

Javascript 单击后立即删除单击事件处理程序,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我一直试图在单击一次后删除click事件处理程序,以防止事件多次触发 我尝试了.unbind(),.off(),.one(),并将它们分别放在函数中的不同位置,但似乎都不起作用 如果我使用.off()我会得到一个未定义的不是函数的错误 如果我使用.one()我想在单击其他按钮时基本上重新打开事件。所以,如果我点击选择,我希望它只发射一次,但如果我点击取消选择,我希望选择再次被点击 我尝试了以下操作,但奇怪的是,代码甚至没有启动,因此我不得不使用click() 我应该使用哪个函数?我应该把它放在哪

我一直试图在单击一次后删除click事件处理程序,以防止事件多次触发

我尝试了
.unbind()
.off()
.one()
,并将它们分别放在函数中的不同位置,但似乎都不起作用

如果我使用
.off()
我会得到一个
未定义的不是函数的错误

如果我使用
.one()
我想在单击其他按钮时基本上重新打开事件。所以,如果我点击选择,我希望它只发射一次,但如果我点击取消选择,我希望选择再次被点击

我尝试了以下操作,但奇怪的是,代码甚至没有启动,因此我不得不使用
click()

我应该使用哪个函数?我应该把它放在哪里

(function($) {

Drupal.behaviors.wysiwyg = {
    attach: function(context, settings) {

        var toggle = function(state) {
            $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state);
        }

        $('#wysiwyg-select-all').click(function(){
    toggle(true);
            return false;
        });

        $('#wysiwyg-unselect-all').click(function(){
    toggle(false);
            return false;
        });
    }
}

}(jQuery))
大概是这样的:

$("#wysiwyg-select-all").one("click", function() {
    toggle(true);
    return false;
});

将类名添加到“单击”按钮,然后在单击该类后删除该类

$('#wysiwyg-select-all .myclassname').on('click', function(){
    toggle(true);
    $(this).removeClass('myclassname');
    $('#wysiwyg-unselect-all').addClass('secondclassname');
    return false;
});

$('#wysiwyg-unselect-all .secondclassname').on('click', function(){
    toggle(false);
    $('#wysiwyg-select-all').addClass('myclassname');
    $(this).removeClass('secondclassname');
    return false;
});

这适用于动态创建的元素:

(function ($) {

    Drupal.behaviors.wysiwyg = {
        attach: function (context, settings) {

            var toggle = function (state) {
                $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state);
            };

            $(document).on("click", "#wysiwyg-select-all", selectFn());
            $(document).on("click", "#wysiwyg-unselect-all", unselectFn());
        }
    };

}(jQuery));


function selectFn() {
    $(document).off("click", '#wysiwyg-select-all', "**");
    $(document).on("click", "#wysiwyg-unselect-all", unselectFn());
    toggle(true);
    return false;
}

function unselectFn() {
    $(document).off("click", '#wysiwyg-unselect-all', "**");
    $(document).on("click", "#wysiwyg-select-all", selectFn());
    toggle(false);
    return false;
}

已更新

我把其他人提出的一些建议弄得一团糟,我想这正是你们实现这一目标所需要的:

(function ($) {

    Drupal.behaviors.wysiwyg = {
        attach: function (context, settings) {

            var selectFn = function() {
                toggle(true);
                return false;
            }

            var unselectFn = function() {
                toggle(false);
                return false;
            }    

            var toggle = function (state) {
                $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state);
                if (state) {
                    $(document).off("click", '#wysiwyg-select-all,#wysiwyg-unselect-all', "**");
                    $(document).on("click", "#wysiwyg-unselect-all", unselectFn;
                }else{
                    $(document).off("click", '#wysiwyg-select-all,#wysiwyg-unselect-all', "**");
                    $(document).on("click", "#wysiwyg-select-all", selectFn;
                }
            };

            $(document).on("click", "#wysiwyg-select-all", selectFn);
            $(document).on("click", "#wysiwyg-unselect-all", unselectFn);

        }
    };

}(jQuery));

它切换按钮事件的绑定,并将使用动态创建的元素。这是Matt Green答案的派生,但我注意到他的答案有几个问题,即他在事件绑定中调用selectFn和unselectFn,而不是引用它们。

为什么不使用任何全局变量作为标志。单击事件将其设置为真

if (btn1Clicked)
     return;
btn1Clicked=true; 
要重新启用,只需将其设置为false。
如果需要,可以使用return false代替return

检查这是否适合您。还要确保jquery版本高于1.7,以便“开”、“关”工作


如果我使用.off(),我会得到一个未定义的函数错误。您使用的是哪个版本的jQuery?我们无法告诉您使用
.off()
.one()
有什么问题,除非您也共享该代码。以后是否要单击相同的按钮?如果您所做的只是试图确保用户不会无意中单击两次,则可以在单击后立即禁用按钮,然后在设置超时(例如5秒)时启用该按钮。即使两次点击的速度如此之快,也只有第一次注册。他将点击绑定为.click(),而不是on()。这就是为什么off()不起作用的原因。@aecend那么我如何解除绑定
click()
。我刚刚更新了我的问题,但是如果我使用
.one()
,我希望在触发另一个事件时再次触发该事件。有道理吗?那么。。。重新绑定它?是你说你想解开的,我试着重新绑了也没用。在这种情况下,我该怎么做?创建一个包装器函数,然后在事件内部调用它?我尝试了这个。它抛出
uncaughttypeerror:undefined不是一个函数
错误。“为什么不使用任何全局变量作为标志”,因为除非绝对nessacary@MattGreen为什么会这样呢?如果全局变量在您认为唯一的名称空间中受到保护,并且仅在有益的情况下使用,那么您可以使用全局变量。主要问题是globals会使一段代码更容易与另一段代码冲突(如果不使用不同的名称空间或非常独特的名称)。出于这个原因和其他原因,最好在实际不需要的时候避免使用globals。第二种方法对我不起作用。。。它仍然会进入循环。@Kevin,我改变了它存储引用的方式,并将变量移到了全局范围内。你介意试试吗?我照你说的做了,它不再点击
开关(true)
,但是,这并不意味着点击仍然没有被触发,对吗?看起来点击事件仍然被点击,但点击后什么也没有发生。感谢您询问我的jQuery版本是否高于1.7。我意识到事实上,我的版本太低了。更新到1.9后,我不再收到
.on('click')
的未定义错误,因此现在
.off()
.on()
工作。我喜欢这个箱子里的链子,所以我把它给你。
if (btn1Clicked)
     return;
btn1Clicked=true; 
(function($) {

  Drupal.behaviors.wysiwyg = {
    attach: function(context, settings) {
    var counter = 0;
      var toggle = function(state) {
        $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state);
      }

      $(document).off('click',"#wysiwyg-select-all").on('click', "#wysiwyg-select-all", function(e) {
        toggle(true);               
        return false;
      });

      $(document).off('click',"#wysiwyg-unselect-all").on('click', "#wysiwyg-unselect-all", function(e) {
        toggle(false);      
        return false;
      });
    }
  }

}(jQuery))