• JS 的事件发送和监听代码编写


    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      </head>
      <body>
        <script>
          var events = {};//存储事件总线的对象
          var eventEmitter = {
            emit: function (eventName) {
              /**
               * 发送事件的时候获取发送事件携带的参数,在pubsubjs中是返回了所有的参数,这才看到了第一个参数是事件名
               * 第二个参数是事件携带的参数,我们在这里暂时只返回携带的参数给监听方法
               * 发送方法可以有多个,参数内容也可以不断的改,但是监听的事件只有一个,每次都只是监听初始化发来的参数,
               * 所以循环列表的时候如果有多个方法也只是执行第一次发来的参数,不合理,所以监听方法只能有一个
               * 
              **/
              var args = arguments[1]
              var callbackArr = events[eventName];
              //发送的事件到事件对象中按照事件名字去寻找指定的事件列表
              if (callbackArr && callbackArr.length) {
                for (var i = 0; i < callbackArr.length; i++) {
                  //然后循环执行列表中注册加入进来的事件连带参数
                  callbackArr[i](args||null);
                }
              }
            },
          };
          var eventListener = {
            on: function (eventName, callback) {
              //eventName就是事件的名字,如果对象中没有指定的属性就创建一个空的指定对象属性的数组
              if (!events[eventName]) {
                events[eventName] = [];
              }
              //成为数组以后就把监听指定事件名称的函数放入数组
              events[eventName].push(callback);
            },
            remove: function (eventName, callback) {
              var callbackArr = events[eventName];
              //移除事件的时候找到了指定事件名的属性,然后删除他的事件列表,这样发送事件后监听的时候就没有这个事件了
              if (callbackArr && callbackArr.length) {
                var index = callbackArr.indexOf(callback);
                callbackArr.splice(index, 1);
              }
            },
          };
    
          var clickCallback = function () {
            console.log("click callback");
          };
          eventListener.on("click", clickCallback);
          // eventListener.on("say", (data)=>{
          //   console.log('早上好'+data.name)
          // });
          eventListener.on("click", function () {
            console.log("other click callback");
          });
          eventEmitter.emit("click");
          eventListener.remove("click", clickCallback);
          eventEmitter.emit("click");
          // eventEmitter.emit("say",{name:'张三'});
          // eventEmitter.emit("say",{name:'李四'});
        </script>
      </body>
    </html>
    积累小的知识,才能成就大的智慧,希望网上少一些复制多一些原创有用的答案
  • 相关阅读:
    VC++文件操作之最全篇
    MFC六大核心机制之五、六:消息映射和命令传递
    MFC六大核心机制之四:永久保存(串行化)
    MFC六大核心机制之三:动态创建
    MFC六大核心机制之二:运行时类型识别(RTTI)
    MFC六大核心机制之一:MFC程序的初始化
    VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
    VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)
    java并发系列(四)-----源码角度彻底理解ReentrantLock(重入锁)、AQS
    java并发系列(三)-----ReentrantLock(重入锁)功能详解和应用演示
  • 原文地址:https://www.cnblogs.com/llcdbk/p/14861620.html
Copyright © 2020-2023  润新知