在两个页面/选项卡之间进行通信

2024-05-02

我想要一个 JavaScript 文件来控制两个 HTML 文件同时地.

<!DOCTYPE html>
<html>
<head>
  <title>tryAgainPage1</title>
  <meta charset="UTF-8">
</head>
<body>

  <div id="page1"></div>

  <script src="tryAgain.js"></script>
</body>
</html>

那是第一页。接下来是第二页。

<!DOCTYPE html>
<html>
<head>
  <title>tryAgainPage2</title>
  <meta charset="UTF-8">
</head>
<body>

  <div id="page2"></div>

  <script src="tryAgain.js"></script>
</body>
</html>

这是 JavaScript:

newFunction();

function newFunction() {
    document.getElementById("page1").innerHTML = "page one says hello";
    document.getElementById("page2").innerHTML = "page two says goodbye";
}

第一页有效,第二页无效。我已经尝试了一天让页面相互交谈,但没有成功。我不确定我是否理解如何实施广播频道在这种情况下(如果确实合适的话。)任何人都可以帮忙吗?


postMessage

如果你正在寻找一种方法来制作两个pages or tabs沟通你可以看一下:
MDN Window.发布消息 https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage,并阅读此内容发布消息 article http://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage
or MDN 广播频道API https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API

使用广播频道 API page1 http://jsbin.com/fuqebuk/1/page2 http://jsbin.com/vitefud/2/

怎么运行的:

  • pageX订阅一个命名的广播频道对象
  • pageY使用广播到相同的频道名称postMessage
  • pageX"message"事件并打印Event.data

And 反之亦然.

第1页.html

<h1>PAGE 1</h1>
<p><button data-broadcast="Page 1 talking!">BROADCAST</button></p>
Page 2 says: <div id="page2"></div>
<script src="comm.js"></script>

page2.html

<h1>PAGE 2</h1>
<p><button data-broadcast="Page 2! 'Allo 'Allo!">BROADCAST</button></p>
Page 1 says: <div id="page1"></div>
<script src="comm.js"></script>

comm.js

var bc = new BroadcastChannel('comm');

document.querySelector("[data-broadcast]").addEventListener("click", ev => {
  bc.postMessage( ev.target.dataset.broadcast );
});

const targetEl = document.querySelectorAll("#page1, #page2");

bc.addEventListener("message", ev => {
    [...targetEl].forEach( el => el.innerHTML = ev.data );
});

localStoragestorage Event

Another simple, yet cool way, if both tabs are on the same domain is by using
Window.localStorageMDN https://developer.mozilla.org/en-US/docs/Web/API/Storage and its Storage Event.

怎么运行的:

  • pageX写信给localstorage[pageX]
  • pageY's window将触发一个storage event
  • pageY现在可以阅读localstorage[pageX]或更好(以使其更简单(并且pageN不可知论者))Event.newValue由存储事件发送

And 反之亦然.

对于初学者: DEMO: page1 http://jsbin.com/hapifef/2/page2 http://jsbin.com/yemurul/1/

第1页.html

<h1>PAGE 1</h1>
<textarea data-sender="page1" placeholder="Write to page 2"></textarea>
Page 2 says:  <div id="page2"></div>
<script src="comm.js"></script>

page2.html

<h1>PAGE 2</h1>
<textarea data-sender="page2" placeholder="Write to page 1"></textarea>
Page 1 says:  <div id="page1"></div>
<script src="comm.js"></script>

comm.js

// RECEIVER
window.addEventListener("storage", ev => {
    document.getElementById( ev.key ).innerHTML = ev.newValue;
});

// SENDER
[...document.querySelectorAll("[data-sender]")].forEach( el =>
    el.addEventListener("input", ev => localStorage[el.dataset.sender] = el.value )
);

Web RTC

你可以使用Web RTC https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API(网络实时通信)。一种使 Web 应用程序和站点能够捕获和可选地stream音频和/或视频媒体,以及在浏览器之间交换任意数据


你的主要错误:

您的脚本无法在一页上运行...实际上在both,唯一的区别是在第 1 页上意识到后就断了#page2无法找到元素 - 相反,在另一页上意识到没有元素后立即崩溃"#page1"元素(从第一个开始)。
您应该始终使用以下命令检查 al 元素是否存在if ( someElement ) { /*found!*/ } .

