如何使用jquery中的切换来防止点击队列的建立? 尝试使用bind / unbind(’click’)
我想在切换动画显示时禁用点击处理程序,这样动画就不会因为多次快速点击而累积。 谢谢
jquery脚本:
$("#button").click({ $(this).unbind('click').next().toggle("slow",function(){$('#button').bind('click')}); });
HTML代码
<div Toggle test
如上所述,事件附件的实现已被破坏。 最重要的是,jQuery中有一个名为.stop的方法,它使您无需使用bind / unbind。
$("#button").click(function(){ $(this).next().stop().toggle("slow"); });
它只是清除动画队列并停止当前动画,让你启动下一个动画。
停止jQuery文档的function。 请注意,它有两个属性 – clearQueue和goToEnd。 阅读更多有关使用此方法的更多信息。
首先,你附加事件的方式被打破了。 我不知道在你的代码中询问问题或真正的错误是否只是急速,但这是设置处理程序的正确方法:
$("#button").click(function(evt) { // <- you need to pass it a function! $(this).unbind('click').next() .toggle("slow",function(){$('#button').bind('click')}); });
但是你的问题。 我认为你将从使用jQuery的one
function中受益。 一旦调用了单击处理程序,就会将其作为单击处理程序删除; 因此,它只执行一次 ,只需一次点击。 要在动画后重新点击点击处理程序,我认为你做对了; 动画结束后重新绑定它。
function clickHandler(evt) { $(this).next().toggle("slow", function() { $('#button').bind('click', clickHandler); }); } $("#button").one('click', clickHandler);
如果使用one
对你来说太慢了,那么最快的方法就是在锚点的href
上添加javascript。 但是当你准备再次执行时,你需要切换一个全局布尔变量。
... function clickHandler() { if( someBoolean ) { someBoolean = false; //do stuff } someBoolean = true; }
第一种方法
在切换动画时放弃事件点击:
$("#button").click(function(e) { e.stopPropagation(); if ( $(this).next().is(':animated') ) { return false; } $(this).next().toggle("slow"); });
见演示
第二种方法
设置时间延迟以确保仅触发最新点击:
var timeID; $("#button").click(function(e) { var $el = $(this); clearTimeout(timeID); timeID = setTimeout(function() { $el.next().toggle("slow"); }, 250); });
见演示
您可以从stop()
方法获得一些好处,而不是忽略后续的点击。 有关示例,请参阅快速提示:阻止动画队列构建。 他正在谈论hover
,但它适用于你可能在同一事件上一个接一个地运行动画的任何地方。
或者,你可以禁用按钮,而不是删除整个点击处理程序? 它可能表达了“不要再次点击我”的意图,而不是放弃点击。
jquery的切换方法存在问题,当用户快速点击切换元素时,有时会给出错误的结果。 它由于点击事件的时间秒而发生,当第一个事件未完全完成时,第二个事件触发器会产生问题。 解决这个问题有点棘手,但在settimeout函数的帮助下很容易:
$('.navbar-toggle').on('click', function() { $('.mob-logo').toggle(); $('.navbar-toggle').css('pointer-events', 'none'); setTimeout(function() { // enable click after 0.5second $('.navbar-toggle').css('pointer-events', 'all'); }, 500); // 1 second delay });