所有分类
  • 所有分类
  • 后端开发
H5 页内嵌在 PC 页中实现预览效果及跨域通信方法介绍

H5 页内嵌在 PC 页中实现预览效果及跨域通信方法介绍

本文就和大家具体介绍一下html5通过postmessage进行跨域通信的方法。最后,为了代码复用,把消息发送和接收封装成一个类,同时模拟了消息类型的api,使用起来非常方便。以上内容就是html5通过postMessage进行跨域通信的方

一、跨域通信的必要性

上网互动多了,经常需要搬点啥东西到其他网站或页面上,但不一定有相同的权限!这时候,HTML5的PostMessage功能就派上用场了,它能帮忙在各个页面之间安全地传递信息,实现数据分享~

跨域通信,就是把各种网站串起来用,就像搭积木一样,打破那种信息孤立的感觉,让你玩得更爽快!举个例子比如你想知道今天什么天儿,或者想去网上淘点好玩意儿,这会儿跨域通信就能帮到你了!

二、PostMessage的基本原理

PostMessage像是HTML 5中的魔法棒!它能让我们在网页间放心地聊悄悄话。用法很简单,一个网页给别的网页发条信息,那边就能接收到并有所回馈。这个小玩意儿对那些用iFrame嵌套或多个H5页面交谈的人特别有用。

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

你想在网页上嵌入别的网页吗?那就用iframe呗!然后别忘了还有PostMessage这个小助手。你只需要传递三个信息:要说啥、给谁(目标窗口)以及由谁发起(源点origin)。哪怕两个页面地址不同,也不怕有数据安全问题!

三、PostMessage的API详解

这API可真是好用!用它就像玩儿游戏一样轻松愉快,只要做三件事儿:搞清楚别的窗户外的事儿(otherWindows)、告诉它你要说啥(message)、告诉它你从哪儿来的(targetOrigin)。这几个设置可是能决定信息是否能稳妥地传过去~

比如在网站上弄一个iframe框,然后用iframe.contentWindow找到了那个目标对象。接着,就可以通过postMessage这个方式,告诉对方想说的话以及自己是谁。这样一来,信息就能准确无误地传到对方那儿去!

四、消息的发送与接收

要通过PostMessage发消息,最重要的是俩步!首先要了解目标窗口用的啥协议,是谁的哪个端口连着?这些都得和targetOrigin对上才能发送成功。接着,你得在目标窗口里添加个eventListener来准备接收消息。这样小息来了之后就能及时处理。

接到短信时,你得看三点:data(消息本身),source(发件人)还有origin(从哪发来的),这可是挺重要的。知道这些,就可以判断谁发的啥样的信息,再决定怎么办咯。

五、安全性考虑

其实用PostMessage挺方便的,不过别忘了注意安全!尤其涉及到敏感信息时,弄清楚弹出窗口来自哪里非常关键。如此可防止资料泄露,减小潜在风险。

你知道怎么设置系统帮我们过滤掉一些可能有问题的消息的来源吗?比如说,有些网站可能会利用XSS攻击来盗取个人信息。只要注意这点就不用担心资料泄露!

六、代码示例与封装

下面给大家看看如何用PostMessage搞定网页上的消息传递。就拿主页上的嵌入框来说,你可以把信息扔过去,然后在那里接住并处理它,简单?

H5 页内嵌在 PC 页中实现预览效果及跨域通信方法介绍

在主页面中,你可以这样发送消息:

javascript
找到"myIframe"那个框框,操作就搞定了
直接在iframe里面窗口中输入“父级的你好”,目标连接就是那个"http://target-domain.com"!

而在iframe中,你可以这样接收消息:

咱就这么定了有人发给窗口信息时,就用这个函数搞定。

只要事件开始地址不为”http://target-domain.com”,咱们就不用操心了。

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

log(‘收到信息!’, event.data);

});

老话儿说,让咱的代码既好使又易修复,那就是得把发收消息这事儿放在同一个类里面搞,方便许多!

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

七、实际应用场景

说起PostMessage这货,真是好用得不得了。咱们逛网页的时候不都会遇到那种好多种商品,有的是同一网站的,有的却来自其他地方的情况吗?这个时候,PostMessage就能大显身手,帮我们解决这个头疼的跨站数据传输问题!

另一种我们常遇到的就是一大帮人一起做事。比如说,阿我这里有个团队用的小程序,他们就想看别人在同一页上发的新消息,这些消息还会来自各种地方。这时候,我们只需要看看PostMessage那个玩意儿,大伙儿就可以分享实时信息,这样做事就高效多!

八、总结与展望

看这儿,了解了HTML5的PostMessage,是不是觉得跨站交流都没那么复杂了?不仅如此,它还有助于保障我们的网络信息安全。所以说,在现今的互联网世界里,PostMessage可是个超级实用又必要的工具

以后,随着网络科技越来越发达,我们对跨网站沟通的需求也只会越来越多。这个PostMessage就像是HTML5给我们的跨站神器,在网页设计上起到了关键作用,让你可以随心所欲地创建强大又灵活的网页应用!

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);
    }
}

哈喽朋友们,大家有没有遇到跨域沟通的问题呀?咋解决的?快留言说说您的经验!点赞转发一下别忘了~

原文链接:https://www.icz.com/technicalinformation/web/2024/07/20214.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?