用HTML5里的window.postMessage在两个网页间传递数据

摘要:
它显示了窗口。postMessage()方法可以安全地实现Window对象之间的跨域通信。窗PostMessage()提供了一种受控制的机制来安全地规避此限制。通常,一个窗口可以获得对另一个窗口的引用,然后使用targetWindow。postMessage()在其上调度MessageEvent。传递到窗口postMessage()的参数通过事件对象暴露给接收窗口。获取此引用的方法包括:Window.openWindow.openerHTMLIFrameElement.contentWindowWindow.parentWindow。帧+索引值messagemessage是要发送到目标窗口的消息。

说明

window.postMessage()方法可以安全地实现Window对象之间的跨域通信。例如,在一个页面和它生成的弹出窗口之间,或者是页面和嵌入其中的iframe之间。

通常情况下,不同页面上的脚本允许彼此访问,当且仅当它们源自的页面共享相同的协议,端口号和主机(也称为“同源策略”)。window.postMessage()提供了一个受控的机制来安全地规避这个限制(如果使用得当的话)。

一般来说,一个窗口可以获得对另一个窗口的引用(例如,通过targetWindow=window.opener),然后使用targetWindow.postMessage()在其上派发MessageEvent。接收窗口随后可根据需要自行处理此事件。传递给window.postMessage()的参数通过事件对象暴露给接收窗口。

发送端

postMessage程序

var receiver = document.getElementById('receiver').contentWindow;
var btn = document.getElementById('send');
btn.addEventListener('click', function (e) {
    e.preventDefault();
    var val = document.getElementById('text').value;
    receiver.postMessage("Hello "+val+"!", "http://res.42du.cn");
}); 

发送消息的基本语法:

targetWindow.postMessage(message, targetOrigin, [transfer]);

targetWindow

targetWindow就是接收消息的窗口的引用。 获得该引用的方法包括:

  • Window.open
  • Window.opener
  • HTMLIFrameElement.contentWindow
  • Window.parent
  • Window.frames +索引值

message

message就是要发送到目标窗口的消息。 数据使用结构化克隆算法进行序列化。 这意味着我们可以将各种各样的数据对象安全地传递到目标窗口,而无需自己对其进行序列化。

targetOrigin

targetOrigin就是指定目标窗口的来源,必须与消息发送目标相一致,可以是字符串“*”或URI。 *表示任何目标窗口都可接收,为安全起见,请一定要明确提定接收方的URI。

transfer

transfer是可选参数

接收端

目标窗口通过执行下面的JavaScript来侦听发送过来的消息:

window.addEventListener("message", receiveMessage, false);
function receiveMessage(event){
  if (event.origin !== "http://www.42du.cn")
    return;
}

event对象有三个属性,分别是origin,data和source。event.data表示接收到的消息;event.origin表示postMessage的发送来源,包括协议,域名和端口;event.source表示发送消息的窗口对象的引用; 我们可以用这个引用来建立两个不同来源的窗口之间的双向通信。

完整程序

发送程序

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>42度空间-window.postMessage()跨域消息传递</title>
</head>
<body>
<div>
    <input   type="text" value="42度空间" />
    <button   >发送消息</button>
</div>
<iframe   src="http://res.42du.cn/static/html/receiver.html"   height="60">
    <p>你的浏览器不支持IFrame。</p>
</iframe>
<script>
    window.onload = function() {
        var receiver = document.getElementById('receiver').contentWindow;
        var btn = document.getElementById('send');
        btn.addEventListener('click', function (e) {
            e.preventDefault();
            var val = document.getElementById('text').value;
            receiver.postMessage("Hello "+val+"!", "http://res.42du.cn");
        });
    }
</script>
</body>
</html>

接收程序

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>42度空间-从www.42du.cn接收消息</title>
</head>
<body>
<div id="message">
    Hello World!
</div>
<script>
    window.onload = function() {
        var messageEle = document.getElementById('message');
        window.addEventListener('message', function (e) {
            alert(e.origin);
            if (e.origin !== "http://www.42du.cn") {
                return;
            }
            messageEle.innerHTML = "从"+ e.origin +"收到消息: " + e.data;
        });
    }
</script>
</body>
</html>


免责声明:文章转载自《用HTML5里的window.postMessage在两个网页间传递数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Row size too large. The maximum row size for the used table type 解决TiDB-入门简介下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(二)文档请求不同源之window.postMessage跨域

一、基本原理 HTML5为了解决跨域,引入了跨文档通信API(Cross-document messaging)。这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。Internet Explorer 8+, chrome,Firefox , Opera和Safari 都支持这个功能。 二...

Git 常用命令速查表(图文+表格)

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态git commit 提交git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释git remote add origin git@192.168.1.119:ndsh...

[转]Windows8的WPF技术与HTML5的比较

Windows8风格程序支持使用WPF和HTML两种方式进行编程。本人之前曾使用WPF开发过概念版QQ,现在又在使用HTML5。两种技术都略懂,略懂。所以将两者做了个比较。虽然WPF的命运多舛,应用不太广泛,但技术本身还是有很多亮点的。值得我们学习一下,开阔眼界。   严格说WPF与Silverlight都属于.Net技术体系下新一代的界面技术,都使用标...

HTML5下video右键禁用-禁止右键下载视频

方法一: <script language="javascript" type="text/javascript" src="https://code.jquery.com/jquery-1.7.1.min.js"></script> <script> $(document).ready(function(){...

解决git 出现 Your account has been blocked问题

使用git 出现 Your account has been blocked 无法从远程pull代码下来, 解决方案如下: $ git push origin masterGitLab: Your account has been blocked.fatal: Could not read from remote repository. git 提交时出现...

【转】JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。 下表给出了相对http://store.company.com/dir/page.html同源检测的结果: 要解决跨域的问题,我们可以使用...