码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何实现浏览器标签页之间的通信


    浏览器标签页之间通信的实现

    使用场景

    ​ 前端开发过程中,总是避免不了要进行前端标签页之间的通信,最经典的例子莫过于音乐播放网站中,当第一次点击播放列表中的歌曲时,它会打开一个新的标签页进行播放,而当在列表中再次点击歌曲播放时,并不会再多打开一个标签页,而是会在刚才新打开的标签页上播放歌曲。

    方式方法

    这里跳转新页面均使用window.open[1]方法,这里稍微说下window.open方法的参数

    • url(可选)
      一个字符串,表示要加载的资源的 URL 或路径。如果指定空字符串("")或省略此参数,则会在目标浏览上下文中打开一个空白页。

    • target(可选)
      一个不含空格的字符串,用于指定加载资源的浏览上下文的名称。如果该名称无法识别现有的上下文,则会创建一个新的上下文,并赋予指定的名称。还可以使用特殊的 target 关键字:_self、_blank、_parent 和 _top。

      该名称可用作或

      元素的target属性。

    • windowFeatures(可选)
      一个字符串,包含以逗号分隔的窗口特性列表,形式为 name=value,布尔特性则仅为 name。这些特性包括窗口的默认大小和位置、是否打开最小弹出窗口等选项。

      在下面的例子中采用audio,作为浏览上下文的名称,让他从始至终只创建一个新的标签页

    1.使用路由上的query传参

    list.html

    const broadCastChannel = new BroadcastChannel('audio')
    function showAudio(){
    //方式一:通过query,缺点会刷新已打开的页面,但并没有同源策略影响
    window.open('/audio.html?name=张三&id=555','audio')
    }

    audio.html

    const app = document.getElementById('app')
    const query = new URLSearchParams(window.location.href.split('?')[1])
    app.innerText = query.get('name')

    优点:每次打开,audio页面都会变为当前活动标签页

    缺点:

    • 每次打开,audio页面都会被刷新,重新加载
    • 如果新打开的浏览上下文不共享相同的源[2],则打开脚本将无法与浏览上下文的内容进行交互(读取或写入)。

    2.使用localStroage监听

    利用同源页面[2:1]共享localStroage的特性,利用windw.addEventLister监听stroage[3]的变化,来实现两个标签页的通信,详细查看下面例子:

    list.html

    function showAudio(){
    if(!localStorage.getItem('hasAudio')){
    window.open('/audio.html','audio')
    localStorage.setItem('hasAudio',1)
    }
    setTimeout(()=>{
    localStorage.setItem('name','李四')
    },3000)
    }

    audio.html

    window.onunload = () =>{
    localStorage.removeItem('hasAudio')
    localStorage.removeItem('name')
    }
    const app = document.getElementById('app')
    window.addEventListener('stroage',e=>{
    const app = document.getElementById('app')
    app.innerText = e.newValue
    })

    优点:

    • 第一次打开,之后再传参无需刷新界面重新加载资源

    缺点:

    • 打开页面的需为同源页面,localStroage在同源页面中共享
    • 同源页面需通过localStroage检控通信,控制麻烦,复杂场景使用不方便

    3.使用BroadcastChannel

    BroadcastChannel 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源[2:2]的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

    list.html

    const broadCastChannel = new BroadcastChannel('audio')
    function showAudio(){
    if(!localStorage.getItem('hasAudio')){
    window.open('/audio.html','audio')
    localStorage.setItem('hasAudio',1)
    }
    setTimeout(()=>{
    broadCastChannel.postMessage({name:'李四'})
    },3000)
    }

    audio.html

    window.onunload = () =>{
    localStorage.removeItem('hasAudio')
    }
    const app = document.getElementById('app')
    const broadCastChannel = new BroadcastChannel('audio')
    broadCastChannel.addEventListener('message',e=>{
    const {name} = e.data
    const app = document.getElementById('app')
    app.innerText = name
    })

    优点:

    • 第一次打开,之后再传参无需刷新界面重新加载资源
    • 需要共用频道的页面,通信简单

    缺点:

    • 打开页面的需为同源页面[2:3],BroadcastChannel只会向命名频道相同的同源页面发送和接收消息

    1. window.open文档 ↩︎

    2. 同源页面:即http协议相同且端口号和ip地址相同的网页 ↩︎ ↩︎ ↩︎ ↩︎

    3. stroage事件文档 ↩︎

  • 相关阅读:
    Thread 类的基本用法
    Java 操作FTP服务器进行下载文件
    【无标题】
    配置Kubelet的垃圾回收(K8S镜像回收)
    C#,入门教程——程序运行时的调试技巧与逻辑错误探针技术与源代码
    C/C++程序的内存开辟
    面试再也不怕问ThreadLocal了
    语义检索系统【全】:基于milvus语义检索系统指令全流程-快速部署版
    JS知识点,持续更新
    [4G/5G/6G专题基础-159]: CQI值的滤波方法
  • 原文地址:https://www.cnblogs.com/observer-csh/p/17719111.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号