{"componentChunkName":"component---src-templates-blog-post-js","path":"/2018/11/15/post-message跨文档通信简介/","result":{"data":{"content":{"edges":[{"node":{"id":"30d0920f-b7fb-5869-a153-1c0abb58d3d6","html":"<h2 id=\"概述\" style=\"position:relative;\"><a href=\"#%E6%A6%82%E8%BF%B0\" aria-label=\"概述 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>概述</h2>\n<p>web通信主要是为了实现独立上下文之间共享数据, 满足业务需求, 同时尽量避免暴露数据的一种技术手段。通常可通过获取句柄、共享存储或结合事件通知等方式来实现。</p>\n<h2 id=\"html文档间通信\" style=\"position:relative;\"><a href=\"#html%E6%96%87%E6%A1%A3%E9%97%B4%E9%80%9A%E4%BF%A1\" aria-label=\"html文档间通信 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>html文档间通信</h2>\n<p>实现方式主要有</p>\n<ol>\n<li>父子文档通信(借助window对象<a href=\"https://caniuse.com/#search=postMessage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">postMessage</a>);</li>\n<li>借助<a href=\"https://caniuse.com/#search=localStorage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">localStorage</a>监听;</li>\n<li>使用广播隧道(<a href=\"https://caniuse.com/#search=BroadcastChannel\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">BroadcastChannel</a>);</li>\n<li>借助服务器向另一窗口推送信息(WebSocket, SSE)。</li>\n</ol>\n<h3 id=\"父子文档通信\" style=\"position:relative;\"><a href=\"#%E7%88%B6%E5%AD%90%E6%96%87%E6%A1%A3%E9%80%9A%E4%BF%A1\" aria-label=\"父子文档通信 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>父子文档通信</h3>\n<p>window对象上的postMessage方法包含三个参数:</p>\n<ul>\n<li>message为消息体,它将会被结构化克隆算法序列化</li>\n<li>targetOrigin定义窗口的origin属性, 保证协议、主机地址或端口的完全匹配</li>\n<li>transfer是一个消息上下文, 供目标环境调用</li>\n</ul>\n<p>parent.html:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> childPage <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./child.html'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'child'</span><span class=\"token punctuation\">)</span>\nchildPage<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    childPage<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hello'</span><span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">.</span>origin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>child.html:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">window<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">evt</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>evt<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// evt.data</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>iframe通信与此类似, 获取对象分别为window.frames[0]和window.parent。 此方案比较普遍, 局限在html为父子关系的页面。</p>\n<h3 id=\"localstorage监听\" style=\"position:relative;\"><a href=\"#localstorage%E7%9B%91%E5%90%AC\" aria-label=\"localstorage监听 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>localStorage监听</h3>\n<p>源页面</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">'message'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'hello'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>接收页面</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">window<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onstorage</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>key<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">.</span>oldValue<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">.</span>newValue<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>实现较简单, 但数据会暴露给Web Storage, 并且赋值两次相同时onStorage不会触发。</p>\n<h3 id=\"广播隧道broadcastchannel\" style=\"position:relative;\"><a href=\"#%E5%B9%BF%E6%92%AD%E9%9A%A7%E9%81%93broadcastchannel\" aria-label=\"广播隧道broadcastchannel permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>广播隧道BroadcastChannel</h3>\n<p>发送页面</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> channel <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BroadcastChannel</span><span class=\"token punctuation\">(</span><span class=\"token string\">'tab'</span><span class=\"token punctuation\">)</span>\nchannel<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hello'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>接收页面</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> channel <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BroadcastChannel</span><span class=\"token punctuation\">(</span><span class=\"token string\">'tab'</span><span class=\"token punctuation\">)</span>\nchannel<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>数据较安全, 但是兼容性不好。</p>\n<h3 id=\"服务端推送\" style=\"position:relative;\"><a href=\"#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8E%A8%E9%80%81\" aria-label=\"服务端推送 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>服务端推送</h3>\n<p>WebSocket为全双工通道, 可以双向通信; SSE为单向通道, 只能服务器向浏览器发送。实现方法可以参考<a href=\"http://www.ruanyifeng.com/blog/2017/05/server-sent_events.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Server-Sent Events 教程</a>。</p>\n<h2 id=\"web-worker间通信\" style=\"position:relative;\"><a href=\"#web-worker%E9%97%B4%E9%80%9A%E4%BF%A1\" aria-label=\"web worker间通信 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Web Worker间通信</h2>\n<p>worker的postMessage方法向worker内部作用域发送一个消息, worker本身可以使用DedicatedWorkerGlobalScope.postMessage  方法将信息发送回生成它的线程。worker没有浏览器环境, postMessage方法可有两个参数, 第一个为消息体, 第二个是隧道数组。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// 调用worker</span>\n<span class=\"token keyword\">const</span> w1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">'worker1.js'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> w2 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">'worker2.js'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> mc <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MessageChannel</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nw1<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'port1'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>mc<span class=\"token punctuation\">.</span>port1<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\nw2<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'port2'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>mc<span class=\"token punctuation\">.</span>port2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\nw2<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">get </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>data<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> on html</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// worker1.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">get </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>data<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> from </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>currentTarget<span class=\"token punctuation\">.</span>origin<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> port <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>ports<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    port<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'message send from worker1'</span><span class=\"token punctuation\">)</span>\n    port<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">evt</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">get </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>evt<span class=\"token punctuation\">.</span>data<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> on </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>currentTarget<span class=\"token punctuation\">.</span>location<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// worker2.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">get </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>data<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> from </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>currentTarget<span class=\"token punctuation\">.</span>origin<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> port <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>ports<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    port<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">evt</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">get </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>evt<span class=\"token punctuation\">.</span>data<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> on </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>e<span class=\"token punctuation\">.</span>currentTarget<span class=\"token punctuation\">.</span>location<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>evt<span class=\"token punctuation\">.</span>data<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> from worker2</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>可以看到控制台输出</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">get</span> port1 <span class=\"token keyword\">from</span> http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>localhost<span class=\"token operator\">:</span>端口号\n<span class=\"token keyword\">get</span> port2 <span class=\"token keyword\">from</span> http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>localhost<span class=\"token operator\">:</span>端口号\n<span class=\"token keyword\">get</span> message send <span class=\"token keyword\">from</span> worker1 on http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>localhost<span class=\"token operator\">:</span>端口号<span class=\"token operator\">/</span>worker2<span class=\"token punctuation\">.</span>js\n<span class=\"token keyword\">get</span> message send <span class=\"token keyword\">from</span> worker1 <span class=\"token keyword\">from</span> worker2 on html</code></pre></div>\n<p>还有一种允许多个脚本共享单一worker的Shared Web Workers, 兼容性不太好, 以后有机会再说。</p>","fields":{"slug":"/post-message跨文档通信简介/"},"tableOfContents":"<ul>\n<li><a href=\"//#%E6%A6%82%E8%BF%B0\">概述</a></li>\n<li>\n<p><a href=\"//#html%E6%96%87%E6%A1%A3%E9%97%B4%E9%80%9A%E4%BF%A1\">html文档间通信</a></p>\n<ul>\n<li><a href=\"//#%E7%88%B6%E5%AD%90%E6%96%87%E6%A1%A3%E9%80%9A%E4%BF%A1\">父子文档通信</a></li>\n<li><a href=\"//#localstorage%E7%9B%91%E5%90%AC\">localStorage监听</a></li>\n<li><a href=\"//#%E5%B9%BF%E6%92%AD%E9%9A%A7%E9%81%93broadcastchannel\">广播隧道BroadcastChannel</a></li>\n<li><a href=\"//#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8E%A8%E9%80%81\">服务端推送</a></li>\n</ul>\n</li>\n<li><a href=\"//#web-worker%E9%97%B4%E9%80%9A%E4%BF%A1\">Web Worker间通信</a></li>\n</ul>","frontmatter":{"id":"e25da473f44ea93d91d5a93cda0fcd61","description":"window.postMessage() 方法可以安全地实现跨源通信。通常，对于两个不同页面的脚本，只有当执行它们的页面位于具有相同的协议（通常为https），端口号（443为https的默认值），以及主机  (两个页面的模数 Document.domain设置为相同的值) 时，这两个脚本才能相互通信。","title":"postMessage跨文档通信简介","slug":"/","date":"2018年11月15日","tags":["postMessage","Web Worker"],"headerImage":"https://2img.net/h/i968.photobucket.com/albums/ae170/laughingjacky/Blog%20Assets%202019/broadcastchannel_zpsimqib898.jpeg"}},"previous":null,"next":null}]},"site":{"siteMetadata":{"title":"王晓博 - 银河系漫游指南","description":"如果这个博客好久不更新了,说明我更浑浑噩噩了"}}},"pageContext":{"id":"30d0920f-b7fb-5869-a153-1c0abb58d3d6","index":5}},"staticQueryHashes":[]}