jQuery阻止单击后发生其他事件
我试图阻止多次点击链接和项目,这会导致问题 我使用jQuery将单击事件绑定到按钮(jQuery UI)和图像链接(jQuery阻止单击后发生其他事件,jquery,Jquery,我试图阻止多次点击链接和项目,这会导致问题 我使用jQuery将单击事件绑定到按钮(jQuery UI)和图像链接() 是否有一种方法可以做到一劳永逸,防止单击发生后触发其他事件 或者我必须维护一个名为_isProcessing的全局变量,并为每个事件处理程序将其设置为true吗 谢谢 编辑:(澄清) 感谢您的回答,我的问题不是阻止事件冒泡,而是阻止多个并发单击。您是否签出了preventDefault $("a").click(function(e) { e.preventDefaul
)
是否有一种方法可以做到一劳永逸,防止单击发生后触发其他事件
或者我必须维护一个名为_isProcessing的全局变量,并为每个事件处理程序将其设置为true吗
谢谢
编辑:(澄清)
感谢您的回答,我的问题不是阻止事件冒泡,而是阻止多个并发单击。您是否签出了preventDefault
$("a").click(function(e) {
e.preventDefault();
}
您也可以尝试stopImmediatePropagation()
或stopPropagation()
你也可以调查这件事 将处理程序附加到 元素。处理程序在以下位置执行: 每个元素最多一次
从事件处理程序返回
false
,或在每个处理程序中调用ev.stopPropagation()
。存在,并按前面所述返回false
$("a").click(function(e) {
e.preventDefault();
e.stopPropagation();
return false;
}
有多种方法可以防止并发单击运行代码 一种方法是在元素上
解除绑定('click')
,然后在准备好后再次执行.bind()
我宁愿用某种旗子。它可以是一个变量,但我更愿意为元素分配一个类,比如.processing
,并在完成后将其删除。因此,您将让处理程序检查该类是否存在,以确定应该运行的代码的类型
$('someElement').click(function() {
var $th = $(this);
if($th.hasClass('processing'))
return;
$th.addClass('processing');
// normal code to run
// then when done remove the class
$th.removeClass('processing');
});
另一个选项是使用元素
.data()
设置类似的标志,如$(this).data('processing',true)代码>完成后将其设置为false。您有两个选项:
如果您的按钮/链接将重新加载
在页面中,您只需解开
单击事件处理程序:
$('input:submit').click(fumction() {
$(this).unbind('click');
// Handle event here
})
你可以禁用按钮,然后在完成后重新启用(我认为
这也适用于
):
但我认为这在链接上不起作用
另一种方法是使用和发送信号:
例如:
$(button).click(function(e){
if(e.isPropagationStopped())
return; // propagation was stopped, so stop further execution
// if you got this far - this event handler was called first
// custom logic goes here
// stop event propagation to signal other handlers
e.stopPropagation();
// if you need, call e.preventDefault() to prevent default behaviour
});
对其他事件处理程序重复相同的逻辑。您所说的“其他事件”是什么意思?同一元素上的其他事件处理程序?还是它的祖先元素?还是在整页上?你能澄清一下你的具体需求吗?如果我有一个名为“添加服务”的图片链接,它会在我的页面上的表格中添加一行。如果单击多次,则会添加两个。单击完成后,在创建行之前,不应添加其他行。@Russell-是的,我在下面添加了一个答案来解决这个问题。谢谢@patrick:)我没有想到使用类变量或数据函数。@Russel-不客气。@o) 我希望知道更好的解决方案。e.preventDefault()
方法确实不会停止处理程序。它防止元素的默认行为被激活(例如
将您带到其href
位置);工作。谢谢此外,used unbind.one()有助于解决每次单击都会触发事件的问题。谢谢@马克-重读问题。“我的问题不是阻止事件的冒泡,”在他发布答案后,我澄清了这个问题。@Russell-我的评论是指@Mark的评论,而不是@Gintautas的答案。你是对的,答案是在你澄清之前发布的。:-)为了更好的衡量。。。(虽然问题不同,但我猜…)是的,当我回答问题时,问题还没有被澄清。是的,对不起@TehOne,我第一次没有正确地表达我的问题。@TechOne这对这个问题没有帮助,但对我有帮助。谢谢你的分享。谢谢。我希望jQuery有类似于.disableHandler('click')
和.enableHandler('click')
的东西,作为.bind()/unbind()
的替代方案,以及一些混乱的/黑客式的解决方案,比如使用类或变量作为标志o) 您应该使用.data()函数,而不是添加一个可能会意外影响元素显示的类。@bcherry-使用类的好处是(我很确定)它比使用.data()
的操作更轻量级。如果您在命名类时很小心,那么就不应该有任何显示分支。实际上可能不是。您需要修改DOM,然后它必须再次查看CSS以查看是否需要更新样式等。jQuery的.data
方法将其存储在jQuery拥有的内存散列中,获取/设置它可能会更快。请注意,我没有做过这样的基准测试,这都是猜测。@b谢尔里-有趣的想法。我很想知道性能上的差异。在CSS中查找类的浏览器也将是内存中的查找,并且使用本机代码,因此它应该比在javascript中查找快得多,但触及DOM是另一个问题。我听说调用.data()
非常慢,因此建议在需要重复调用时(如在这种情况下)缓存对元素数据的引用。也许我明天会做一些测试。你知道有没有办法禁用事件(不是解除绑定,只是禁用)?@Russell:你可以禁用输入元素。据我所知,禁用的元素不会引发事件。是的,但例如,图像链接(锚定)可以引发点击事件,但不是输入字段(正如你所说,禁用锚定元素不起作用)。没错……想不出任何方法来解决这个问题。除了用
元素替换图像链接之外。我可能会选择Patrick的自定义类解决方案。
$(button).click(function(e){
if(e.isPropagationStopped())
return; // propagation was stopped, so stop further execution
// if you got this far - this event handler was called first
// custom logic goes here
// stop event propagation to signal other handlers
e.stopPropagation();
// if you need, call e.preventDefault() to prevent default behaviour
});