4

これを実装する方法が見つかりません(フリースタイルレコードをお詫びします):

//assign the event handler for the object "myObj"     
myObj.onMyEvent = //do something

//if something happened somewhere, then run the event
MyEvent.fire();

アイデアは、カスタムイベント(MyEvent)を呼び出す(生成する)ことです。「MyEvent」の発生を認識し、何らかの方法で(彼自身の方法で)それに応答することができるオブジェクト「myObj」があります。さらに、「MyEvent」に(独自の方法で)反応する他のオブジェクト(異なる種類)があります。

「オブザーバーパターン」があることは知っていますが、具体的な実装が見つかりません。

どこで読めばいいのか教えていただけますか?または自然界では一般的に不可能ですか?それとも、まったく異なる方法で行われますか?

アップデート1:JSライブラリは使用しないでください(jQuery、Prototype、YUI、...)

4

2 に答える 2

10

JSライブラリはありません(jQuery、Prototype、YUI、...)

私はこの要件を真剣に考え直します。これらのライブラリはすべて、この問題または同様の問題を何度も解決しています。

ただし、最初から始めたい場合は、次のようにします。

window.customEvents = {
    handlers : {
        foo:[],
        bar:[],
        baz:[]
    },

    registerEventHandler:function(event, object, handler){
       if(typeof(customEvents.handlers[event])=="undefined")
           customEvents.handlers[event]=[]; 
       customEvents.handlers[event].push([object, handler]);
    },

    fireEvent:function(eventName, data){
        if(customEvents.handlers[event]){
            for(var i = 0; i < customEvents.handlers[event].length; i++){
                var handlerPair = customEvents.handlers[event][i];
                handlerPair[1](handlerPair[0], data);
            }
        }
    },

}

使用法:

// register event handler
customEvents.registerEventHandler(eventName, targetObject, handlerFunction)

// fire event
customEvents.fireEvent(eventName, data)

// handlerFunction will be passed two parameters: targetObject and event data
于 2010-12-16T09:21:09.767 に答える
3

私の解決策:

var customEvents = {
            _handlers : {},

            subscribe: function(event, handler){
               if(typeof(this._handlers[event])=="undefined")
                   this._handlers[event]=[]; 
               this._handlers[event].push(handler);
            },

            fire:function(event, data){
                if(this._handlers[event]){
                    for(var i = 0; i < this._handlers[event].length; i++){
                        this._handlers[event][i](data);
                    }
                }
            }
    };


var myObj1 = new function(){
        this.handler = function(data){
            console.log(data+'1');
        };
        customEvents.subscribe("greatEvent", this.handler);
    };  



var myObj2 = new function(){
        this.handler = function(data){
            console.log(data+'2');
        };
        customEvents.subscribe("greatEvent", this.handler);
    };  


//if something happened somewhere, then run the event
customEvents.fire("greatEvent", 'ta-da');
于 2010-12-16T15:51:07.663 に答える