关于html5的PostMessage的用法总结

关于html5的PostMessage的用法总结  大家都知道,网页直接传递数据可以使用ajax请求来完成,今天我总结下我学习的postMessage是如何完成跨页面请求数据的呢?首先,postMessage是html5新增的一个解决跨域的一个方法。那他是如何使用的呢?这里我把一个案例分享出来把。看下面的代码:test.html<!DOCTYPEhtml><html><head> <titl…

大家好,又见面了,我是你们的朋友全栈君。

    大家都知道,网页之间传递数据可以使用ajax请求来完成,今天我总结下我学习的postMessage是如何完成跨页面请求数据的呢?首先,postMessage是html5新增的一个解决跨域的一个方法。那他是如何使用的呢?这里我把一个案例分享出来把。看下面的代码:

test.html

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8"/>
</head>
<body>
	
</body>
<script>
onmessage=function(e){
  e=e||event;
  document.write("my name is ",e.data);
   document.body.style.background = 'red';
};
</script>
</html>

1.html

<!DOCTYPE html>
<html>
<head>
	<title>window.postMessage</title>
	<meta charset="utf-8"/>
	<h1>test接收区</h1>
</head>
<body>

</body>
<iframe id="f" src="http://localhost:8080/chajian/test.html"></iframe>
<script>
var f=document.getElementById("f");
//给框架网页发送消息,然后收到之后,会传送过来。
f.οnlοad=function(){
 	setTimeout(function(){
 	 f.contentWindow.postMessage("谢霆锋","http://localhost:8080");
 	},3000)
}
</script>
</html>

    首先,它的原理是这样的。我就拿我的案例代码来说吧。

    1.html里面镶嵌了一个iframe网页 框架,他就是靠这里传输数据的,等1.html加载完成之后,他会主动发给test.html 谢霆锋,然后test.html收到之后,它里面有接收消息的处理函数,他收到消息之后,立马 ,给网页返回 一段字符串,然后把自己的背景改成红色。这样就达到了网页互动的效果,可惜的是,万恶的ie6.7不支持,兼容度不高。

注意:postMessage的写法,postMessage之前写的是你要通信的window对象(也就是你要向谁通信),此时的window.parent的权限仅限于此,不能在像同域似的,进行获取父级的DOM元素,否则浏览器会报错,提示你不能进行跨域访问,我们再来看postMessage中所接收的参数,第一个参数就是你要像另外一个窗口传递的数据(只能传字符串类型),第二个参数表示目标窗口的源,协议+主机+端口号,是为了安全考虑,如果设置为“*”,则表示可以传递给任意窗口。


上面是单页面交互的,下面给个双页面交互的。其实都是一样的,不过就是 两个页面都写了监听 发送事件。

test.html

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8"/>
</head>
<body>
	<h1 class="header">page B</h1>

<input type="text" id="inp" value="我想你">
<button οnclick="send()">send</button>
	
</body>


<script>
window.addEventListener('message', function(ev) {
    // if (ev.source !== window.parent) {return;}
    var data = ev.data;
  document.write("my name is ",data);
   document.body.style.background = 'red';
}, false);

function send() {
    var data = document.querySelector('#inp').value;
    parent.postMessage(data, 'http://localhost:8080/'); // 若父页面的域名和指定的不一致,则postMessage失败
    // parent.postMessage(data, '*'); // 触发父页面的message事件
}
</script>
</html>

1.html

<!DOCTYPE html>
<html>
<head>
	<title>window.postMessage</title>
	<meta charset="utf-8"/>
	<h1>test接收区</h1>
</head>
<body>


<h1 class="header">page A</h1>
<div class="mb20">
    <textarea name="ta" id="data" cols="30" rows="5">hello world</textarea>
    <button style="font-size:20px;" οnclick="send()">post message</button>
</div>
<!-- 跨域的情况 -->
<iframe src="http://localhost:8080/chajian/test.html" id="child" style="display: block; border: 1px dashed #ccc; height: 300px;"></iframe>

<script>
function send() {
    var data = document.querySelector('#data').value;

    window.frames[0].postMessage(data, 'http://localhost:8080/'); // 触发跨域子页面的messag事件
}

window.addEventListener('message', function(messageEvent) {
    var data = messageEvent.data; 
    console.info('message from child:', data);
    document.write("收到了数据: ",data);
    document.body.style.background = 'red';
}, false);
</script>
</body>
</html>

同样的,1.html是主页面。打开html,就可以实现交互了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158640.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何用命令行编译、运行第一个java程序(Hello World!)[通俗易懂]

    如何用命令行编译、运行第一个java程序(Hello World!)[通俗易懂]一、什么是命令行(Windows下)?     命令行(CommandProcessor)(CMD)是在OS/2,WindowsCE与WindowsNT平台为基础的操作系统(包括Windows2000,WindowsXP,WindowsVista,WindowsServer2003,Windows7,Windows8,Windows8.1,Window

    2022年7月8日
    19
  • 对“全栈工程师”一词的理解

    对“全栈工程师”一词的理解纵使目标再大 人的精力有限 于我来说 早些时候远大目标隐约是 成功的软件工程师 这个样子 但是目标是需要逐渐细化的 这些年我渐渐对自己的定位和未来有了一个清晰一点的认识 确实我有很强的观点 觉得软件工程师需要有足够的全面性 在 我眼中的工程师文化 中我也说 工程师文化 不是只有权力的一面 它对工程师的要求 是每个人都要足够能干 都要做许多的事 但是 全面性不代表没有专精 没有方向 深度和广度统一的问题已经有许许多多过往的人和我说过了 不存在一个在某一领域精深的牛人但是知识却很窄 也不存在一个

    2025年11月21日
    3
  • Nas性能测试工具-vdbench

    Nas性能测试工具-vdbench版本:vdbench50406简介:vdbench是一个I/O工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。配置参数:大文件设置深度为2,广度为10,每个文件夹下的文件数量为400,每个文件的大小为10M,采用10个线程并发,顺序选择文件,随机读写,DirectIO的形式处理1M的数据 …

    2022年5月12日
    292
  • js动画事件_JavaScript事件

    js动画事件_JavaScript事件js之动画事件首先,动画事件主要包括以下三个animationstart,animationiteration和animationend事件,下面做简单分别介绍。animationstart该事件在css动画开始播放时触发animationiteration该事件在css动画重新播放时触发animationend该事件在css动画结束播放时触发我们知道animation主要有6个属性,分别来设置动画呈现出来哦的效果,这个在我的另一篇文章中有介绍,我这边简单展示一下。

    2022年10月10日
    2
  • 网站部署ssl证书_阿里云ssl证书部署教程

    网站部署ssl证书_阿里云ssl证书部署教程阿里云续费SSL证书下载证书文件在正式服务器上部署IIS部署阿里云部署步骤:步骤一:下载文件1、登录SSL证书控制台。2、在左侧导航栏,单击SSL证书。3、定位到已签发的SSL证书,单击操作列下的下载。4、在证书下载面板,单击IIS服务器类型后的下载5、解压缩已下载的SSL证书(IIS)压缩包。此时,证书已保存在本地计算机中,导入到服务器端即可步骤二:导入到服务器中1、在服务器按Win+R键,打开运行。2、输入mmc,单击确定3、为本地计算机添加证书管理单元。3.1、在

    2022年8月30日
    2
  • Html动态点击按钮实现“+”和“-”功能

    Html动态点击按钮实现“+”和“-”功能  Html动态点击按钮实现“+”和“-”功能&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html;"&gt; &lt;title&gt;html动态实现加减&lt;

    2022年6月13日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号