PHP群:95885625 Hbuilder+MUI群:81989597 站长QQ:634381967
    您现在的位置: 首页 > 开发编程 > 编程杂谈 > 正文

    iframe跨域解决方案

    作者:w634381967来源:网络浏览:时间:2020-09-30 00:07:50我要评论
    导读:在web开发中,跨域问题是经常遇到的,但是由于浏览器同源策略的限制,不同域之间属性和操作是无法直接交互的。本次讨论iframe和父页面的消...
    在web开发中,跨域问题是经常遇到的,但是由于浏览器同源策略的限制,不同域之间属性和操作是无法直接交互的。本次讨论iframe和父页面的消息通信。
    二、现状
    对高端浏览器来说,直接使用原生的postMessage API就可以生效,更多的处理焦点在于IE6、7低版本浏览器。服务器代理涉及多方协作,成本较高。
    三、方案
    1、现代浏览器:使用postMessage API
    2、IE6/7下:采用navigator对象在父窗口和iframe之间共享的特点,在父窗口中,给navigator对象上注册一个消息回调函数;在iframe中,调用navigator上的这个函数并传入参数。相当于iframe往父窗口的一个函数传递了一个参数,并在父窗口的上下文中执行,相当于iframe向父窗口发送一条消息。
    四、优点
    1、该方案不依赖浏览器的各项设计,不受设置影响,同时完美支持HTTPS;
    2、不用创建多余iframe,基于接口调用,不需要轮询,性能大幅提升;
    3、良好的接口封装,所有窗口对象统一对待
    4、多iframe也不怕,navigator对象的共享,让iframe之间直接通信成为可能
    4、安全性考虑:传递消息使用JSON String形式,使用一个字段做消息有效性的验证。如果怕一个固定值不安全,简单加密和压缩混淆。
    五、具体实现步骤
    1、在需要通信的文档中(父窗口和iframe们),都确保引入MessengerJS
    2、每一个文档(document),都需要自己的Messenger与其它文档通信,即每一个window对象都对应着一个,且仅有一个Messenger对象,该Messenger对象会负责当前window的所有通信任务。每个Messenger对象都需要唯一的名字,这样它们才可以知道跟谁通信。
    //父窗口中-初始化Messenger对象
    var messenger = new Messenger("Parent");
    //iframe中-初始化Messenger对象
    var messenger = new Messenger("iframe1");
    //多个iframe,使用不同的名字
    var messenger = new Messenger("iframe2");
    3.在发送消息前,确保目标文档已经监听了消息事件。
    //iframe中-监听消息
    //回调函数按照监听的顺序执行
    messenger.listen(function (msg) {
        alert("收到消息:" + msg);
    });
    4、父窗口想给iframe发消息,它怎么知道iframe存在,添加一个消息对象
    //父窗口中-添加消息对象,明确告诉父窗口iframe的window引用与名字
    messenger.addTarget(iframe1.contentWindow, "iframe1");
    //父窗口中-可以添加多个消息对象
    messenger.addTarget(iframe2.contentWindow, "iframe2");
    5、发送消息有两种方式(以父窗口向iframe发消息为例)
    //父窗口中-向单个iframe发消息
    messenger.targets["iframe1"].send(msg1);
    messenger.targets["iframe2"].send(msg2);
    //父窗口中-向所有目标iframe广播消息
    messenger.send(msg);
    6、messengerjs
    源代码解析:
    1、消息前缀,建议使用自己的项目名,避免多项目之间的冲突
    2、Target类,消息对象
    3、往target发送消息,出于安全考虑,发送消息会带上前缀
    4、信使类
    5、添加一个消息对象
    6、初始化消息监听
    7、监听消息
    8、注销监听
    9、广播消息
    message.js下载地址:http://download.csdn.net/detail/zqjflash/6864351
    转载请注明(B5教程网)原文链接:https://b5.mxunkeji.com/content-74-839-1.html
    相关热词搜索: iframe跨域