92 lines
2.0 KiB
JavaScript
92 lines
2.0 KiB
JavaScript
|
class SEvent {
|
|||
|
constructor(eventName, isGetEvent) {
|
|||
|
if (!isGetEvent) {
|
|||
|
throw 'SEventError:get SEvent instance from SEvent.getEvent!'
|
|||
|
}
|
|||
|
this.handlers = []
|
|||
|
SEvent.events[eventName] = this
|
|||
|
}
|
|||
|
|
|||
|
static getEvent(eventName) {
|
|||
|
SEvent.events = SEvent.events || {};
|
|||
|
const keys = Object.keys(SEvent.events)
|
|||
|
for (const key of keys) {
|
|||
|
if (key === eventName) {
|
|||
|
return SEvent.events[key]
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
return new SEvent(eventName, true)
|
|||
|
}
|
|||
|
|
|||
|
static removeEvent(eventName) {
|
|||
|
const keys = Object.keys(SEvent.events)
|
|||
|
for (const key of keys) {
|
|||
|
if (key === eventName) {
|
|||
|
SEvent.events[key].handlers = null
|
|||
|
delete SEvent.events[key]
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static off(listenerId){
|
|||
|
for(const key of Object.keys(SEvent.events)){
|
|||
|
for(let i=0; i<SEvent.events[key].handlers.length; i++){
|
|||
|
if (listenerId === SEvent.events[key].handlers[i].id){
|
|||
|
SEvent.events[key].handlers.splice(i, 1)
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
on(handler) {
|
|||
|
if (handler && typeof (handler) === 'function') {
|
|||
|
this.handlers.push({
|
|||
|
id: SEvent.listenerId,
|
|||
|
handler
|
|||
|
})
|
|||
|
return SEvent.listenerId++
|
|||
|
}
|
|||
|
return 0
|
|||
|
}
|
|||
|
|
|||
|
once(handler){
|
|||
|
const originHandler = handler
|
|||
|
handler = (args) => {
|
|||
|
originHandler(args)
|
|||
|
this.off(handler)
|
|||
|
}
|
|||
|
this.on(handler)
|
|||
|
}
|
|||
|
|
|||
|
emit(args) {
|
|||
|
if (!(this.handlers && this.handlers.length)) return
|
|||
|
let l = this.handlers.length
|
|||
|
let i = 0
|
|||
|
while(i < this.handlers.length){
|
|||
|
this.handlers[i++].handler(...arguments)
|
|||
|
// 防止删除某些once事件的handler导致length改变
|
|||
|
if (this.handlers.length == l - 1) {
|
|||
|
i--
|
|||
|
l--
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
off(handler) {
|
|||
|
if (!(this.handlers && this.handlers.length)) return
|
|||
|
for (let i = 0; i < this.handlers.length; i++) {
|
|||
|
if (this.handlers[i].handler === handler) {
|
|||
|
this.handlers.splice(i, 1)
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
SEvent.listenerId = 1
|
|||
|
|
|||
|
module.exports = SEvent
|
|||
|
|
|||
|
|