web自定義事件

除了傳統(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;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,552評論 25 708
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,416評論 0 6
  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂君閱讀 5,603評論 0 106
  • 在今天之前,我一直后悔自己五年前的一個選擇,那就是:早知道我應(yīng)該聽父母的,找個離家近,家庭條件還不錯的人結(jié)婚。那就...
    凌薇莉姿閱讀 592評論 2 1