0

假设我为关闭弹出窗口创建了一个全局处理程序:

  mouseup_handler: function(item, mouse_is_inside){
    if(!mouse_is_inside) {
      close_box(item);
      return false;
    };
  },

我这样附上它:

$("body").bind('mouseup', function(){ mouseup_handler($popup, mouse_is_inside);  });

但是假设我有两个body需要负责关闭的对象。

现在,当我调用其中一个对象的关闭时:

 $("body").unbind('mouseup');

两者或任何附加到主体的 mouseup 处理程序都将被删除。我可以更具体地说:

$("body").unbind('mouseup', mouseup_handler() );

但这仍然会导致所有mouseup_handler()' 被删除的相同问题。

我怎样才能允许body区分两者(或多个)但编写可以在同一处理程序的两个对象之间共享的最少代码量?

4

2 回答 2

1

之前对此有一个很好的深入回答,但我会尝试澄清你的问题的细节。

为了让您的代码指定绑定,您似乎需要向事件添加命名空间。该格式看起来像这样的“event.namespace”。链接的示例是:

$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

此外,根据您的 jQuery 版本,您可能想看看上面显示的 on/off 的好处。我的理解是,命名空间对两者的工作方式相同,但与绑定/取消绑定实现相比,开/关方法可能具有微妙的优势。

以前的答案在这里

一切顺利,纳什

于 2012-06-11T14:42:05.200 回答
1

当通过 jQuery 调用事件处理程序时,this将引用所涉及的 DOM 元素。因此:

$('body').bind('mouseup', function() { mouseup_handler( this, mouse_is_inside ); });

(或酌情;很难说,因为您没有发布太多代码。)

编辑等待 - 如果您绑定到<body>但您将其作为委托进行,您应该使用“on”而不是“bind”进行绑定:

$('body').on('mouseup', 'selector', function() { ... });

通过这样做,您可以确保this绑定到实际的事件目标元素而不是<body>. “选择器”应该识别您感兴趣的实际元素。

要启用和禁用事件处理程序行为,在我看来,最好从元素中添加或删除类名,并在处理程序中检查以决定是否执行任何操作。

于 2012-06-11T14:34:50.867 回答