//事件触发类
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 事件触发对象包涵了添加,移除,判断,和执行事件的方法,