是的,你不能让交流就这样两页。他们只会共享/包含相同的 JS 文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在两个页面/选项卡之间进行通信 的相关文章

  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 不可勾选的单选按钮与专有的复选框

    从 UI 角度来看 是拥有一组具有取消选中功能的单选按钮更好 还是拥有一组独占的复选框 意味着一次只能选中一个 更好 Update 我没想到对此会有如此负面的反应 如果我给出一个更接近其使用方式的示例 也许会有所帮助 我有一个充满数据绑定内
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 如何创建适合屏幕宽度的等宽/高框? [复制]

    这个问题在这里已经有答案了 我正在尝试建立一个网站 其中有很多宽度和高度相等的框 例如 我有一个页面 其中并排有两个相同大小的框 简单的解决方案是将宽度和高度设置为 50vw 这在出现滚动条之前效果很好 我已经用谷歌搜索了几个小时 但无法理
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • HTML 锚点,禁用样式

    我有一些 html 锚链接代码 与文档的其余部分不同 我希望它看起来不是链接 有没有一种简单的方法可以禁用由于将文本包装在锚标记中而引起的样式更改 而不必强行使其相同 即 如果我更改正文字体样式 我不必也更改其他一些 link东西 将颜色设
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • 双向消息传递的节俭

    我很好奇 Thrift 是否适合我的用例 我正在制作另一个消息系统 其中有客户端和服务器 但客户端和服务器都向对方发起请求消息 并且并非所有消息都可能是请求 而只是通知 回到 10 年前 我使用手动二进制编解码器完成了这项工作 回到 5 年
  • 谷歌 Android 地图 v2 MetersToEquatorPixel

    我目前的任务是将 Google Android 地图 v1 应用程序转换为 Google Android 地图 V2 应用程序 这个过程并不愉快 感谢谷歌 我的问题是 在之前的应用程序中 他们使用了 Google Android Maps
  • 有没有办法覆盖 iOS 13 上下文菜单的(深色/浅色)用户界面风格?

    我的应用程序支持 iOS 13 深色模式 并为用户提供匹配系统外观或强制应用程序始终使用深色模式或浅色模式的选项 无论系统设置如何 该应用程序还允许在用户按下时显示上下文菜单UILabel 但是 当使用以下方式呈现上下文菜单时UIConte
  • DOJO xhrGet如何使用返回的json对象?

    如何在 get 本身之外访问从 xhrGet 返回的数据 Firebug 显示 json 对象有一个名为 results 的数组 该数组存储响应中的 json 对象 但当我尝试访问它时它为 null 那么 如何访问最后一个代码行接收到的数据
  • Java ArrayList 复制

    我有一个ArrayList l1大小为 10 我指定l1到新列表引用类型l2 Will l1 and l2指向相同ArrayList目的 或者是副本ArrayList对象分配给l2 当使用l2参考 如果我更新列表对象 它会反映l1参考类型也
  • 从 Jinja 渲染模板中删除不必要的空白

    我在用着curl观看我的网络应用程序的输出 当 Flask 和 Jinja 渲染模板时 输出中存在大量不必要的空白 它似乎是通过渲染 Flask WTF 和 Flask Bootstrap 的各种组件来添加的 我可以使用剥离这个sed 但是
  • protoc 在哪里以及如何安装它?

    我想使用protoc生成java文件的命令 我一直按照 github README 中的说明进行操作https github com protocolbuffers protobuf https github com protocolbuf
  • 如何检查目录或其任何子目录中是否存在特定文件

    在 C 中 如何检查目录或其任何子目录中是否存在特定文件 系统 IO 文件 存在似乎只接受单个参数 没有搜索子目录的重载 我可以用 LINQ 来做到这一点系统 IO 目录 GetFiles使用搜索选项 AllDirectories超载 但这
  • 按键时从文本区域获取最后一行

    我有一个文本区域字段 在每次按键时 我想将文本区域中的最后一行推送到数组中 目前 我正在每次按键时构建数组以获取文本区域中的最后一行 有没有办法优化这个 意思是 无需构造数组即可获取文本区域中的最后一行 jQuery mytextarea
  • 为 python 游戏添加再次玩选项

    我正在使用 python 为我的编程课制作一个游戏 我不知道当玩家输了或退出游戏时如何再次给他们选择 我正在使用Python 2 7 这是我的游戏的代码 import pygame sys time random from pygame l
  • Eclipse 中的一个文件中可以有多个类吗?

    Eclipse 中的一个 java 文件中是否可以包含多个类 或者我真的必须将每个文件放在不同的文件中吗 这只是 Eclipse 强加的东西 还是 Java 编译器有一些反对将所有内容放在同一个文件中的东西 根据 Java 规范 每个文件只
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • 使用可编码的值,有时是 Int,有时是 String

    我有一个 API 有时会返回特定的键值 在本例中id 在 JSON 中作为 Int 有时它会以 String 的形式返回相同的键值 如何使用 codable 来解析该 JSON struct GeneralProduct Codable v
  • 在 Quickbooks v3 api 中断开应用程序连接

    我正在研究 Quickbooks v3 api 集成 我已经完成了所有集成 但陷入了 Quickbooks 从应用程序断开连接的状态 我正在使用以下代码片段来断开与 Quickbooks 的连接 final IAPlatformClient
  • 如何确保用户只提交英文文本

    我正在构建一个涉及自然语言处理的项目 由于nlp模块目前只处理英文文本 所以我必须确保用户提交的内容 不长 只有几个单词 是英文的 是否有既定的方法来实现这一目标 首选 Python 或 Javascript 方式 如果内容足够长我会推荐一
  • 为什么我必须在 POD 类型中重载operator==?

    我有一个定义如下的结构 struct Vec3 float x y z 当我尝试使用时std unique on a std vector
  • 如何从日期中获取微秒?

    我正在尝试从 a 中获取微秒Date 但我不能 Date date new Date No Date仅存储毫秒精度的值 如果您想要微秒精度 您可能需要看看JSR 310 http sourceforge net apps mediawiki
  • 如何更改 JAR 文件中的常规 JAVA COFFEE CUP 图标

    我可以更改框架中的 JAVA COFFEE CUP 图标 上 左 但如何更改 RUNNABLE JAR 文件的常规 JAVA COFFEE CUP 图片 是否有可能仅更改一个 JAR 文件的文件图标 谢谢 JAR 文件没有图标 操作系统为其
  • 如何在 Entity Framework Core 中调用标量函数

    下列的本文 http anthonygiretti com 2018 01 11 entity framework core 2 scalar function mapping 我试图使用 Entity Framework Core 将内部
  • 在两个页面/选项卡之间进行通信

    我想要一个 JavaScript 文件来控制两个 HTML 文件同时地 div div 那是第一页 接下来是第二页 div div