首页 > 试题广场 >

请实现一个简单的事件机制,能够实现对事件的触发和监听。

[问答题]

请实现一个简单的事件机制,能够实现对事件的触发和监听。

如:EventEmitter.on(); EventEmitter.trigger();

function EventEmit() {
    var obj = {}
    var eventNames = []
    var pid = 0

    function on(eventName, callback) {
        if (eventName in obj) {
            obj[eventName].callbacks.push(callback)  }
        else {
            obj[eventName]= {
                pid: pid++,
                callbacks: []
            }
            obj[eventName].callbacks.push(callback)
            eventNames.push(eventName)
        }
    }

    function trigger(eventName) {
        for( var i in obj) {
            if(i == eventName) {
                obj[eventName].callbacks.map(function (callback) {
                    callback()
                })
            }
        }

    }
    return {
        on: on,
        trigger: trigger
   }
}

编辑于 2019-06-27 14:40:25 回复(1)
const EventEmitter = {
    on:function(type,handle){
        //创建一个缓存
        this.cache = {};
        console.log(this);
        //判断是否有这个类型的事件
        if(!this.cache[type]){
            //没有则创建一个
            this.cache[type] = [handle];
        }else{
            //已经存在就推入
            this.cache[type].push(handle);
        }
    },
    trigger:function(type){
        //判断是否传入了参数,如果传入了就把它填进一个数组中
        var params = arguments.length > 1 ? Array.prototype.slice.call(arguments, 1) : [];
        if(this.cache[type]){
            this.cache[type].forEach(item => {
                //执行函数,并将参数传入
                item(params);
            })
        }
    }
}

发表于 2020-04-24 00:00:56 回复(0)
   class EventEmitter {
  constructor() {
    this.obj = {}
  }

  on(eventName) {
    for (let n in this.obj) {
      if (n == eventName) {
        this.obj[n].cbs.map(cb => {
          cb()
        })
      }
    }
  }

  emit(eventName, cb) {
    let obj = this.obj
    if (eventName in obj) {
      obj[eventName].cbs.push(cb)
    } else {
      obj[eventName] = {
        cbs: []
      }
      obj[eventName].cbs.push(cb)
    }
  }
}

let eventEmitter = new EventEmitter()
// 发布
eventEmitter.emit('test', () => {
  console.log("定义了时间")
})
// 订阅
eventEmitter.on('test')
发表于 2020-08-17 09:59:38 回复(0)
class EventEmiter {
  constructor() {
    this.event = [];
    this.handler = {};
  }
  emit(eventName) {
    this.event.push(eventName);
    this.event = [...new Set(this.event)];
  }
  on(eventName, callback) {
    const that = this;
    this.handler[eventName] = setInterval(() => {
      if (that.event.includes(eventName)) {
        that.event = that.event.filter((x) => x !== eventName);
        clearInterval(that.handler[eventName]);
        callback();
      }
    }, 0);
  }
}
发表于 2020-06-25 15:54:41 回复(0)
const EventEmitter = require('events')
class MyEvent extends EventEmitter{}
const myEventEmitter = new MyEvent()

myEventEmitter.on('event',()=>{
console.log('event happened')
})

myEventEmitter.emit('event')

发表于 2020-03-04 19:08:20 回复(0)
function EventEmitter(element){
    this.on=function(name,callback){
        element.addEventListener(name,callback)
    }
    this.trigger=function(name){
        // 创建事件
        var eve=new Event(name)
        // 触发事件
        element.dispatchEvent(eve);
    }
}
var ele=new EventEmitter(document.getElementById('one'));
// 监听事件
ele.on('test',function(){
    console.log("自定义事件被触发了")
})
// 触发事件
ele.trigger('test')

发表于 2020-02-19 11:00:44 回复(0)
链接:https://www.nowcoder.com/questionTerminal/e781eafdfa9341379906b41ec977b0ab?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网

function EventEmit() {
    var obj = {}
    var eventNames = []
    var pid = 0
 
    function on(eventName, callback) {
        if (eventName in obj) {
            obj[eventName].callbacks.push(callback)  }
        else {
            obj[eventName]= {
                pid: pid++,
                callbacks: []
            }
            obj[eventName].callbacks.push(callback)
            eventNames.push(eventName)
        }
    }
 
    function trigger(eventName) {
        for( var i in obj) {
            if(i == eventName) {
                obj[eventName].callbacks.map(function (callback) {
                    callback()
                })
            }
        }
 
    }
    return {
        on: on,
        trigger: trigger
   }
}  
发表于 2019-07-17 09:57:44 回复(0)
Element.prototype.methods = {};         Element.prototype.监听 = function(method, fun){             try{                 this.methods[method].push(fun);             }catch{                 this.methods[method] = [];                 this.methods[method].push(fun);             }         }         Element.prototype.触发 = function(method){             this.methods[method].forEach(element => {                 let promise = new Promise(function(resolve,reject){                     resolve(); //不知道传啥。                 })                 promise.then(element);             });         } //-------------------------
document.body.监听('说话',function(){
    console.log("好瞌睡。。。");
})
document.body.触发('说话');
//好瞌睡。。。
//undefined
编辑于 2019-06-30 01:44:45 回复(0)