js自写发布订阅模块

2023-11-10

实现效果如下图所示:
在这里插入图片描述
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <button id="count">点我</button>
  <button id="show"></button>

  <script>
    /*************  封装的发布订阅模块start  *************/
    var event = {
      clientList: {},
      //订阅
      listen: function(key, fn) {
        if (!this.clientList[key]) {
          this.clientList[key] = []
        }
        this.clientList[key].push(fn) //事件添加到clientList
      },
      //发布
      trigger: function() {
        var key = Array.prototype.shift.call(arguments),  //获取trigger()第一个参数 /订阅事件名
            fns = this.clientList[key]; //获取订阅事件名对应的事件
        if (!fns || fns.length === 0) {
          return false
        }
        for (var i = 0, fn; fn = fns[i++];) {
          fn.apply(this, arguments);  //一个一个执行
        }
      },
      //删除
      remove: function (key, fn) {
        var fns = this.clientList[ key ]
        if ( !fns ) { //是否有这个订阅的事件名
          return false
        }
        if ( !fn ) {  //2参没有值就全部清空该订阅事件
          fns && (fns.length = 0)
        } else {
          for (var l = fns.length - 1; l >= 0; l--) {
            var _fn = fns[l]
            if (_fn === fn) {
              fns.splice(l, 1)  //删除订阅着的回调函数
            }
          }
        }
      }
    }
    /*************  封装的发布订阅模块end  *************/

    //制造发布订阅函数
    var installEvent = function(obj) {
      for (var i in event) {
        obj[i] = event[i]
      }
    }

    //制造一个名为Event的发布订阅方法
    var Event = {}
    installEvent(Event)

    var a = (function () {
      var count = 0
      var button = document.getElementById('count')
      button.onclick = function () {
        //2. 当点击id=count按钮后发布执行add集合内所有的方法
        Event.trigger('add', count++)
      }
    })()

    var b = (function () {
      var div = document.getElementById('show')
      //1. 先在key为add的方法集合内订阅一个方法
      Event.listen('add', function(count) {
        div.innerHTML = count
      })
    })()
  </script>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js自写发布订阅模块 的相关文章

  • Python开发技术—文件和异常2

    第1关 读取CSV文件1 任务描述 本关任务 编写一个能读取csv文件的程序 将指定的文件按照要求的格式输出 相关知识 为了完成本关任务 你需要掌握 1 csv模块 测试说明 平台会对你编写的代码进行测试 在你的程序的当前目录下存在一个bo
  • QGIS二次开发08:QGIS的二次封装例子

    QGIS体系过于庞大 对二次开发有一定的学习难度 同时在后续的多个项目中会有大量相同功能的应用 因此有必要进行二次封装 暴露必要的实现接口 从而简化开发的难度 一 基础封装功能 1 空间数据加载和显示 实现工程文件加载和显示 2 地图交互动
  • 【CSS】背景图定位问题适配不同机型

    需求 如图 实现一个带有飘带的渐变背景 其中头像必须显示飘带凹下去那里 需要适配不同的机型 一不下心容易错位 实现 因为飘带背景是版本迭代中更新的 所以飘带和渐变背景实则两个div 飘带切图如下 圆形部分需要契合头像
  • 20分钟,使用Amazon SageMaker快速搭建属于自己的AIGC应用

    真火 作为最近一段时间人工智能领域内的顶流之一 AIGC AI Generated Content 早已火爆出圈 频登各大互联网平台热搜 cite 微软亚洲研究院官方微博 这段时间以来 基于深度学习的内容生成在图像 视频 语音 音乐 文本等
  • 融合网络位置服务器,4G/5G定位的关键技术及异构融合一体化定位系统的网络架构...

    摘要 如何提高室内定位精度并实现室内外定位的连续无缝覆盖是定位领域急需解决的问题 针对该问题 首先介绍了4G定位的标准与技术 并分析了其特点与不足 然后 分析了面向5G的超密集组网下的定位技术 AOA TDOA定位技术以及上下行定位技术 最
  • 【python教程】之try--except异常捕获

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 异常简介 捕获异常 try except except捕获异常类型 捕获多个异常的方式 不明确错误类型的情况 try except else try except
  • 上线代码质量审查解决方案

    前言 使用自动化工具和人工审查并行方式检查程序源代码是否存在安全隐患 或者有编码不规范的地方 利用自动化代码审计工具 如CheckStyle FindBugs PMD JTest 进行代码审计 以及每周定期组织对最近开发的业务进行代码评审
  • java javaw 命令区别_java 和javaw 的区别

    javaw exe用法和java exe 相同 javaw的程序不在java console 上面显示任何东西 如果在开发程序 就用java 这样可以看到错误提示 如果是运行完成了的程序 就用javaw 可以提高一点速度 两个应用程序都能运
  • I2C总线的通讯距离

    关于I2C总线 I2C总线不适合远距离通信 尤其是使用线缆与接口器件进行通信时一般不选择 I2C 使用I2C总线都是在用一个开发板上或者距离比较近 如果是远距离通信 比如说超过2米 这个时候对硬件就有特殊的要求了 通信线缆小于0 2米 一般

