除了傳統(tǒng)的一些事件外,有時候因為額外的需求需要創(chuàng)建自定義事件,這里介紹兩種。
DOM對象的自定義事件
首先創(chuàng)建事件
event = new Event(typeArg, eventInit);
typeArg是事件名稱;
eventInit是事件參數(shù)(可選),參數(shù)包括bubbles(是否冒泡),cancelable(是否可取消),scoped, composed。都為布爾型。(后兩個參數(shù)還不知道怎么使用,暫時留個坑。)
然后通過addEventListener注冊事件監(jiān)聽。
最后通過dispatchEvent方法觸發(fā)事件。
代碼如下
var ev = new Event("look", {"bubbles":true, "cancelable":true});
document.addEventListener('look',function(e){
console.log(e);
})
document.dispatchEvent(ev);
此處創(chuàng)建了名為look的事件,然后在document對象上設(shè)置監(jiān)聽,最后觸發(fā)look事件。在輸出的打印語句中可以看到e的type為“l(fā)ook”。
如果要觸發(fā)原生的touchstart事件,將以上代碼中的 ‘look’ 用 ‘touchstart’ 替換即可。
還有個CustomEvent()的構(gòu)造方法
之前是使用createEvent和initEvent方法的,但是initEvent已經(jīng)被Deprecated了,建議使用Event構(gòu)造方法,這里還是貼下使用方法
// Create the event.
var event = document.createEvent('Event');
// Define that the event name is 'build'.
event.initEvent('build', true, true);
// Listen for the event.
elem.addEventListener('build', function (e) {
// e.target matches elem
}, false);
// target can be any Element or other EventTarget.
elem.dispatchEvent(event);
普通對象的自定義事件(此處參考了backbone框架0.0.1版本的事件部分)
使用發(fā)布/訂閱模式,在對象上創(chuàng)建_events用來存儲訂閱的事件對象,_events的每一個屬性key為訂閱的事件名稱,value為該事件名稱下的事件列表。
代碼如下
var events ={};
//訂閱事件
events.on=function(event,callback,context){
this._events = this._events ||{};
this._events[event]=this._events[event]||[];
this._events[event].push(callback);
return this;
}
//發(fā)布事件
events.trigger = function(event,args){
if(!this._events||!this._events[event]){
return this;
}
var once = [];
for(var i=0,l=this._events[event].length;i<l;i++){
this._events[event][i].apply(this,args);
if(this._events[event][i].once){
once.push(this._events[event][i]);
}
}
if(once.length){
for(var i=0,l=once.length;i<l;i++){
this.off(event,once[i]);
}
}
return this;
}
//取消訂閱事件
events.off = function(event,callback){
if(!this._events||!this._events[event]){
return this;
}
for(var i=0,l=this._events[event].length;i<l;i++){
if(this._events[event][i]===callback){
this._events[event].splice(i,1);
return this;
}
}
return this;
}
//只訂閱一次事件
events.once = function(event,callback,context){
this._events = this._events ||{};
this._events[event]=this._events[event]||[];
callback.once = true;
this._events[event].push(callback);
return this;
}