上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

BroadcastChannel同源多个标签之间通信

[复制链接]
  • TA的每日心情
    开心
    2025-2-11 13:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    7

    回帖

    12

    积分

    助理工程师

    积分
    12
    发表于 2025-2-10 17:55:07 | 显示全部楼层 | 阅读模式

    本帖最后由 zgryyh 于 2025-2-10 18:13 编辑

    初次发贴,如有不妥,还望海涵😃

    例子代码如下:

    // ==UserScript==
    // @name         New Userscript
    // @namespace    http://tampermonkey.net/
    // @version      2025-02-10
    // @description  try to take over the world!
    // @author       wxb
    // @match        https://cn.bing.com/*
    // @match       *
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=csdn.net
    // @connect      *
    // @require      https://scriptcat.org/lib/513/2.0.0/ElementGetter.js
    // @grant        GM_addStyle
    // @grant        GM_xmlhttpRequest
    // @grant        GM_openInTab
    // @grant        GM_setValue
    // @grant        GM_getValue
    // @grant        GM_addValueChangeListener
    // @run-at       document-end
    // @grant        unsafeWindow
    // @grant        window.close
    // ==/UserScript==
    
    (function() {
        /**
     * 简单封装BroadcastChannel的用法
     */
        const Channel = {
            /**
         * BroadcastChannel对象
         */
            channel: null,
    
            /**
         * 实例化BroadcastChannel对象,赋值给channel变量
         * @param {*} channelName 通道名称,用以区分不同的通道
         * @returns
         */
            getChannel: (channelName) => {
                Channel.channel = new BroadcastChannel(channelName)
                return Channel.channel
            },
    
            /**
         * 发送消息
         * @param {*} object 消息体
         */
            send: (object) => {
                Channel.channel.postMessage(object)
            },
    
            /**
         * 发送消息,重载方法,可直接调用,省略对象实例化操作
         * @param {*} channelName 通道名称,用以区分不同的通道
         * @param {*} object 消息体
         */
            send: (channelName, object) => {
                if (Channel.channel == null) {
                    Channel.channel = Channel.getChannel(channelName)
                }
                Channel.channel.postMessage(object)
            },
    
            /**
         * 监听消息
         * @param {*} callback 回调函数
         */
            listen: (callback) => {
                Channel.channel.onmessage = ({ data }) => {
                    callback(data)
                }
            },
    
            /**
         * 监听消息,重载方法,可直接调用,省略对象实例化操作
         * @param {*} channelName 通道名称,用以区分不同的通道
         * @param {*} callback 回调函数
         */
            listen: (channelName, callback) => {
                if (Channel.channel == null) {
                    Channel.channel = Channel.getChannel(channelName)
                }
                Channel.channel.onmessage = ({ data }) => {
                    callback(data)
                }
            },
    
            /**
         * 通道关闭
         */
            close: () => {
                Channel.channel.close()
            },
    
            /**
         * 通道关闭,重载方法,可直接调用,省略对象实例化操作
         * @param {*} channelName 通道名称,用以区分不同的通道
         */
            close: (channelName) => {
                if (Channel.channel == null) {
                    Channel.channel = Channel.getChannel(channelName)
                }
                Channel.channel.close()
            },
    
            /**
         * 通道枚举,定义业务中需要用到的所有通道名称枚举,可根据业务需求无限扩容
         */
            channelEnum: {
                TEST: { name: 'test', coment: '测试通道' },
                REAL_EVENT: { name: 'real_event', coment: '实时事项通道' },
            }
        }
    
        if(location.href=="https://cn.bing.com/"){
            Channel.listen(Channel.channelEnum.TEST.name, (data) => {
                alert(data);
            })
    
        }else{
            Channel.send(Channel.channelEnum.TEST.name, location.href)
        }
    
    })();

    这儿还有个DEMO:
    可以戳这里查看在线 Demo >>

  • TA的每日心情
    无聊
    2025-1-31 20:04
  • 签到天数: 195 天

    [LV.7]常住居民III

    745

    主题

    6465

    回帖

    7159

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    7159

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2025-2-10 17:57:03 | 显示全部楼层
    哥哥可以把脚本发到https://scriptcat.org/zh-CN/
    另外头像很智慧啊
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.com/a/lihengdao666
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-2-11 13:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    7

    回帖

    12

    积分

    助理工程师

    积分
    12
    发表于 2025-2-10 17:57:56 | 显示全部楼层
    以上例子在必应的主页(https://cn.bing.com/)进行了监听,在搜索内容页进行了发消息。主页能接受到其它页面发送的消息。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-2-11 13:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    7

    回帖

    12

    积分

    助理工程师

    积分
    12
    发表于 2025-2-10 18:12:07 | 显示全部楼层
    李恒道 发表于 2025-2-10 17:57
    哥哥可以把脚本发到https://scriptcat.org/zh-CN/
    另外头像很智慧啊

    管理员谬赞,感谢指点。这只是个例子,用来学习还凑合,传到脚本列表上好像也不太合适
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2025-1-31 20:04
  • 签到天数: 195 天

    [LV.7]常住居民III

    745

    主题

    6465

    回帖

    7159

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    7159

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2025-2-10 20:25:05 | 显示全部楼层
    zgryyh 发表于 2025-2-10 18:12
    管理员谬赞,感谢指点。这只是个例子,用来学习还凑合,传到脚本列表上好像也不太合适 ...

    没关系的
    hhhh
    我经常把自己乱七八糟的丢到脚本站
    只要有用的东西就值得发
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.com/a/lihengdao666
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-2-11 13:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    7

    回帖

    12

    积分

    助理工程师

    积分
    12
    发表于 2025-2-11 00:41:52 | 显示全部楼层
    李恒道 发表于 2025-2-10 20:25
    没关系的
    hhhh
    我经常把自己乱七八糟的丢到脚本站

    您在您家的地盘上,当然可以随便放,莫非我也可以?
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表