解决方案 »

  1.   

    function zhang(data){
    alert(data.name);
    }function yun(data){
    alert(data.name);
    }
    var listeners = {"zhang":zhang,"yun":yun};Event.prototype.trigger = function( eventName , data){
    var fn = listeners[eventName] || null;
    var i,len;
    if(fn instanceof Array){
    for(i=0,i<fn.length;i<len;i++){
    fn[i] && fn[i](data);
    }
    }else if(fn instanceof Function){
    fn && fn(data);
    }
    }var a = new Event("aaa");a.trigger("zhang",{name:"zhang"});
    a.trigger("yun",{name:"yun"});
    a.trigger("yun1",{name:"yun"});这个是你想说的问题吗?
    触发其实就是在执行对应的函数而已,所以需要你先把需要的信息放到listeners对象中,后面如果有触发对应类型的事件的话,就去listeners对象中找这个属性,找到的话就执行~~~
      

  2.   

    谢谢,是这个意思。我有几个问题:
    var listeners = {"zhang":zhang,"yun":yun}; <=== 这句话中 冒号后的 zhang是函数指针吧?
    if(fn instanceof Array){ <=== 为什么fn可能是Array类型呢?是因为可能触发多个函数吗,多个函数指针组成数组?
    fn[i] && fn[i](data); <=== 为什么要用&&,只写fn[i](data)不可以吗?
      

  3.   

    1:那个后面的就是一个函数名,这样后面fn[i]就会找到对应的函数了。说函数指针也是对的。2:因为你可以对一个元素绑定多个回调函数啊,如果是array类型,就会顺序把所有的回调函数都执行了。3:因为有时候可能会出现,你已经把对应的函数指针给删除了,但是又去调用了。这个时候就要先判断fn[i]是否存在。
    如果不存在或者fn[i]的值是undefined,那么就不会在执行后面的函数了。其实最佳的判断是要判断fn[i]是不是一个function函数,就像下面的elseif中的判断。其实目的就是为了验证一些类型信息,和if、else相同的功能的。