4

我找不到如何实现这一点(我为自由泳记录道歉):

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

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

这个想法是我们调用(生成)一些自定义事件(MyEvent)。我们有一个对象“myObj”,它能够识别“MyEvent”的发生并以某种方式(以他自己的方式)响应它。此外,我们还有其他对象(不同种类),它们(以它们自己的方式)对“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 回答