返回顶部
首页 > 资讯 > 前端开发 > node.js >html5怎样通过postMessage进行跨域通信
  • 314
分享到

html5怎样通过postMessage进行跨域通信

2024-04-02 19:04:59 314人浏览 安东尼
摘要

小编给大家分享一下HTML5怎样通过postMessage进行跨域通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!最近工作中遇到一个需求,场景是:h6页作为预览模块内嵌在pc页中,用户在

小编给大家分享一下HTML5怎样通过postMessage进行跨域通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

最近工作中遇到一个需求,场景是:h6页作为预览模块内嵌在pc页中,用户在pc页中能够做一些操作,然后h6做出响应式变化,达到预览的效果。

这里首先想到就是把h6页面用iframe内嵌到pc网页中,然后pc通过postMessage方法,把变化的数据发送给iframe,iframe内嵌的h6通过addEventListener接收数据,再对数据做响应式的变化。

这里总结一下postMessage的使用,api很简单:

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

otherWindow是目标窗口的引用,在当前场景下就是iframe.contentWindow;

message是发送的消息,在Gecko 6.0之前,消息必须是字符串,而之后的版本可以做到直接发送对象而无需自己进行序列化;

targetOrigin表示设定目标窗口的origin,其值可以是字符串"*"(表示无限制)或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。对于保密性的数据,设置目标窗口origin非常重要;

当postMessage()被调用的时,一个消息事件就会被分发到目标窗口上。该接口有一个message事件,该事件有几个重要的属性:

1.data:顾名思义,是传递来的message
2.source:发送消息的窗口对象
3.origin:发送消息窗口的源(协议+主机+端口号)

这样就可以接收跨域的消息了,我们还可以发送消息回去,方法类似。

可选参数transfer 是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

那么,当iframe初始化后,可以通过下面代码获取到iframe的引用并发送消息:

// 注意这里不是要获取iframe的dom引用,而是iframe window的引用
const iframe = document.getElementById('myIFrame').contentWindow;
iframe.postMessage('hello world', 'Http://yourhost.com');

在iframe中,通过下面代码即可接收到消息。

window.addEventListener('message', msgHandler, false);

在接收时,可以根据需要,对消息来源origin做一下过滤,避免接收到非法域名的消息导致的xss攻击。

最后,为了代码复用,把消息发送和接收封装成一个类,同时模拟了消息类型的api,使用起来非常方便。具体代码如下:

export default class Messager {
    constructor(win, targetOrigin) {
        this.win = win;
        this.targetOrigin = targetOrigin;
        this.actions = {};
        window.addEventListener('message', this.handleMessageListener, false);
    }

    handleMessageListener = event => {
        if (!event.data || !event.data.type) {
            return;
        }
        const type = event.data.type;
        if (!this.actions[type]) {
            return console.warn(`${type}: missing listener`);
        }
        this.actions[type](event.data.value);
    }

    on = (type, cb) => {
        this.actions[type] = cb;
        return this;
    }

    emit = (type, value) => {
        this.win.postMessage({
            type, value
        }, this.targetOrigin);
        return this;
    }

    destroy() {
        window.removeEventListener('message', this.handleMessageListener);
    }
}

看完了这篇文章,相信你对“html5怎样通过postMessage进行跨域通信”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网node.js频道,感谢各位的阅读!

--结束END--

本文标题: html5怎样通过postMessage进行跨域通信

