JS事件派發器EventEmitter


原文地址:http://zhangyiheng.com/blog/articles/js_event_mitter.html

需求

隨着Browser客戶端JS越來越復雜,MVC(Client端)設計模式成為一個很好的開發選擇, 而MVC開發模式中,最基礎的功能就是把Model和View關聯起來, 當Model發生變化的時候,View呈現做出相應的調整。

實現此功能最合適的方式莫過於事件Event了, 對於Event大家應該都很熟悉,比如dom中的button,可以通過addEventListener/attachEvent添加click事件處理。

而一般的object對象是沒有事件派發功能的,基於此需求,實現了一個EventEmitter。



/** * Created by taozh on 2017/6/22. * taozh1982@gmail.com */ var EventEmitter = function () { this.__z_e_listeners = {}; }; EventEmitter.prototype.on = function (evt, handler, context) { var handlers = this.__z_e_listeners[evt]; if (handlers === undefined) { handlers = []; this.__z_e_listeners[evt] = handlers; } var item = { handler: handler, context: context }; handlers.push(item); return item; }; EventEmitter.prototype.off = function (evt, handler, context) { var handlers = this.__z_e_listeners[evt]; if (handlers !== undefined) { var size = handlers.length; for (var i = 0; i < size; i++) { var item = handlers[i]; if (item.handler === handler && item.context === context) { handlers.splice(i, 1); return; } } } }; EventEmitter.prototype.emit = function (type, event) { var hanlders = this.__z_e_listeners[type]; if (hanlders !== undefined) { var size = hanlders.length; for (var i = 0; i < size; i++) { var ef = hanlders[i]; var handler = ef.handler; var context = ef.context; handler.apply(context, [event]); } } };


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM