window.postMessage使用详解(参数、transferable接口详解、使用注意点、示例)

目录

window.postMessage(message, targetOrigin, [transfer])

参数

transferable接口详解

使用注意点

实例

窗口1

窗口2

运行效果

事件默认参数


window.postMessage(message, targetOrigin, [transfer])

可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机  (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow = window.opener),然后在窗口上调用 targetWindow.postMessage() 方法分发一个  MessageEvent 消息。接收消息的窗口可以根据需要自由处理此事件 (en-US)。传递给 window.postMessage() 的参数(比如 message )将通过消息事件对象暴露给接收消息的窗口

参数

参数说明
window窗口的一个引用,比如 iframe 的 contentWindow 属性、执行 window.open 返回的窗口对象、或者是命名过或数值索引的 window.frames(注意需要用相同的window监听消息)。
message只能为字符串,将要发送到其他 window的数据。
targetOrigin指定哪些窗口能接收到消息事件,其值可以是 *(表示无限制)或者一个 URI(注意指定URI不支持跨域,会报错,而*号支持跨域)。
transfer

可选,是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。Transferable 接口代表一个能在不同可执行上下文之间,列如主线程和 Worker 之间,相互传递的对象。

transferable详解

Transferable - Web API 接口参考 | MDN

使用注意点

1.监听时使用window.addEventListener("message",(e)=>{}, false),必须保证监听的window和发送消息的window相同

2.需要确定先监听了message事件,再发送的消息

3.targetOrigin指定了URI的话,必须是相同的域和端口号,不然会报跨域错误。

4.targetOrigin使用*号的话,支持跨域,我们可以通过监听消息的默认参数e.origin来判断是否接收到了正确的消息

实例

窗口1

端口5050

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>窗口1</div>
    <iframe src="http://127.0.0.1:5501/2.html" frameborder="1" id='123' name="abc"></iframe>
    <script>
        window.onload = function () {
            setTimeout(() => {
                window.top.postMessage('handsome', '*')
            }, 0)
        }
    </script>
</body>
</html>

窗口2

端口5051

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>窗口2</div>
    <script>
        top.addEventListener('message',(e)=>{console.log(e)},false)
    </script>
</body>
</html>

运行效果

事件默认参数

  • e.source – 消息源,消息的发送窗口/iframe。
  • e.origin – 消息源的 URI(可能包含协议、域名和端口),用来验证数据源。
  • e.data – 发送过来的数据。
window.postMessage()是一种在不同窗口之间进行通信的方法。它允许一个窗口向另一个窗口发送消息,并且可以在目标窗口中处理这些消息。这个方法参数包括message、targetOrigin和transfermessage参数是要发送到目标窗口的数据,只能是字符串类型。targetOrigin参数指定哪些窗口可以接收到消息事件,它可以是一个URI或者是"*",表示无限制。最后,transfer参数是可选的,它指定要传递给目标窗口的传输对象。 使用window.postMessage()方法可以实现不同窗口之间的跨域通信,但需要注意安全性问题。因为目标窗口可以是不同域的窗口,所以需要确保目标窗口是可信的,以避免潜在的安全风险。 总结来说,window.postMessage()是一种用于不同窗口之间进行通信的方法,它可以通过传递数据和指定目标窗口来实现消息的发送和接收。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [window.postMessage使用详解参数transferable接口详解使用注意示例)](https://blog.csdn.net/AIWWY/article/details/121666983)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值