当前位置: 首页 > news >正文

发布订阅模式

一、常见的发布订阅模式

1、Dom的事件

Event + addEventListener + dispatchEvent

//订阅中心
const event = new Event('zyk');
//订阅
document.addEventListener('zyk', (value)=>{console.log('我收到了:', value)
});
//发布
document.dispatchEvent(e, '1');
document.dispatchEvent(e, '2');

遍历小工具(免密登录):

        通过Dom的事件中心,自动填充用户名、密码,无需手动输入。把以下代码添加收藏到网页,每次点击页面,就可以触发

javascript:
var inputEvent = documnet.createEvent('Event');
inputEvent.initEvent('init');
//获取用户名、密码、登录按钮的Dom
var userInput = document.getElementsByName('usernameInput')[0];
var pwdInput = document.getElementsByName('passwordInput')[0];
var loginButton = document.getElementsByName('loginBtn')[0];
//设置用户、密码的值
userInput.value = 'zyk';
pwdInput.value = '123456';
//发布用户名、密码的事件
userInput.dispatchEvent(inputEvent);
pwdInput.dispatchEvent(inputEvent);
//触发登录按钮的click事件
loginButton.click();

二、手写一个发布订阅中心

思路:

        模仿Event+addEventListener+dispatchEvent,我们的发布订阅库需要以下方法:

  • on = (event: string, callback: Function):void=>{}  //订阅
  • emit = (event: string, ...args): void =>{} //进行发布
  • off = (event: string, callback: Function): void => {} //取消订阅
  • once(event: string, callback: Function):void=>{}  //无论发布多少次,只订阅一次

实现代码:

