1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- class Event {
- on(event, fn, ctx) {
- if (typeof fn !== 'function') {
- console.error('listener must be a function')
- return
- }
- this._stores = this._stores || {};
- (this._stores[event] = this._stores[event] || []).push({ cb: fn, ctx: ctx })
- }
- emit(event) {
- this._stores = this._stores || {}
- let store = this._stores[event]
- let args
- if (store) {
- store = store.slice(0)
- args = [].slice.call(arguments, 1),
- args[0] = {
- eventCode: event,
- data: args[0],
- }
- for (let i = 0, len = store.length; i < len; i++) {
- store[i].cb.apply(store[i].ctx, args)
- }
- }
- }
- off(event, fn) {
- this._stores = this._stores || {}
- // all
- if (!arguments.length) {
- this._stores = {}
- return
- }
- // specific event
- const store = this._stores[event]
- if (!store) return
- // remove all handlers
- if (arguments.length === 1) {
- delete this._stores[event]
- return
- }
- // remove specific handler
- let cb
- for (let i = 0, len = store.length; i < len; i++) {
- cb = store[i].cb
- if (cb === fn) {
- store.splice(i, 1)
- break
- }
- }
- return
- }
- }
- module.exports = Event
|