本文链接: https://lsjlt.com/news/80799.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • html5怎样通过postMessage进行跨域通信
    小编给大家分享一下html5怎样通过postMessage进行跨域通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!最近工作中遇到一个需求,场景是:h6页作为预览模块内嵌在pc页中,用户在...
    99+
    2024-04-02
  • html5怎么通过postMessage进行跨域通信
    本篇内容主要讲解“html5怎么通过postMessage进行跨域通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5怎么通过postMessage进行...
    99+
    2024-04-02
  • html5如何通过postMessage进行跨域通信
    这篇文章主要介绍html5如何通过postMessage进行跨域通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!工作中遇到一个需求,场景是:h6页作为预览模块内嵌在pc页中,用户在...
    99+
    2024-04-02
  • html5跨域通讯中postMessage的用法
    这篇文章给大家介绍html5跨域通讯中postMessage的用法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。postMessagePortal.html 页面代码代码如下:<...
    99+
    2024-04-02
  • 如何在html5中使用postMessage解决跨域通信
    本篇文章给大家分享的是有关如何在html5中使用postMessage解决跨域通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。postmessage解析HTML5提供了新型机...
    99+
    2023-06-09
  • 使用postMessage怎么解决iframe跨域通信
    这篇文章将为大家详细讲解有关使用postMessage怎么解决iframe跨域通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先我们模拟场景,假设有两个不同源的页面,iframePage...
    99+
    2023-06-09
  • Vue使用postMessage实现父子跨域通信
    目录一、跨域通信二、示例三、拓展阅读vue项目中postMessage的使用总结postMessage简介项目搭建一、跨域通信 1.子向父通信parent.html // 页面销毁前...
    99+
    2022-12-31
    Vue父子跨域通信 Vue postMessage Vue跨域通信 postMessage使用
  • Vue怎么使用postMessage实现父子跨域通信
    这篇文章主要讲解了“Vue怎么使用postMessage实现父子跨域通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用postMessage实现父子跨域通信”吧!一、跨域通信子...
    99+
    2023-07-04
  • 使用iframe和postMessage怎么实现页面跨域通信
    这篇文章将为大家详细讲解有关使用iframe和postMessage怎么实现页面跨域通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通常情况下,对于两个不同页面的脚本,只有当执行它们的页面...
    99+
    2023-06-09
  • 使用postMessage实现iframe跨域通信的示例代码
    1、父页面内容 <!DOCTYPE html> <html> <head> <meta charset="utf-8...
    99+
    2024-04-02
  • vue中iframe使用以及结合postMessage实现跨域通信
    目录使用场景需求iframe使用基本使用常用属性iframe高度自适应获取iframe的内容同域下获取父级/子级内容iframe跨域postMessage通信在vue中使用使用场景 ...
    99+
    2024-04-02
  • 使用JavaScript JSONP进行跨域通信的技巧和窍门
    实现跨域通信的途径有很多,其中一种方法便是JavaScript JSONP(JSON with Padding)。JSONP是一种用于跨域数据传输的技术,通过动态创建和加载<script>标签向其他域发送请求,从而绕过同源策...
    99+
    2024-02-24
    JavaScript JSONP 跨域通信 安全性 服务端处理 代码实现
  • Android使用GRPC进行通信过程解析
    目录引言环境搭建修改项目的setting.gradle信息修改项目的build.gralde信息修改gradle版本号修改模块的build.gradle信息在main目录下创建pro...
    99+
    2023-02-28
    Android使用GRPC Android GRPC通信
  • 如何在golang中使用WebSocket进行跨平台通信
    WebSocket是一种用于在Web浏览器和服务器之间进行实时双向通信的技术。它提供了一种可靠的方式来发送和接收数据,并且比传统的HTTP请求-响应机制更加高效、快速。在golang中,我们可以使用第三方库来支持WebSocket通信,本文...
    99+
    2023-12-18
    Golang websocket 跨平台通信
  • 通过nslookup命令如何进行域名解析
    使用nslookup命令对域名进行解析的方法首先,在计算机中使用组合键“win+R”运行cmd,打开命令提示符窗口;进入到命令提示符窗口后,在命令行中执行nslookup命令即可对域名进行解析;例:解析百度域名nslookup www.ba...
    99+
    2024-04-02
  • 通过python对本局域网进行ARP扫描
    #!/usr/local/bin/python3 """ 对本局域网进行ARP扫描 ARP (Address Resolution Protocol,ARP); 以太网MAC地址识别(如下): 主机在整个局域网广播ARP请求消息,该ARP...
    99+
    2023-01-31
    局域网 python ARP
  • vue父子组件进行通信方式是怎样的
    这篇文章主要介绍“vue父子组件进行通信方式是怎样的”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue父子组件进行通信方式是怎样的”文章能帮助大家解决问题。如图所示,父组件向子组件传递数据,可以通...
    99+
    2023-06-29
  • React父子组件间的通信是怎样进行的
    目录父子组件通信方式父传子子传父ref标记(传递数据)非父子组件通信方式状态提升(兄弟通信)发布订阅模式context状态树传参(跨组件方案)React插槽children实现插槽多...
    99+
    2023-03-14
    React父子组件通信 React组件通信
  • Vue中iframe怎么结合window.postMessage实现跨域通信
    这篇文章主要介绍“Vue中iframe怎么结合window.postMessage实现跨域通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中iframe怎么结合window.postMess...
    99+
    2023-07-04
  • Android怎么使用GRPC进行通信
    这篇文章主要介绍“Android怎么使用GRPC进行通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么使用GRPC进行通信”文章能帮助大家解决问题。引言Android作为一个开发平...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作