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

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(使用前将#替换为@)

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