百行代码实现js事件监听实现跨页面数据传输

使用场景

类似消息队列的使用场景,支持同页面和跨页面通信,发送消息和接收消息

技术原理

  1. 跨页面通信:

基于事件监听,通过监听 storage事件监听回调机制,实现跨页面通信,让每个只操作自身页面的操作

  1. 同页面事件监听:

发送事件时,查找回调函数,触发回调

使用效果

使用示例

// 注册事件eventListener.addEventListener('showMessage', function (message) {console.debug("接收到的消息")})// 发送事件eventListener.sendEvent('showMessage', 111)

源码

/*** js 事件监听*** useage:* 1. 注册事件监听* eventListener.addEventListener('xxx-success',function(xxvalue){* refreshList();* });* 发送事件* 2.eventListener.sendEvent('xxx-success','xxvalue')*//*** 回调队列* 结构:{* eventKey:'xxx',* callback:[]* }*/let EventListener = function () {this.callback = [];this.sendEvent = function (eventKey, eventValue) {/*** 同一页面,localStorage.setItem 不触发 storage ,发送时 自动触发* uuid 保证变更,都能触发 storage事件*/let newEventKey = 'evt_' + eventKey;let uuid = _uuid(8, 16);let newEventValue = uuid + '_' + (eventValue == undefined ? '' : eventValue);//手动触发本页面事件this.triggerCallback(newEventKey, newEventValue);localStorage.setItem(newEventKey, newEventValue);}this.addEventListener = function (eventKey, callback) {let callbackObject = _findCallbackObject(this, eventKey);if (callbackObject == undefined) {callbackObject = {eventKey: eventKey, callback: [callback]};this.callback.push(callbackObject);} else {callbackObject.callback.push(callback);}}/*** 触发事件对应的回调* removeItem setItem 都会触发* removeItem eventValue==null 不触发*/this.triggerCallback = function (eventKey, eventValue) {if (_isEventKey(eventKey) && _isNotNull(eventValue)) {let originalEventKey = _resolveEventKey(eventKey);let callbackObject = _findCallbackObject(this, originalEventKey);if (callbackObject != undefined) {let callbackQueue = callbackObject.callback;if (callbackQueue.length > 0) {eventValue = _resolveEventValue(eventValue);for (let index in callbackQueue) {let callback = callbackQueue[index];try {callback(eventValue);} catch (e) {console.error("执行事件" + callbackObject.eventKey + "的函数失败", e)}}}//触发后删除localStorage.removeItem(eventKey);}}}/*** 查找到事件key对应的监听对象*/function _findCallbackObject(_this, eventKey) {if (_this.callback.length > 0) {for (let index in _this.callback) {let callbackObject = _this.callback[index];if (callbackObject.eventKey == eventKey) {return callbackObject;}}}}function _resolveEventKey(eventKey) {return eventKey.split('_')[1];}function _isEventKey(eventKey) {if (eventKey.indexOf('evt_') < 0) {return false;}return true;}function _resolveEventValue(eventValue) {let start = eventValue.indexOf('_') + 1;let end = eventValue.length;return eventValue.substring(start, end);}function _isNotNull(value) {if (value == undefined || value == null) {return false;}return true;}function _uuid(len, radix) {let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');let uuid = [], i;radix = radix || chars.length;if (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];} else {let r;uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4';for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random() * 16;uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}}return uuid.join('');};}let eventListener = new EventListener();//注册监听,不同页面也可触发监听事件window.addEventListener('storage', function (event) {eventListener.triggerCallback(event.key, event.newValue);})

仓库地址: [链接](https://github.com/dushitaoyuan/dev_js_docs/tree/main/event-listener)

js 监听 安卓事件_百行代码实现js事件监听实现跨页面数据传输相关推荐

  1. python做事件研究法_35行代码搞定事件研究法(上)

    作者简介: 祝小宇,个人公众号:大猫的R语言课堂 这期大猫课堂将会教大家如何用35行R代码写出最有效率的事件研究法. 注意,本代码主要使用data.table完成,关于data.table包的相应知识 ...

  2. vue 前台文本修改触发事件_利用VBA代码禁用触发事件及对工作薄修改的保存方案...

    分享成果,随喜真能量.大家好,今日内容仍是和大家分享VBA编程中常用的简单"积木"过程代码,这些内容多是取至我的"VBA代码解决方案"教程中内容.NO.143- ...

  3. python写百行代码可运行_56 岁潘石屹学俩月 Python ,写下百行代码

    原标题:56 岁潘石屹学俩月 Python ,写下百行代码 By 超神经 内容导读:跨界王潘石屹在近期迷上了编程,不仅高调宣布学习 Python,拜老师,还隔三差五晒出自己的「编程课作业」,和网友进行 ...

  4. 基于Ganos百行代码实现亿级矢量空间数据在线可视化

    简介: 本文介绍如何使用RDS PG或PolarDB(兼容PG版或Oracle版)的Ganos时空引擎提供的数据库快显技术,仅用百行代码实现亿级海量几何空间数据的在线快速显示和流畅地图交互,且无需关注 ...

  5. Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋

    Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...

  6. 猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...

  7. php消消乐代码,C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...

  8. 鱼佬:百行代码入手数据挖掘赛!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:鱼佬,武汉大学,Datawhale成员 本实践以科大讯飞xData ...

  9. 百行代码打造一个DI容器(支持瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入)...

    DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害.本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期.单利生命周 ...

最新文章

  1. ODBC、OLE连接各种数据库的连接字符串
  2. rand(),srand()产生随机数
  3. 编辑距离及最小编辑距离算法(转)----动态规划
  4. docker 启动容器_crontab入门二:定时启动docker容器并启动容器内部脚本
  5. mysql索引详细介绍简书_Mysql索引介绍
  6. jQuery 判断是否包含某个属性
  7. Lua C API的正确用法
  8. Security+ 学习笔记46 网络工具
  9. JAVA 生成API接口文档
  10. 学习JSON的神级网站www.bejson.com
  11. Thinkphp5个人技术博客网站源码
  12. GB2312编码理解
  13. 20世纪50年代到60年代 电子计算机,计算机基础知识习题标准答案
  14. sql 去重查询 distinct
  15. CR渲染器全景图如何渲染颜色通道_一键九图!这SU插件的“出图”速度比渲染器还快?...
  16. lua/cocos加载动画以及可以使用加载纹理的方式来替换图片并且加载个人制作的艺术字体(fnt字体)
  17. VuePress学习笔记
  18. 极光推送SDK引起的内存泄露排查
  19. 为什么神经元有数千个突触,一个新皮质中的序列记忆理论(HTM算法基础)
  20. oracle基础|oracle的认知|Select用法详解

热门文章

  1. 在CentOS 6.6上搭建OpenResty 1.9.7.4并输出示例
  2. [综合面试] 计算机面试书籍与求职网站推荐
  3. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全
  4. json_encode 中文不乱码
  5. redis实现对账(集合比较)功能
  6. keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
  7. AngularJs--过滤器(filter)
  8. 整理收集49条JQuery代码小结
  9. HTTP协议Etag详解
  10. 水晶报表调用存储过程的问题