zoukankan      html  css  js  c++  java
  • 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>
    积累小的知识,才能成就大的智慧,希望网上少一些复制多一些原创有用的答案
  • 相关阅读:
    P2155 [SDOI2008]沙拉公主的困惑
    P4345 [SHOI2015]超能粒子炮·改
    乘法逆元
    P1608 路径统计
    P1342 请柬
    一些网址
    20/08/02测试
    ivqBlog 开源博客 (angularjs + express + mongodb)
    angularjs, nodejs, express, gulp, karma, jasmine 前端方案整合
    参照nopCommerce框架开发(NextCMS)
  • 原文地址:https://www.cnblogs.com/llcdbk/p/14861620.html
Copyright © 2011-2022 走看看