对于iframe子页面与父页面通信,需要注意同域或不同域等情况。
对于iframe子页面与父页面通信,需要注意同域或不同域等情况。
同域下的js通信
当子页面和父页面在同一个域名下时,js通信可以通过window.parent对象来进行。以下是一个简单的示例。
父页面代码:
<!DOCTYPE html>
<html>
<head>
<title>父页面</title>
</head>
<body>
<h1>我是父页面</h1>
<div id="content"></div>
<script>
window.onload = function() {
var iframe = document.createElement('iframe');
iframe.src = 'iframe.html';
document.body.appendChild(iframe);
window.addEventListener('message', function(e) {
console.log('父页面接收到:' + e.data);
document.getElementById('content').innerHTML = e.data;
});
}
</script>
</body>
</html>
子页面代码:
<!DOCTYPE html>
<html>
<head>
<title>子页面</title>
</head>
<body>
<h1>我是子页面</h1>
<button onclick="sendMsg()">发送消息到父页面</button>
<script>
function sendMsg() {
window.parent.postMessage('这是子页面发来的消息', '*');
}
</script>
</body>
</html>
子页面中通过window.parent.postMessage方法发送消息到父页面。父页面中通过window.addEventListener方法监听message事件,并在事件处理程序中接收子页面的消息进行处理,此处将子页面传来的消息插入到页面中的content的div元素中。
不同域下的js通信
当子页面和父页面的域名不同时,js通信需要通过跨域postMessage方式来实现。以下是一个简单的示例。
父页面代码:
<!DOCTYPE html>
<html>
<head>
<title>父页面</title>
</head>
<body>
<h1>我是父页面</h1>
<div id="content"></div>
<script>
window.onload = function() {
var iframe = document.createElement('iframe');
iframe.src = 'http://127.0.0.1:8888/iframe.html';
document.body.appendChild(iframe);
window.addEventListener('message', function(e) {
console.log('父页面接收到:' + e.data);
document.getElementById('content').innerHTML = e.data;
});
}
</script>
</body>
</html>
子页面代码:
<!DOCTYPE html>
<html>
<head>
<title>子页面</title>
</head>
<body>
<h1>我是子页面</h1>
<button onclick="sendMsg()">发送消息到父页面</button>
<script>
function sendMsg() {
window.parent.postMessage('这是子页面发来的消息', 'http://127.0.0.1:8888');
}
</script>
</body>
</html>
子页面中同样是通过window.parent.postMessage方法发送消息到父页面,只不过这里需要指定父页面的域名。父页面中同样在iframe中嵌入子页面,然后通过window.addEventListener方法监听message事件,在事件处理程序中接收子页面的消息进行处理。
需要注意的是,父页面中的iframe src属性需要指定完整的子页面地址,例如:http://127.0.0.1:8888/iframe.html;而子页面中的发送消息时指定的域名也需要指定完整,例如:http://127.0.0.1:8888。
以上是iframe子页面与父页面在同域或不同域下的js通信的完整攻略。
本文标题为:iframe子页面与父页面在同域或不同域下的js通信
基础教程推荐
- 面试必备之ajax原始请求 2023-02-24
- JavaScript cookie与session的使用及区别深入探究 2024-02-05
- 基于HTTP浏览器缓存机制全面解析 2022-11-20
- html5中的图片预览 2023-10-29
- JavaScript动画函数封装详解 2023-08-12
- HTML5自定义视频播放器源码 2024-01-03
- vue-promise的all方法使用 2023-10-08
- IE6、IE7、IE8浏览器下的CSS、JS兼容性对比 2024-01-21
- Layui在table中使用select下拉框 2022-10-20
- HTML中文件上传时使用的元素的样式自定义 2024-01-20