HTML5之postMessage和addEventListener实现<iframe>跨域通信

本文介绍如何使用postMessage实现跨域通信,并提供了一个具体的示例,包括outer.html和inner.html两个页面的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用postMessage实现跨域的前提条件是一个页面通过<iframe>调用另一个页面,示例如下所示:

在这个示例中,通过outter.html调用inner.html

这是outter.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
	<meta charset="UTF-8">
	<title>outter</title>
</head>
<body>
	获取的信息为:
	<div id="getMessage"></div>
	<iframe src="http://test.inner.com:8080/test/inner.html" frameborder="1"></iframe>
	<hr>
	要传入内部的信息:<input type="text" id="out"><input type="button" value="点击" id="but">
	<script>
	var message=document.getElementById("getMessage");
	var text=document.getElementById("out");
	window.addEventListener("message",function(e){
		if(e.data!=null){
			message.innerText=e.data;
		}
	});

	document.getElementById("but").onclick=function(){
		window.frames[0].postMessage(text.value,"http://test.inner.com:8080");
		text.value="";
	}
	</script>
</body>
</html>

这里显示inner.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
	<meta charset="UTF-8">
	<title>inner</title>
</head>
<body>
	外面传进来的信息为:
	<div id="getMessage"></div>
	<hr>
	要传到外面的信息为:<input type="text" id="text"><input type="button" value="传递" id="but">
	<script>
	var message=document.getElementById("getMessage");
	var text=document.getElementById("text");
	document.getElementById("but").onclick=function(){
		window.parent.postMessage(text.value,"http://test.outter.com:8080");
		text.value="";
	}
	window.addEventListener("message",function(e){
		if(e.data!=null){
			message.innerText=e.data;
		}
	});
	</script>
</body>
</html>

上面的示例如果你想试用的话,

一、需要在tomcat的webapps下,新建一个test文件夹,在test文件夹下放入inner.html和outter.html。

二、在电脑的hosts文件中配置两个域名127.0.0.1    test.inner.com和127.0.0.1    test.outter.com

三、浏览器访问的URL为   http://test.outter.com:8080/test/outter.html


相关的知识点如下:

一、<iframe>后必须为</iframe>,而不能使用<iframe/>

二、获取子窗口对象:document.getElementById("").contentWindow==$("")[0].contentWindow==window.frames[0]

       获取父窗口对象:window.parent

三、postMessage的两个参数,第一个参数为想跨域传递的值,第二个参数是作用域,包括协议、域名和端口。这里或者为对应的域名,或者为*,意为对所有域都有效。

四、postMessage的前面定义了由本窗口window向哪个窗口传值。这里是在父window向第一个子window传值。

五、方法addEventListener(type,function,useCapture)前面可为元素、document、window或XMLHttpRequest

type字符串,事件名称,不含"on",比如click,mouseover,keydown等。

message                    //事件,每接收到一次更新,就会发生onmessage事件。

当为postMessage时,可以用onmessage接受,但是当为sendMessage时,无法用onMessage接收。

useCapture为是否使用事件捕获,一般为false      //事件捕获,从上往下,和事件冒泡相反

六、sendMessage和postMessage的区别

postMessage:只负责将消息放入消息队列,不确定何时及是否处理,异步,返回postMessage是否正确执行。

sendMessage:把消息放入消息队列,要等到消息处理完,返回消息处理的返回码(DWord类型)后才继续,同步,返回处理结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值