2011-05-16 16 views
16

我正在尋找一個JavaScript庫,允許我使用自定義事件,我可以訂閱並觸發。我還需要事件名稱/作用域與消息隊列中的主題類似,其中您可以訂閱命名空間並獲取該命名空間的所有事件。JavaScript的自定義事件庫。有沒有?建議?

例如,

var myCustomEventHandler = new CustomEventHandler(); 

myCustomEventHandler.bind('my.event', function(data) { console.log('Event 1'); }); 
myCustomEventHandler.bind('my.other.event', function(data) { console.log('Event 2'); }); 
myCustomEventHandler.bind('my.*', function(data) { console.log('Event 3'); }); 

myCustomEventHandler.trigger('my.event'); 
// Logs "Event 1" and "Event 3" 

myCustomEventHandler.trigger('my.other.event'); 
// Logs "Event 2" and "Event 3" 

myCustomEventHandler.trigger('my.something.else'); 
// Logs "Event 3" 

我可以寫東西的習慣,但我更喜歡,如果有一個使用一個開源庫。

乾杯。

回答

13

YUI 2 has something like that,我假設YUI 3也是這樣,但我還沒有看到它足夠詳細的知道呢。 EventEmitter似乎涵蓋了至少一些您的要求,並且要小得多。 microjs events上的其他一些圖書館也可能很有前途。

+3

EventEmitter是非常好的,正如你所說的最接近於我要找的。可以做一個分支,看看在命名空間需求中入侵是多麼容易。 – 2011-05-16 10:18:41

+1

YUI 3的[事件目標(http://yuilibrary.com/yui/docs/event-custom/)是非常好的。 – 2012-04-25 00:42:36

+0

有幾十個他們對microjs ... – Yaroslav 2013-04-28 12:05:01

1

嘗試RxJS

這暴露了Javascript中Reactive Extensions和Linq的威力。示例:

this.searcher = $(me._textboxSelector) 
     .toObservable("keyup") 
     .Select(function (_) { 
      return $(me._textboxSelector).val(); 
     }) 
     .Where(function (str) { 
      if (me._madeSomeHiding && str.length < me._minStringLength) { 
       $(me._itemsSelector).show(); 
      } 

這允許在列表上創建過濾器。所以你可以說,如果用戶鍵入2個字符,並停止250毫秒,然後做一些事情。

4

我也建議考慮看看js-signals

下面是從他們的網站一個基本的例子:

//custom object that dispatch a `started` signal 
var myObject = { 
    started : new signals.Signal() 
}; 
function onStarted(param1, param2){ 
    alert(param1 + param2); 
} 
myObject.started.add(onStarted); //add listener 
myObject.started.dispatch('foo', 'bar'); //dispatch signal passing custom parameters 
myObject.started.remove(onStarted); //remove a single listener 
8

退房bean。這很棒。

+0

這看起來是最好的解決方案,因爲所有的人提出來作爲*大系統的組成部分*,這將是矯枉過正。 – 2014-02-02 14:26:01

+0

太棒了。謝謝! – psulek 2014-02-24 08:27:53

0

嘗試KeyderJS

Keyder(document.getElementById("my_element")).click(function(){ 
    alert("Mouse button pressed"); 
}, function(){ 
    alert("Mouse button released"); 
}); 
-1

我也建議KeyderJS,因爲它是一個 「簡單而強大的JavaScript庫」。 我發現並仍然覺得它非常有用。它使我的編碼更容易。它還具有許多瀏覽器兼容性。

此外,您不必瞭解JavaScript就能使用它,並且您可以成爲JavaScript新手或專家使用它。

1

我在一天之後又遇到了同樣的問題,所以我創建了一個超級小圖書館來幫助我處理事件。檢查一下,也許你會發現它很有用。

https://github.com/anvk/Events.js

var events = new utils.Events(); 

var callback1 = function() {...}; 
var callback2 = function(arg1, arg2) {...}; 

events.on('event A', callback1); 
events.on('event B', callback2); 

events.emit('event A'); 
events.emit('event B', [var1, var2]); 
0

晚了一點,但你可能會感興趣的https://github.com/asyncly/EventEmitter2

從描述:

特點

Namespaces/Wildcards. 
Times To Listen (TTL), extends the once concept with many. 
Browser environment compatibility. 
Demonstrates good performance in benchmarks 
0

jQuery事件提供的jQuery事件的JavaScript事件庫。

https://github.com/AtheistP3ace/jAwn

老問題,但這裏是我放在一起供個人使用的,但我基本上採取了jQuery和取得的只是他們的活動的東西自定義生成。即使有自定義事件構建,也會剝奪Sizzle以及他們強加給你的所有其他內容。

這使得您只與特定的事件代碼和緩存(這是需要事件)。此代碼已更新所有最新的3.0 jQuery更新和錯誤修復。這隻能保證與jQuery 3.0支持的任何瀏覽器一起工作(https://jquery.com/browser-support/)。總之所有的min文件都是13kb,並支持jQuery可以對事件做的所有事情。命名空間,自定義事件,直接和委託事件,傳遞數據,觸發事件,你的名字。

閱讀文檔。這很簡單。像jQuery一樣工作,而不是調用,關閉,觸發,並將這些元素作爲第一個參數傳遞給jQuery對象。

正如我說我這樣做是爲了個人使用前所以它不是某些項目中,我不斷地支持和更新,但我儘量保持最新的爲自己的用途,並確保它具有最新的修補程序。我多年來一直在多個項目中使用它,並且它的工作很好。我最近才把它放在GitHub上,以防其他人發現它有用。