class EventEmitter {constructor() {this.events = new Map();}on(event, callback) {if (this.events.has(event)) {let cbList = this.events.get(event);cbList.push(callback);this.events.set(event, cbList);} else {this.events.set(event, [callback]);}}emit(event, ...args) {let cbList = this.events.get(event);if (Array.isArray(cbList) && cbList.length > 0 ) {cbList.forEach(cb => cb(...args));}}off(event, callback) {let cbList = this.events.get(event);if(Array.isArray(cbList) && cbList.length >0) {cbList = cbList.filter(cb => cb!==callback);this.events.set(event, cbList);}}once(event, callback) {const fn = (...args) => {callback(...args); //执行一次this.off(event, fn);}this.on(event, fn)}
}

使用:

【1】发布多次,都可以一个他订阅

【2】发布1次,可以被多个订阅到

【3】取消一个订阅

【4】只订阅一次

相关文章:

发布订阅模式

一、常见的发布订阅模式 1、Dom的事件 Event addEventListener dispatchEvent //订阅中心 const event new Event(zyk); //订阅 document.addEventListener(zyk, (value)>{console.log(我收到了:, value) }); //发布 document.dispatchEvent(e, 1); docume…...

【Java 演示灵活导出数据】

演示灵活导出数据 🎉🎉🎉🎉🎉🎉【小吴小吴bug全无开通公众号】关注公众号获取第一时间博客动态 背景今天临时起兴打开稀土掘金导航栏看到页面推广gitee项目恰巧最近也在学习python了解到python爬虫很厉害&…...

一对一WebRTC视频通话系列(六)——部署到公网

本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习&#xff0c;梳理总结后写下文章&#xff0c;对音视频相关内容感…...

【数据结构】线性表----链表详解

数据结构—-链表详解 目录 文章目录 链表的定义链表的构成链表的分类双向和单向带头和不带头循环和不循环 链表的命名基本操作的实现初始化打印取值查找插入指定位置插入删除删除销毁 部分其他链表的代码实现循环链表双向链表 优点/缺点&#xff08;对比顺序表&#xff09;优点…...

【小程序】小程序如何适配手机屏幕

小程序如何适配手机屏幕 1. 使用rpx单位2. 百分比布局3. 弹性盒子&#xff08;Flexbox&#xff09;和网格布局4. 媒体查询5. 响应式布局6. 测试和调试 1. 使用rpx单位 rpx&#xff08;responsive pixel&#xff09;是小程序中的一种长度单位&#xff0c;可以根据屏幕宽度进行自…...

第15节 编写shellcode加载器

我最近在做一个关于shellcode入门和开发的专题课&#x1f469;&#x1f3fb;‍&#x1f4bb;&#xff0c;主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料&#xff0c;内容里面的每一个环境我都亲自测试实操过的记录&#xff0c;有需要的小伙伴可以参考…...

JAVA学习-练习试用Java实现爬楼梯

问题: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2 输出&#xff1a; 2 解释&#xff1a; 有两种方法可以爬到楼…...

[SWPUCTF 2021 新生赛]PseudoProtocols、[SWPUCTF 2022 新生赛]ez_ez_php

[SWPUCTF 2021 新生赛]PseudoProtocols 打开环境&#xff0c;提示hint.php就在这里&#xff0c;且含有参数wllm 尝试利用PHP伪协议读取该文件 ?wllmphp://filter/convert.base64-encode/resourcehint.php//文件路径php://filter 读取源代码并进行base64编码输出。 有一些敏…...

Hive-拉链表的设计与实现

Hive-拉链表的设计与实现 在Hive中&#xff0c;拉链表专门用于解决在数据仓库中数据发生变化如何实现数据存储的问题。 1.数据同步问题 Hive在实际工作中主要用于构建离线数据仓库&#xff0c;定期的从各种数据源中同步采集数据到Hive中&#xff0c;经过分层转换提供数据应用…...

AI应用案例:会议纪要自动生成

以腾讯会议转录生成的会议记录为研究对象&#xff0c;借助大模型强大的语义理解和文本生成等能力&#xff0c;利用指令和文本向量搜索实现摘要总结、要点提取、行动项目提取、会议纪要生成等过程&#xff0c;完成会议纪要的自动总结和生成&#xff0c;降低人工记录和整理时间成…...

基于光纤技术的新能源汽车电池安全监测--FOM²系统

为什么要进行动力电池包的温度监测&#xff1f; 新能源电动汽车的动力电池包的工作温度&#xff0c;不仅会影响电池包性能&#xff0c;而且直接关系到车辆安全。时有发生的新能源汽车电池包起火事件&#xff0c;对电池包、冷却系统以及电池管理系统&#xff08;BMS&#xff09…...

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; #Options local_llm llama3 llm ChatOllama(modellocal_llm, format"json", temperature0) #embeddings #embeddings OllamaEmbeddings(model"nomic-embed-text") embed…...

Spring MVC(三) 参数传递

1 Controller到View的参数传递 在Spring MVC中&#xff0c;把值从Controller传递到View共有5中操作方法&#xff0c;分别是。 使用HttpServletRequest或HttpSession。使用ModelAndView。使用Map集合使用Model使用ModelMap 使用HttpServletRequest或HttpSession传值 使用HttpSe…...

常见加解密算法02 - RC4算法分析

RC4是一种广泛使用的流密码&#xff0c;它以其简洁和速度而闻名。区别于块密码&#xff0c;流密码特点在于按位或按字节来进行加密。 RC4由Ron Rivest在1987年设计&#xff0c;尽管它的命名看起来是第四版&#xff0c;实际上它是第一个对外发布的版本。 RC4算法的实施过程简洁…...

如何使用 ERNIE 千帆大模型基于 Flask 搭建智能英语能力评测对话网页机器人(详细教程)

ERNIE 千帆大模型 ERNIE-3.5是一款基于深度学习技术构建的高效语言模型&#xff0c;其强大的综合能力使其在中文应用方面表现出色。相较于其他模型&#xff0c;如微软的ChatGPT&#xff0c;ERNIE-3.5不仅综合能力更强&#xff0c;而且在训练与推理效率上也更高。这使得ERNIE-3…...

Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目录 一、全局异常处理器的类型1-1、实现方式一1-2、实现方式二 二、全局异常拦截点2-1、入口2-2、全局异常拦截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、执行3-1、解析3-2、执行 四、其它4-1、设…...

代码随想录35期Day38-Java(Day37休息)

Day38题目 LeetCode509.斐波那契数列 核心思想:很简单dp[i]dp[i-1]dp[i-2].这里用了数组存储的形式,也可以递归 class Solution {public int fib(int n) {int[] dp new int[n2];dp[0] 0;dp[1] 1;for(int i 2 ; i < n ; i ){dp[i] dp[i-1] dp[i-2];}return dp[n];} …...

力扣HOT100 - 739. 每日温度

解题思路&#xff1a; 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Deque<Integer> stack new LinkedList<>();for (int i 0; i < length; i) {int temperatu…...

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网&#xff08;基本步骤&#xff09; 下载scrapy框架创建项目&#xff08;项目文件夹不能使用数字开头&#xff0c;不能包含汉字&#xff09;创建爬虫文件&#xff08;1&#xff09;第一步&#xff1a;先进入到spiders文件中&#x…...

C++ QT设计模式:责任链模式

基本概念 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;将请求沿着处理链传递&#xff0c;直到有一个对象能够处理为止。 实现的模块有&#xff1a; Handler&#xff08;处理者&#xff09;&#xff1a;定义一个处理…...

3步解锁CefFlashBrowser:让Flash内容重获新生的终极方案

3步解锁CefFlashBrowser&#xff1a;让Flash内容重获新生的终极方案 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 当你珍藏多年的Flash游戏无法启动&#xff0c;企业培训系统因浏览器不…...

华为防火墙IPsec点对点配置实战:从零到通的完整流程(附常见错误排查)

华为防火墙IPsec点对点配置实战&#xff1a;从零到通的完整流程&#xff08;附常见错误排查&#xff09; 在当今企业网络架构中&#xff0c;跨地域分支机构之间的安全通信已成为刚需。IPsec VPN凭借其强大的加密能力和标准化协议支持&#xff0c;成为构建安全通道的首选方案。华…...

5分钟快速上手:解锁付费内容的终极指南

5分钟快速上手&#xff1a;解锁付费内容的终极指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息时代&#xff0c;优质内容常常被付费墙阻隔&#xff0c;但今天我要为你介绍一…...

[游戏辅助工具] HunterPie:怪物猎人世界数据可视化解决方案 - 面向狩猎效率追求者

[游戏辅助工具] HunterPie&#xff1a;怪物猎人世界数据可视化解决方案 - 面向狩猎效率追求者 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/…...

Pixel Dimension Fissioner 社交媒体内容生成:自动化生产像素风格营销图片

Pixel Dimension Fissioner 社交媒体内容生成&#xff1a;自动化生产像素风格营销图片 1. 社交媒体运营的视觉内容困境 每天打开社交媒体后台&#xff0c;运营团队最头疼的问题总是惊人的一致&#xff1a;内容不够发。特别是需要大量视觉素材的节日营销期&#xff0c;设计师加…...

影墨·今颜保姆级教程:24GB显卡上跑FLUX.1-dev高清人像生成

影墨今颜保姆级教程&#xff1a;24GB显卡上跑FLUX.1-dev高清人像生成 1. 教程前言&#xff1a;从零开始掌握高端AI人像生成 你是否曾经被AI生成的人像那种"塑料感"所困扰&#xff1f;想要创作出具有电影质感、极致真实的时尚人像&#xff0c;却苦于没有合适的技术方…...

Qwen3.5-2B模型Java环境快速配置与Hello World实例

Qwen3.5-2B模型Java环境快速配置与Hello World实例 1. 前言&#xff1a;为什么选择Java调用Qwen3.5-2B 如果你是一名Java开发者&#xff0c;想要快速体验大语言模型的魅力&#xff0c;这篇教程就是为你准备的。Qwen3.5-2B作为一款轻量级但性能出色的开源模型&#xff0c;非常…...

C++ 智能指针的生命周期分析

C智能指针的生命周期分析 在现代C开发中&#xff0c;智能指针是管理动态内存的重要工具&#xff0c;它通过自动化的资源管理机制显著降低了内存泄漏和悬垂指针的风险。理解智能指针的生命周期对于编写高效、安全的代码至关重要。本文将深入分析智能指针的生命周期&#xff0c;…...

seo关键词买量报价是多少_seo关键词推广报价是多少

SEO关键词买量报价是多少_SEO关键词推广报价是多少 在当前的数字营销环境中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为企业提升网站流量和品牌知名度的重要手段。其中&#xff0c;关键词买量报价和关键词推广报价是两个关键概念&#xff0c;对于企业进行SE…...

K3s证书过期急救指南:5分钟搞定证书轮换(附一键脚本)

K3s证书过期急救指南&#xff1a;5分钟搞定证书轮换&#xff08;附一键脚本&#xff09; 凌晨三点&#xff0c;报警短信突然炸响——K3s集群所有服务不可用。登录控制台看到满屏的x509: certificate has expired or is not yet valid报错时&#xff0c;我才意识到证书过期这个&…...