第113天 用js写一个事件侦听器的方法
Activity
ghost commentedon Aug 7, 2019
题面讲得有点迷惑...我瞎猜一下它要我干啥吧事件监听器:EventListener
,就是EventEmitter
触发事件时的 handler,是一个函数。然后给这个函数增加一个方法?这里有一份非常短的 Event Emitter 实现(甚至支持通配符:
HCLQ commentedon Aug 7, 2019
bertcai commentedon Aug 7, 2019
events = {};
这样直接赋值是不对的,需要用构造函数包裹。ghost commentedon Aug 7, 2019
@bertcai
类内直接声明成员是一个 Stage 3 草案;见此。
HCLQ commentedon Aug 7, 2019
感谢指出..
实际可以这么写的,有babel..我本来写的ts。。删了private 之类的ㄟ( ▔, ▔ )ㄏ
LinStan commentedon Aug 7, 2019
huangguohua96 commentedon Aug 7, 2019
function addEvent(elem, type, handle) {
if (elem.addEventListener) { //W3C标准
elem.addEventListener(type, handle, false); //事件冒泡时触发
} else if (elem.attachEvent) { //IE独有
elem.attachEvent('on' + type, function() {
handle.call(elem); //改变this使其指向指定元素
});
} else {
elem['on' + type] = handle; // 最古老
}
}
IFmiss commentedon Aug 13, 2019
参考网上的代码加了点自己的东西
xiaoqiangz commentedon Jul 5, 2022
class EventBus {
constructor() {
this.event = {}
}
on(type, handle) {
let event = this.event
if (!event[type]) {
event[type] = []
}
event[type].push(handle)
}
emit(type, params) {
let handles = this.event[type]
handles && handles.length && handles.forEach((cb) => {
cb(params)
})
}
off(type, handle) {
let handles = this.event[type]
handles && handles.length && handles.forEach((cb ,index) => {
if (cb == handle) {
handles.splice(index, 1)
}
})
}
}
function fn(param) {
console.log('click-----------', param)
}
const event = new EventBus()
event.on('click', fn)
event.off('click', fn)
event.on('doubleClick', (param)=>{
console.log('doubleClick------------', param)
})
setTimeout(()=> {
event.emit('click', 'click')
}, 2000)
setTimeout(()=> {
event.emit('doubleClick', 'doubleClick')
}, 3000)