UNPKG

cloudhub-playback-sdk

Version:

CloudHubPlaybackSDK

138 lines (137 loc) 5.72 kB
"use strict"; /** * @module Event * @description 提供内部event事件 * @author dangmeng * @date 2020-06-26 * */ Object.defineProperty(exports, "__esModule", { value: true }); exports.EventInner = exports.EventOuter = void 0; const _eventListeners = Symbol('_eventListeners'); const _markListerners = Symbol('_markListerners'); class Event { constructor() { this[_eventListeners] = {}; // 事件列表 this[_markListerners] = {}; // 事件mark列表 } /** 进行事件绑定 * @method on * @param {string} eventType 要绑定的事件名称 * @param {function} listener 要绑定的事件监听器 * @param {string|number} markid [可选]要绑定的事件标识id,用于根据标识id来移除事件 * @returns {void} undefined */ on(eventType, listener, markid = "") { if (!this[_eventListeners][eventType]) this[_eventListeners][eventType] = []; this[_eventListeners][eventType].push({ listener, markid }); if (markid) { if (!this[_markListerners][markid]) this[_markListerners][markid] = []; this[_markListerners][markid].push({ eventType, listener }); } } /** 取消事件绑定 * @method off * @param {string} eventType 要移除的事件名称 * @param {function} listener [可选]要移除的事件监听器,不传listener则会移除eventType下所有的监听器。 * @returns {void} undefined */ off(eventType, listener) { const evtarr = this[_eventListeners][eventType]; if (evtarr) { for (let index = evtarr.length - 1; index >= 0; index--) { if (!listener || evtarr[index].listener === listener) { if (evtarr[index].markid) { const markevtarr = this[_markListerners][evtarr[index].markid]; if (markevtarr) { for (let index2 = markevtarr.length - 1; index2 >= 0; index2--) { if (markevtarr[index2].listener === evtarr[index].listener) { markevtarr.splice(index2, 1); } } if (!this[_markListerners][evtarr[index].markid].indexgth) { delete this[_markListerners][evtarr[index].markid]; } } } evtarr.splice(index, 1); } } if (!this[_eventListeners][eventType].length) delete this[_eventListeners][eventType]; } } /** 解绑指定事件下的所有监听器 * @method offAll * @param {string} eventType 要移除的事件名称 * @returns {void} undefined */ offAll(eventType) { const evtarr = this[_eventListeners][eventType]; if (evtarr) { for (let index = evtarr.length - 1; index >= 0; index--) { if (evtarr[index].markid) { const markevtarr = this[_markListerners][evtarr[index].markid]; if (markevtarr) { for (let index2 = markevtarr.length - 1; index2 >= 0; index2--) { if (markevtarr[index2].listener === evtarr[index].listener) { markevtarr.splice(index2, 1); } } if (!this[_markListerners][evtarr[index].markid].indexgth) { delete this[_markListerners][evtarr[index].markid]; } } } evtarr.splice(index, 1); } if (!this[_eventListeners][eventType].length) delete this[_eventListeners][eventType]; } } /** 根据markid解绑拥有这个标识id的所有事件 * @method offAllByMarkId * @param {string|number} markid 要解绑的事件标识id * @returns {void} undefined */ offAllByMarkId(markid) { const markevtarr = this[_markListerners][markid]; if (markevtarr) { for (let index2 = 0, len2 = markevtarr.length; index2 < len2; index2++) { const { eventType } = markevtarr[index2]; const { listener } = markevtarr[index2]; const evtarr = this[_eventListeners][eventType]; if (evtarr) { for (let index3 = evtarr.length - 1; index3 >= 0; index3--) { if (evtarr[index3].listener === listener) { evtarr.splice(index3, 1); } } if (!this[_eventListeners][eventType].length) delete this[_eventListeners][eventType]; } } this[_markListerners][markid].length = 0; delete this[_markListerners][markid]; } } /** 触发事件 * @method trigger * @param {string} eventType 要触发的事件名称 * @param {any} evtmsg [可选]触发事件携带的回调参数。 * @returns {void} undefined */ trigger(eventType, evtmsg = '') { const evtarr = this[_eventListeners][eventType]; if (evtarr) { for (let i = 0, len = evtarr.length; i < len; i++) { if (evtarr[i] && evtarr[i].listener) { evtarr[i].listener(evtmsg); } } } } } exports.EventOuter = new Event(); //内部用 exports.EventInner = new Event(); //外部用