防止跨元素多次单击(JQuery)

时间:2012-08-08 14:09:29

标签: jquery

我有一系列锚点,我将事件绑定到每一个:

$j('.opts a').live("click", function(e){}) ;

我想阻止其他锚定点击,直到此点击事件结束。

$j('.opts a').live("click", function(e){
  $j('.opts a').unbind('click'); 
  //do something
  $j('.opts a').bind('click');
});

这只是我尝试过的一件事的一个例子,但即使是解开也不起作用。

3 个答案:

答案 0 :(得分:2)

您无法真正保持链接不被点击。您只能取消绑定您注册的任何JS事件。您需要确保拨打preventDefault(),否则链接将跟随其href

尝试这样的事情。

var isDoingSomething = false;
$j('.opts a').on('click', function (e) {
    e.preventDefault();
    if (!isDoingSomething) {
        isDoingSomething = true;
        // do something
        isDoingSomething = false;
    }
});

希望这有帮助。

答案 1 :(得分:2)

我不认为jQuery是正确的工具。您的问题是,当JavaScript执行某些操作时事件会排队。

所以你真正需要的是“当我回来时吞下所有排队的点击事件。”

我建议将点击处理程序重新绑定到一个新函数中并在计时器中调用它。这允许浏览器处理排队的事件。

也许解除绑定也是错误的方法。如果您始终使用相同的处理程序,请将其转换为具有skip属性的对象:

skip: false,
run: function( e ) {
    if (this.skip) return;

    this.skip = true;

    ... do something ...

    var self = this;
    setTimeout( function() { self.skip = false; }, 50 );
}

[编辑] 另一种选择:如果所有链接都在一个HTML元素中(如父div或其他东西),则可以为该元素安装一个单击处理程序,它不执行任何操作。那也会吞下点击事件。您仍然需要超时处理程序来确保在从函数返回后处理事件。

答案 2 :(得分:0)

错误 - >

$j('.opts a').live("click", function(e){
  $j('.opts a').unbind('click'); 
  //do something
  $j('.opts a').bind('click');
});

- >

$j(document).on("click", '.opts a', function(e){
  $j('.opts a').off('click'); 
  //do something
  $j('.opts a').on('click', //a function such as 'myClickFunction' referencing what you want to occur.);
});