2010-11-03 62 views
2

我有一个jQuery插件,需要注册一个Click事件处理程序:只能用一个事件注册一个函数吗?

$.fn.myPlugin = function (options) { 
    var settings = { 
     // snipped 
    }; 
    $.extend(settings, options || {}); 

    $("body").click(function() { 
     // Do Something 
    }); 

    // Rest of the plugin 
}); 

的问题是,多次调用注册函数不止一次。由于函数需要保持连接,所以我不能使用.one()。

如果函数已经连接,有没有办法?我可以给它起一个名字吗?或者我必须使用闭包魔法设置一些布尔标志?

+1

嘿嘿,看到http://bugs.jquery.com/ticket/6222 – 2010-11-03 18:19:28

回答

3

命名空间的事件。

$('body').unbind('click.myPlugin').bind('click.myPlugin', function() { 
    ..code... 
}); 

More on Namespaced Events

+0

工作就像一个魅力!这基本上允许我用一个名字来引用我的事件,这可以消除任何含糊之处。 – 2010-11-03 19:14:17

+0

我很高兴它解决了:) – 2010-11-03 20:06:33

+0

就像提醒一下:遵循click.XXX语法很重要,jQuery仍将它绑定到click事件。我使用myPlugin.doClick和myPlugin.click,但它不起作用。事后明显,但造成了我几分钟的麻烦:) – 2010-11-04 00:15:50

1

一个非常简单的方法,有良好的表现会设置一个数据元素body元素:

if (!$.data(document.body, 'myPluginRegistered') { 
    $.data(document.body, 'myPluginRegistered', true); 

    // do your plugin code here 
} 
+0

@downvoter评论会很好... – lonesomeday 2010-11-03 18:47:35

+0

只是为了记录,是不是我压低了它。人们可以说这只是一个奇特的全局变量,但它正是它应该是的:元素上的标记。 – 2010-11-03 19:18:26

0

最简单的可能是你建议的布尔加加关闭法术。或者,您可以获取绑定到“单击”对象的所有函数的列表,并查看您所附加的函数是否已经存在。

此问题显示如何获取列表。

List all javascript events wired up on a page using jquery

虽然,进来后,我第一个反应命名空间的建议可能是简单的。

相关问题