js postMessage不工作

简介: 原因分析,可能代码写法哪里有误,可能由于 index2.html 代码块执行太快,iframe 中内容还未完全加载和渲染就结束了.

image.png

JavaScript高级程序设计 第四版 20章第二节内容。 20.2 跨上下文消息 内容学习笔记


故障现场


当前页面为 index2.html,本地页面运行地址为


http://localhost:52330/Chapter20/index2.html, 代码如下


<!DOCTYPE html>
<html>
  <head>
    <title>index2</title>
  </head>
  <body>
    <iframe src="http://localhost:52330/Chapter20/index.html" id="myframe"></iframe>
    <script>
      let iframeWindow = document.getElementById('myframe').contentWindow;
      console.log('iframeWindow contextWindow: ', iframeWindow);
      iframeWindow.postMessage('A secret', 'http://localhost:52330/Chapter20/index.html');
    </script>
  </body>
</html>


页面中使用 iframe 标签显示 index.html 页面,效果如下


image.png

index.html 内容


<!DOCTYPE html>
<html>
  <head>
    <title></title>
  </head>
  <body>
    index.html
    <script>
      window.addEventListener('message', (event) => {
        console.log('1')
        console.log(event.origin)
      })
    </script>
  </body>
</html>
复制代码


当前代码写法在 index2.html 中使用 postMessage 页面运行后,在 index.html 中监听 message 无反应。


原因分析


  • 可能代码写法哪里有误
  • 可能由于 index2.html 代码块执行太快,iframe 中内容还未完全加载和渲染就结束了


解决方案


  • 写法问题,通过核对书和MDN没有不一样的地方
  • 尝试使用 setTimeout 后发现这个问题解决了,确定了是渲染加载的问题


最后 index2.html 代码调整部分如下, index.html 就可以监听到消息了


setTimeout(() => {
  console.log('1000ms')
  iframeWindow.postMessage('A secret', 'http://localhost:52330/Chapter20/index.html');
}, 1000)


相关文章
|
19天前
|
JavaScript 前端开发
|
8月前
|
JavaScript 前端开发
JS什么是事件处理
JS什么是事件处理
|
9月前
|
JavaScript 前端开发 API
js常用事件
js常用事件
|
19天前
|
JavaScript 前端开发
js的事件
js的事件
25 1
|
19天前
|
JavaScript 前端开发
js的事件介绍
js的事件介绍
24 1
|
19天前
|
JavaScript 前端开发
js的交互事件
js的交互事件
24 1
|
19天前
|
JavaScript 前端开发
js中常见的几种事件
js中常见的几种事件
19 4
|
19天前
|
JavaScript
JS中常用的几种事件
JS中常用的几种事件
19 1
|
19天前
|
JavaScript 前端开发
js的常用事件
js的常用事件
31 1
|
10月前
|
JavaScript 前端开发 数据可视化