0

我正在尝试智能地取消绑定 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);
      // ???????
   });
});

我什至愿意接受创造性的解决方案。我现在可以让它工作,但我想看看我是否能以这种特殊的方式做到这一点。谢谢!

4

1 回答 1

2

您应该以一种赋予您对它们更多权力的方式来命名您的事件,所以如果说,您有一些委托事件之王click一直上升到document这样的情况:

$(document).on('click','a', doSomething);

你可能有更多这样的东西,它一直被委托给身体,所以如果你想删除其中一个,当你click从文档中取消绑定事件时,你实际上会杀死所有其余的。

更好的是:

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

想象一下页面上可能还有更多代码可能一直使用事件委托到文档,t 或其他一些元素,所以如果没有命名空间,在绑定/取消绑定事件时会发生串通

于 2013-02-19T17:03:51.203 回答