2010-11-03 84 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

雖然,進來後,我第一個反應命名空間的建議可能是簡單的。

相關問題