随机推荐

  • STM32学习之以太网介绍

    以太网简介 以太网 Ethernet 是互联网技术的一种 由于它是在组网技术中占的比例最高 很多人直接把以太网理解为互联网 以太网是指遵守IEEE802 3标准组成的局域网 由IEEE 802 3标准规定的主要是位于参考模型的物理层 PHY
  • uboot命令使用学习(4)

    学习目标 uboot命令使用学习 4 EMMC和SD卡操作命令 学习内容 学习使用了正点原子的I MX6ULL教程及开发平台 1 mmc info命令 2 mmc rescan命令 3 mmc list命令 4 mmc dev命令 5 mm
  • 手撕RPC第一天

    前言 众所周知 RPC 远程服务调用 成为现代架构中不可或缺的一部分 那么 熟悉RPC的原理就显得相当重要了 在这个前提下 我开始了学习RPC之路 常见的rpc框架有轻量级的thrift 国内开源的使用众多的dubbo go实现的gRPC
  • linux cannot connect to wifi

    If you cannot connect to wifi while previously you can You may switch to a different kernel if you have an alternative o
  • Android xml属性大全

    第一类 属性值为true或false android layout centerHrizontal 水平居中 android layout centerVertical 垂直居中 android layout centerInparent
  • php:一次完整的HTTP请求过程笔记

    HTTP 事务执行过程 1 客户端 浏览器 做出请求操作 输入网址 点击链接 提交表单 2 客户端检测缓存 1 有缓存且较新 客户端直接读取本地缓存进行资源展示 2 有缓存但是不新 准备http请求包 发送至服务端进行缓存校验 3 客户端对
  • vue3 使用element plus 打包时 报错

    vue3 vite ts elementPlus中运行正常打包出错 能正常运行 但是打包出错 解决打包时出现导入element plus相关的爆红 导致无法打包的问题 如若出现类似于 Module element plus has no e
  • jenkins+ant&findbugs&fireline

    火线在jenkins上的安装 http magic 360 cn zh user html Jenkins jenkins插件离线下载的好地方 http updates jenkins ci org download plugins 在je
  • C语言运算符——自增与自减

    自增与自减 一个整数类型的变量自身加 1 可以这样写 a a 1 或者a 1 不过 C语言还支持另外一种更加简洁的写法 就是 a 或者 a 这种写法叫做自加或自增 意思很明确 就是每次自身加 1 相应的 也有a 和 a 它们叫做自减 表示自
  • 功能测试数据测试之数据测试关注点

    数据类型 常见数据类型 整型 浮点型 字符型 布尔型等 可用等价类方法对输入数据类型设计测试用例 数据长度 数据长度可能是固定长度或者是在某个范围内的长度 可用等价类和边界值方法对数据长度设计测试用例 数据一致性 组织数据测试该交易 在交易
  • Fatal Python error: init_sys_streams: can‘t initialize sys standard streamsPython runtime state: 问题

    哈喽 大家好 我是 奇点 江湖人称 singularity 刚工作几年 想和大家一同进步 一位上进心十足的 Java ToB端大厂领域博主 喜欢java和python 平时比较懒 能用程序解决的坚决不手动解决 如果有对 java 感兴趣的
  • canvas绘制火柴人

  • 每日面试题day02

    1 int 和 Integer 有什么区别 int 是基本数据类型 Integer 是其包装类 注意是一个类 在 java 中包装类 用途比较多的是用在于各种数据类型的转化中 2 重载和重写的区别 overload 重载 参数类型 个数 顺
  • vue3如何进行数据监听watch/watchEffect

    我们都知道监听器的作用是在每次响应式状态发生变化时触发 在组合式 API 中 我们可以使用 watch 函数和watchEffect 函数 当你更改了响应式状态 它可能会同时触发 Vue 组件更新和侦听器回调 默认情况下 用户创建的侦听器回
  • IntelliJ IDEA Plugins加载太慢_IntelliJ IDEA Plugins搜不出来【已解决】

    问题 IntelliJ IDEA Plugins加载太慢或者IntelliJ IDEA Plugins搜不出来 解决方案
  • html form 表单

    定义 form 表单在网页中主要负责数据采集功能 属于一个容器标记 表单组成 一个表单由 form元素 表单控件 和 表单按钮 组成 1 form元素 form元素用来创建表单 语法格式如下
  • SQL中根据经纬度计算两点之间的直线距离

    最近接到一个需求获取当前用户的经纬度 然后计算与目标地的的距离 我自己也是看别人的博客学习 自己也做个记录吧 直接放出计算的公式 不想浪费时间的 直接看公式套进去就成 依次是纬度 纬度 经度 round 6378 138 2 ASIN SQ
  • vue显示PDF文件

    小编最近接手的项目中 有个需求 前端显示后端返回的PDF格式的文件 经过小编两天的调研和试验 终于找到了一个比较好的插件方法 直接贴代码 1 安装 npm i vue pdf signature save dev 2 pdfShow vue
  • 一个测试的成长历程【功能测试篇】——web测试的总结

  • js自写发布订阅模块

    实现效果如下图所示 代码如下