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