2

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

$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');
});

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

4

3 回答 3

2

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

尝试这样的事情。

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

希望这可以帮助。

于 2012-08-08T14:13:12.553 回答
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或其他元素),您可以为该元素安装一个单击处理程序,它什么都不做。这也会吞噬点击事件。您仍然需要超时处理程序来确保在您从函数返回后处理事件。

于 2012-08-08T14:20:23.110 回答
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.);
});
于 2012-08-08T14:13:14.390 回答