2012-04-02 3 views
7
var test = { } 
$(test).on("testEvent", function(){ 
    console.log("testEvent has fired"); 
}); 
$.event.trigger("testEvent"); 

jQueryを使用してイベントを使用してパブリッシュ/サブスクライブメカニズムを実行しようとしています。私は非DOMオブジェクトにイベントをアタッチし、それらをすべて単一のグローバルトリガーから起動できるようにする必要があります。上記のコードは動作すると期待していましたが、テストオブジェクトのtestEventの起動には至りませんでした。

イベントがサブスクライブされる複数のオブジェクトが存在することに注意してください。単一の$ .event.triggerはそれらのイベントのすべてを起動する必要があります。このコードが正常に動作することを

に注意してください:最近のブラウザで

$('#someID').on("testEvent", function() { 
console.log('testEvent has fired from DOM element'); 
}) 
$.event.trigger("testEvent"); 
+0

イベントが発生しない理由は、オブジェクトがDOMの一部ではないためです。 $ .event.triggerを起動するとイベントが発生し、DOMをバブリングしています。オブジェクトはDOMの一部ではないので、それは起動しません。 私がここで真剣に探しているのは、DOM以外のオブジェクト内のイベントを何とかしてjQueryを使ってグローバルに起動することです。私はこれを達成するためにAmplifyJSのようなものを使う必要がないようにしようとしています。 – crv

+2

投稿したイベントをトリガーする唯一の方法は '$(test).trigger(" testEvent ");'です。 –

+1

要素を '$ .event 'に渡さない場合。トリガされ、トリガされているイベントはグローバルイベントではないため、イベントをトリガしません。 http://code.jquery.com/jquery-1.7.2.jsの3104行から始まるコードブロックを参照してください。これは文書化されていないメソッドなので、コードが何をしているかを見るためにはコードに行く必要があります。 –

答えて

8

。パブリッシュするために

$.Topic("message").subscribe(function() { 
    console.log("a publish has occurred"); 
}); 

以下が行われるイベントをサブスクライブするために

(function ($, window, undefined) { 
    var topics = {}; 

    jQuery.Topic = function (id) { 
     var callbacks, method, topic = id && topics[id]; 
     if (!topic) { 
      callbacks = jQuery.Callbacks(); 
      topic = { 
       publish: callbacks.fire, 
       subscribe: callbacks.add, 
       unsubscribe: callbacks.remove 
      }; 
      if (id) { 
       topics[id] = topic; 
      } 
     } 
     return topic; 
    }; 
}) 

:次のコードを使用することができるパブリッシュ/サブスクライブ機構を持つために(hereを発見)

$.Topic("message").publish(data); 

「メッセージ」はイベント名です。 data引数には、購読者に渡す情報が含まれています。私は最近、ベンAlmanのアプローチを使用し、それは素晴らしい仕事

$.Topic("message").unsubscribe(funcSubscribedToBefore); 
0

(私は右 read the source for Underscore.jsをしている場合)あなたがネイティブ非DOMオブジェクトにイベントをバインドすることができます。それ以外の場合は、アンダースコアの.bind関数のようなものを使用する必要があります。したがって、サポートする必要があるブラウザによって異なります。

編集:Underscore.jsで

[OK]を、用事、私は考えていたバインドがバックボーンと同じです。バックボーンにはイベントバインディングを実行する独自のイベントモジュールがあります。 jQueryの1.7は、パブリッシュ/サブスクライブのメカニズムを導入する簡単な方法を提供しているかのようにそれが表示されるいくつかの研究を行った後

binding events to dynamic objects in underscore/backbone

+0

を追加し、負傷者をさらに傷つけさせるため、Backbone.Eventsは以前のバインドなどの構文ではなく、 "on/off"構文を使用するようになりました。私はそれを知っていた。 – JayC

0

:あなたが加入した関数を渡す必要があります解除するために

/* jQuery Tiny Pub/Sub - v0.7 - 10/27/2011 
* http://benalman.com/ 
* Copyright (c) 2011 "Cowboy" Ben Alman; Licensed MIT, GPL */ 

(function ($) { 

    var o = $({}); 

    $.subscribe = function() { 
     o.on.apply(o, arguments); 
    }; 

    $.unsubscribe = function() { 
     o.off.apply(o, arguments); 
    }; 

    $.publish = function() { 
     o.trigger.apply(o, arguments); 
    }; 

}(jQuery)); 

使用法:

$.subscribe('eventName', function (event) { 
    console.log(event.value); 
}); 

$.publish({ type: 'eventName', value: 'hello world' }); 

詳細についてはhttps://gist.github.com/addyosmani/1321768を参照してください。

関連する問題