jQuery智能事件解除绑定

时间:2013-02-19 16:16:02

标签: event-handling jquery

我正在尝试智能地取消绑定jquery中的事件,以便我可以轻松地启用/取消它们。我试图避免使用状态变量,因为它不应该是必要的,它使我的共享函数非常混乱。这是我最初尝试过的不起作用的地方。

var dragStart = $('#ruler').mousedown(function(e){
   position = container.offset();
   mousePosition = {
      x: e.pageX,
      y: e.pageY
   };

   var dragging = $(document).mousemove(function(e){
       var x = e.pageX - mousePosition.x;
       var y = e.pageY - mousePosition.y;

       container.offset({
           left: position.left + x,
           top: position.top + y
       });
   });

   var dragStop = $(document).mouseup(function(){
      dragStart.unbind();
      dragging.unbind();
      dragStop.unbind();
   });
});

我发现这不起作用,因为jQuery的事件处理函数返回对选择器中元素的引用,因此所有内容都从$(document)解除绑定,这在我的环境中是一个问题。

我知道我可以提出函数名称并进行有针对性的解绑,但是我必须做的所有不同的函数(不仅仅是显示),这将使代码变得痛苦。有没有什么方法可以让我的功能类似于我在上面的代码中的功能?我正在思考这个问题:

var foo;
$(<selector>).<eventType>(foo = function(){
   // DO SOMETHING
   $(<unbind button>).click(function(){
      // foo.unbind();
      // OR
      // $(<selector>).unbind(foo);
      // ???????
   });
});

我甚至会对创造性的解决方案持开放态度。我现在可以让它正常工作,但我正试图看看我能否以这种特殊方式做到这一点。谢谢!

1 个答案:

答案 0 :(得分:2)

你应该namespace以一种让你对它们有更多权力的方式发生事件,所以如果说,你有一个委派事件click的王者一直上升到{{1}像这样:

document

并且你可能有更多这样的东西,它被一直委托给身体,所以如果你想要删除其中一个,当你从$(document).on('click','a', doSomething); 事件中取消click事件时,你实际上会杀死所有其他事件。文档。

更好的是:

$(document).on('click.someName','a', doSomething);  // bind
$(document).off('click.someName','a');  // unbind

想象一下,页面上可能还有更多的代码可能会使用事件委托一直到文档,t或其他一些元素,所以没有命名空间,绑定/解除绑定事件时会出现串通