当前位置: 代码迷 >> 综合 >> EventDispatcher 的yuan解读
  详细解决方案

EventDispatcher 的yuan解读

热度:57   发布时间:2023-12-25 15:30:31.0

//事件触发类
function EventDispatcher() {}
// Object.assign  合并对象
Object.assign(EventDispatcher.prototype,{
    //  addEventListener  添加方法给  this._listeners 对象,最终的结果是  this._listeners = {"click":[function (){}], "mouseover" : [function a(){}, function b(){} ]}
    addEventListener:function ( type,listener ) {

        if( this._listeners=== undefined) this._listeners= {};

        varlisteners = this._listeners;

        if( listeners[ type ] === undefined ) {

            listeners[ type ] = [];

        }
       //  如果对象没有的指定的事件方法,则添加,防止重复添加事件的执行函数
        if( listeners[ type ].indexOf( listener ) === -1 ) {

            listeners[ type ].push( listener );

        }

    },

    hasEventListener:function ( type,listener ) {
       // 如果没有添加事件,直接返回 
        if( this._listeners=== undefined) return false;
       // 如果添加了事件,则赋值
        varlisteners = this._listeners;
        //  只有  添加的事件 不等于 undefined 并且 listeners[type]的结果中有 传入的指定函数listener ,才会返回 true,所以此处申明的方法,必须是显示申明
        returnlisteners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;

    },

    removeEventListener:function ( type,listener ) {

        if( this._listeners=== undefined) return;

        varlisteners = this._listeners;

       // 拿到指定事件类型的结果   假如  listeners 的结果 {"click":[aa,bb]},    注: aa, bb 为事件处理函数
        varlistenerArray = listeners[ type ];    //   [aa,bb]

        if( listenerArray !== undefined) {

            varindex = listenerArray.indexOf( listener );   //  假如搜索bb ,则结果为 1
           //  如果存在,则 [aa,bb],截取出去 bb
            if( index !== - 1) {

                listenerArray.splice( index,1 );

            }

        }

    },
    //  event  传入一个拥有type属性的对象  例:  { type:'added'}
                                                                                                                                                                                     dispatchEvent:function ( event ) {
        if( this._listeners=== undefined) return;

        varlisteners = this._listeners;
        varlistenerArray = listeners[ event.type ];

        if( listenerArray !== undefined) {
           //  将实例化的对象赋值给 event.target 属性
            event.target= this;
          //  slice  方法用于提取目标数组中的一部分,返回一个新数组,原数组不变,相当于克隆一个新的数组,操作不影响原来的数组
            vararray = listenerArray.slice(0 );

            for( vari = 0,l = array.length;i < l;i ++ ) {
            // 将event当作参数传入到执行事件中,相当于熟悉的事件对象
                array[ i ].call(this,event );

            }

        }

    }

} );

varo = newEventDispatcher;
function bb(e){ console.log(e)}
o.addEventListener("click",bb);
o.dispatchEvent({ type:"click"});

EventDispatcher 事件触发对象包涵了添加,移除,判断,和执行事件的方法,