场景需要:
- http://a.com -父页面,记做A
- http://b.com -子页面,记做B
- B生成的DOM,获取其属性,传值到A
- A监听事件,获取监听的属性,传到B
正文
利用window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。
父页面 A
子页面 B
效果
本人不太会录屏,就上截图了
开始因为没获取的值,所以是undefined
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最近做一个POS机终端遇到一个问题,子父窗口传值问题,因为POS机是两个屏幕,如果将一个页面拉长投射虽然可以做到两个屏幕显示,但是因为是触摸屏,当第一个屏幕在操作的时候会影响到第二屏幕,反之也是如此,既然需求明确了,问题也知道了,则我们需要两个窗口进行不同的操作
首先是父页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Html5 postMessage</title>
<style>
#otherWin {
width: 600px;
height: 400px;
background-color: #cccccc;
}
#txt {
width: 500px;
height: 300px;
background-color: #cccccc;
}
</style>
</head>
<body>
<button id="btn">open</button>
<button id="send">send</button>
<input type="text" id="message" />
<br/><br/>
<div id="txt"></div>
<script>
window.onload = function() {
var btn = document.getElementById('btn');
var btn_send = document.getElementById('send');
var text = document.getElementById('txt');
var win;
btn.onclick = function() {
//通过window.open打开接收消息目标窗口
win = window.open('http://127.0.0.1:8080/mngapp/chatroom/win.html', 'popUp');
}
btn_send.onclick = function() {
// 通过 postMessage 向子窗口发送数据
win.postMessage( document.getElementById("message").value, 'http://127.0.0.1:8080/');
}
if (window.addEventListener) {
//为window注册message事件并绑定监听函数
window.addEventListener('message', receiveMsg, false);
}else {
window.attachEvent('message', receiveMsg);
}
//监听函数,接收一个参数--Event事件对象
function receiveMsg(e) {
console.log("Got a message!");
console.log("Message: " + e.data);
console.log("Origin: " + e.origin);
text.innerHTML = "Got a message!<br>" +
"Message: " + e.data +
"<br>Origin: " + e.origin;
}
};
</script>
</body>
</html>
然后再是子页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Html5 postMessage</title>
<style>
#txt {
width: 500px;
height: 300px;
background-color: #cccccc;
}
</style>
</head>
<body>
<h1>The New Window</h1>
<div id="txt"></div>
<input type="text" id="message" />
<button id="send">send</button>
<script>
window.onload = function() {
var text = document.getElementById('txt');
var btn_send = document.getElementById('send');
var prent = null;
btn_send.onclick = function() {
// 通过 postMessage 向父窗口发送数据
freceiveMsg(prent);
}
//监听函数,接收一个参数--Event事件对象
function receiveMsg(e) {
console.log("Got a message!");
console.log("Message: " + e.data);
console.log("Origin: " + e.origin);
text.innerHTML = "Got a message!<br>" +
"Message: " + e.data +
"<br>Origin: " + e.origin;
//获取父对象
prent = e;
}
function freceiveMsg(e) {
console.log("freceiveMsg:"+e);
e.source.postMessage(document.getElementById("message").value,
e.origin);
}
if (window.addEventListener) {
//为window注册message事件并绑定监听函数
window.addEventListener('message', receiveMsg, false);
}else {
window.attachEvent('message', receiveMsg);
}
};
</script>
</body>
</html>
————————————————
版权声明:本文为CSDN博主「辛末子午」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hjjoe1213123/article/details/51698404
相关推荐
为了解决这个问题,我们可以利用`iframe`嵌套页面的技术来实现跨域通信。 首先,我们来看一下`window.showModalDialog`的基本用法。在站点1(系统1的访问页面)中,我们可以通过以下代码弹出一个模态对话框: ```...
如果`iframe`需要从Vue父页面获取数据,可以通过传递URL参数或者使用`postMessage` API来实现跨窗口通信。以下是一个简单的请求示例: ```javascript function PcCommon() { this.baseUrl = 'https://xxxxxxx'; //...
首先,要在不同浏览器中实现iframe的相互传值传参,我们可以通过全局对象window来引用父窗口和子窗口。在iframe中,可以通过window.parent获取到父窗口的对象,而在父窗口中,则可以通过window.frames数组来访问特定...
在JavaScript编程中,"子页面调用父页面"是一种常见的交互方式,特别是在构建多级页面结构或者使用iframe嵌套页面的场景下。这种技术允许子页面与包含它的父页面进行通信,实现数据传递、功能控制等多种功能。下面将...
1. **页面嵌套通信**:一个页面内的`iframe`与父页面之间的通信,或者多个`iframe`之间的通信。 2. **窗口通信**:比如打开的新窗口或标签页与原窗口之间的通信。 3. **Web应用与浏览器扩展通信**:Chrome插件可以与...
父页面可以通过`iframe.contentWindow.postMessage`向子页面发送消息,子页面也可以通过`window.parent.postMessage`向父页面发送消息。 ```javascript // 父页面向子页面发送消息 iframe.contentWindow.post...
### iframe跨域嵌套自适应高度 在网页开发过程中,`...正确地配置CORS、合理地利用postMessage API以及理解P3P头的作用,可以帮助开发者有效解决`iframe`跨域嵌套中遇到的问题,实现更加灵活和安全的Web应用开发。
此外,如果父窗口和子窗口是嵌套关系(例如,子窗口在iframe中),可能还需要处理`window.parent`和`window.top`的关系,以确保消息能正确地传递到顶层窗口。 在你提供的压缩包文件`testOpen`中,可能包含了实现...
6. **`Window.postMessage` 和 `hashchange`事件**:利用`iframe`的`src`属性设置为带有#的URL,然后监听`hashchange`事件,通过改变URL的哈希值传递数据。 在提供的文件中,我们看到`index.html`可能是包含`iframe...
- `window.postMessage()` 方法:这是一个安全的跨域通信方式,允许两个窗口(包括iframe)之间传递消息。通过指定目标窗口的`window`对象和传递的数据,可以实现通信。 2. **子页面与父页面的通信:** - `parent...
JavaScript中的iframe和parent之间的交互是Web开发中一个重要的知识点,特别是在构建复杂的网页应用或实现跨域通信时。本文将深入探讨这个主题,并结合标签“源码”和“工具”,给出实际应用示例。 首先,iframe...
当SiteB需要向SiteA传递数据时,可以在其页面中使用`window.parent`或`window.top`对象来引用父窗口或顶级窗口,并调用`postMessage`方法发送数据。SiteA则在IFRAME加载完成后注册事件监听器,接收到消息后进行处理...
当`iframe`中的内容加载完成后,它可以通过`postMessage`发送一个消息到父页面,告知其自身的真实高度。父页面监听到这个消息后,可以动态调整`iframe`的高度。 例如,假设我们有如下的层级关系:主页面(main.html...
- 对于跨域场景,可以使用`window.postMessage()` API,这是一个安全的方法,允许不同源的窗口之间进行通信。子页面可以发送消息,而父页面通过监听`message`事件接收并处理这些消息。 7. **异步考虑**: - 当...
它基于浏览器的`window.postMessage` API,这是一个安全的方法,允许来自不同源的脚本通过`postMessage`方法发送消息,并通过事件监听接收这些消息。`messenger.js`简化了这个过程,提供了一种更加友好的API,使得...
但如果是同源的,我们可以利用window.postMessage方法来传递信息。这个方法允许在不同的窗口(包括iframe)之间安全地发送消息。接收端需要监听`message`事件来接收发送过来的数据。 对于本例中描述的场景,我们...
2. `window.parent`和`window.top`: 如果一个窗口嵌套在其他窗口或框架中,可以使用`window.parent`访问父窗口,`window.top`访问顶级窗口。同样,这些方法也需要遵守同源策略。 三、Web存储 1. `localStorage`和`...
- `postMessage`是一种跨源消息传递API,可以实现在不同来源的`window`对象之间发送消息。这种方法可以避免跨域限制问题。 - 使用步骤包括: 1. **发送方**调用`window.postMessage`方法发送消息。 2. **接收方*...
这可以通过跨窗口通信(例如`window.postMessage`)实现。 3. **设置iframe样式**:直接在iframe标签中添加`style`属性,如`<iframe src="..." style="font-size: inherit;">`,让iframe继承父页面的字体大小。 4....
它的主要功能是实现页面内的页面嵌套,即在一个页面中展示另一个独立的页面内容,从而达到复用、组合或隔离不同来源内容的目的。`Iframe`在多个场景下都有其独特的应用价值,但也存在一些缺点和潜在问题。 **Iframe...