Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery阻止单击后发生其他事件_Jquery - Fatal编程技术网

jQuery阻止单击后发生其他事件

jQuery阻止单击后发生其他事件,jquery,Jquery,我试图阻止多次点击链接和项目,这会导致问题 我使用jQuery将单击事件绑定到按钮(jQuery UI)和图像链接() 是否有一种方法可以做到一劳永逸,防止单击发生后触发其他事件 或者我必须维护一个名为_isProcessing的全局变量,并为每个事件处理程序将其设置为true吗 谢谢 编辑:(澄清) 感谢您的回答,我的问题不是阻止事件冒泡,而是阻止多个并发单击。您是否签出了preventDefault $("a").click(function(e) { e.preventDefaul

我试图阻止多次点击链接和项目,这会导致问题

我使用jQuery将单击事件绑定到按钮(jQuery UI)和图像链接(

是否有一种方法可以做到一劳永逸,防止单击发生后触发其他事件

或者我必须维护一个名为_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
    });