我可以暂时禁用处理程序吗?

时间:2012-09-14 09:00:33

标签: jquery handler

我有一个图片链接,附有一个点击和一个可拖动的处理程序。

如果我移动链接,我想禁用点击处理程序(例如,如果我将其拖动)。

然后,重新激活它,所以如果我点击之后,我就明白了。

我该怎么办? .unbind将删除整个处理程序,我认为......

5 个答案:

答案 0 :(得分:1)

// bind it
$('#id').on('click', click_handler);

// unbind it
$('#id').off('click', click_handler);

// bind it again
$('#id').on('click', click_handler);

答案 1 :(得分:1)

您可以使用:

如果您使用.unbind('click')

,请

.bind()

或:

如果您使用.off('click')

,请

.on()

否则您可以添加例外:

$('a').click(function(e) {
   if ( ... ) {
      e.preventDefault();
   }
});

编辑:

使用jQuery-UI,它在链接上没有任何停止处理程序的情况下工作正常,如果您对此解决方案感兴趣,我做了 JsFiddle

答案 2 :(得分:1)

如果你的意思是,你不希望锚定点击事件在拖动过程中发生干扰,那么你可以捕获链接/锚标记上的所有点击事件,并将其与停止事件挂钩,如下:

var cancelFollow = false; 
$(function(){ 

  $("anchorElement").click(function(e){
    e.stopPropagation();
    if (cancelFollow)
    {
      cancelFollow = false;
      return false;
    }
    return true;
  });

  $("imageElement").draggable({
    .... 
    start: function(e, ui){},

    stop: function(e, ui){     
      cancelFollow = true;

    }
  });
});

答案 3 :(得分:0)

我认为实现一个充当killswitch的全局变量(boolean),而不是取消绑定然后重新绑定处理程序。

我在您的问题中看不到任何代码段,因此我只是发布一个随机示例:

var doNotExecute = false;

$(".myClassItem").click(function() {

    if(doNotExecute) return false;;

    //Now do your normal processing.

});

现在,只要您想要阻止事件真正发生,您就可以选择将doNotExecute设置为true。请记住之后将其设置回false: - )

答案 4 :(得分:0)

在全局范围内创建处理程序.. 拖动动作可能无法触发单击... 考虑到这一点,对我来说,最好的方法是使用事件委派来防止解除绑定事件,使用

$('#container').on('click', 'ATagClass', handler(e){/* ... */});

在处理程序中,您必须通过检查其类或任何属性来检查e.target是否是您的标记...确保#container始终是您的标记的祖先。