事宜定义
事宜是与DOM交互的最常见的体式格局,但它也能够用于非DOM代码中–经由过程完成自定义事宜.完成自定义事宜的道理是建立一个治理事宜的对象.以下代码是事宜的定义:
function EventTarget(){
this.handlers = {};//存储事宜处置惩罚顺序,由n个键值对构成,键示意事宜名,值是一个由事宜处置惩罚顺序构成的数组
}
EventTarget.prototype = {
constructor:EventTarget,
//增加事宜
addHandler:function(type,handler){
if(typeof this.handlers[type] == "undefined"){
this.handlers[type] = [];
}
this.handlers[type].push(handler);
},
//触发事宜
fire:function(event){
if(!event.target){
event.target = this;
}
if(this.handlers[event.type] instanceof Array){
var handlers = this.handlers[event.type];
for(var i=0,len=handlers.length;i < len;i++){
//将event传递给事宜处置惩罚顺序,event.target代表对象自身,
event.type代表事宜名,你能够依据状况为增加event属性
handlers[i](event);
}
}
},
//移除事宜
removeHandler:function(type,handler){
if(this.handlers[type] instanceof Array){
var handlers=this.handlers[type];
for(var i=0,len=handlers.length;i < len; i++){
if(handlers[i] == handler){
break;
}
}
handlers.splice(i,1);
}
}
};
首先是定义了一个名为EventTarget
的组织函数,为其定义的属性handlers
用于存储事宜处置惩罚顺序,
然后有三个操作要领增加到EventTarget
的原型中,分别是addHandler
fire
remocveHander
.
addHander
是向handlers
中增加事宜处置惩罚顺序fire
是触发handlers
中的事宜处置惩罚顺序removeHandler
是向handlers
中移除事宜处置惩罚顺序注:
事宜处置惩罚顺序浅显的讲就是事宜被触发时须要实行的要领.
事宜挪用
var eventObj=new EventTarget(); //实例化一个EventTarget范例
var handler=function(){
alert('event');
}; //事宜处置惩罚顺序
eventObj.addHandler('alert',handler); //为eventObj对象增加一个事宜处置惩罚顺序`handler`
event.fire({type:'alert'}); //触发eventObj对象中的事宜处置惩罚顺序`handler`
event.removeHandler('alert',handler); //删除eventObj对象中的事宜处置惩罚顺序`handler`
事宜继续
固然我们也能够经由过程继续让其他援用范例继续EventTarget
的属性和要领.
//原型式继续
var object=function(o){
function F(){}
F.prototype=o;
return new F();
};
//subType继续superType的原型对象
var inheritPrototype=function(subType,superType){
var prototype=object(superType.prototype);
prototype.constructor=subType;
subType.prototype=prototype;
}
function Person(name,age){
EventTarget.call(this);//继续EventTarget的属性
this.name = name;
this.age = age;
}
inheritPrototype(Person,EventTarget);//继续EventTarget的要领
Person.prototype.say=function(message){
this.fire({type:'message',message:message}); //触发事宜
};
//事宜处置惩罚顺序
var handMessage=function(event){
alert(event.target.name + "says:" + event.message);
};
var person=new Person('yhlf',29);
person.addHandler('message',handMessage);
person.say('Hi there');
运用自定义事宜有助于解耦相干对象,坚持功用的阻隔,在许多状况下,触发事宜的代码和监听事宜的代码是完整星散的.