美文网首页
原生js封装事件绑定$on、事件触发$emit和事件移除$off

原生js封装事件绑定$on、事件触发$emit和事件移除$off

作者: 魔仙堡杠把子灬 | 来源:发表于2020-04-16 15:39 被阅读0次

    生活就是一边选择 ,一边放弃

    前端QQ群: 981668406
    在此附上我的QQ: 2489757828 有问题的话可以一同探讨
    我的github: 李大玄
    我的私人博客: 李大玄
    我的简书: 李大玄
    我的CSDN: 李大玄

    事件分析:一对多,观察者模式
      1.建立事件仓库:obj{key:val,key:val}
      2.事件绑定(name,fn):先判断事件名称name在事件仓库中是否存在,不存在,则初始化obj[name]=[];将需要绑定的事件push进数组中.
      3.事件触发(name,val):先判断事件名称name在事件仓库中是否存在,存在则遍历数组每个fn元素,调用事件;val为传递的参数.
      4.事件移除(name,fn):先判断事件名称name在事件仓库中是否存在,再判断fn是否有,最后判断fn是否存在数组中,存在则删除fn数组元素;若无fn则清空数组.

    原生js封装事件:

    var Event = {
        handlers: {},
        /**
         * 监听指定函数
         * @param eventName {string} 事件名称
         * @param callback {function} 处理函数
         */
        on: function (eventName, callback) {
          var handlers = this.handlers;
      
          // 判断是否有相关事件的监听者,如果没有则创建
          if (!handlers[eventName]) {
            handlers[eventName] = [];
          }
          // 增加指定事件的监听者
          handlers[eventName].push(callback);
        },
        /**
         * 触发指定事件
         * @param eventName {string} 事件名称
         */
        emit: function (eventName) {
          var eventHandlers = this.handlers[eventName];
          // 循环调用相关观察者处理函数
          if(eventHandlers){
            for(var i = 0, len = eventHandlers.length; i < len; i++) {
              var handler = eventHandlers[i];
              // 调用
              handler(eventName);
            }
          }
        }
      };
    // 第一个监听观察 topic1
    Event.on('someTopic', function () {
        console.log('someTopic1');
     });
     // 第二个监听观察 topic1
     Event.on('someTopic', function () {
        console.log('someTopic2');
     });
     // 第一个监听观察 topic2
     Event.on('otherTopic', function () {
         console.log('otherTopic');
     });
     Event.emit('someTopic'); // 输出 'someTopic1' 和 'someTopic2'
     Event.emit('otherTopic'); // 输出 'otherTopic'
    

    相关文章

      网友评论

          本文标题:原生js封装事件绑定$on、事件触发$emit和事件移除$off

          本文链接:https://www.haomeiwen.com/subject/xwarvhtx.html