iframe中涉及父子页面跨域问题

什么是跨域?

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指相同的域名、协议和端口,只要其中一项不同就为跨域。
举几个例子:

  1. http://a.123.com/index.htmlhttp://a.123.com/index.js非跨域,它们有相同的域名,协议和端口。
  2. http://a.123.com/index.htmlhttp://b.123.com/index.js跨域,相同的端口、协议,但是域名不同(a.123.comb.123.com)。
  3. http://a.123.com:8080/index.htmlhttp://a.123.com:8081/index.js跨域,相同的域名、协议,但是端口不同(8080和8081)。
  4. http://a.123.com/index.htmlhttps://a.123.com/index.js跨域跨域,相同的域名、端口,但是协议不同(http和https)。

一,子向父传数据:

【发送消息】

otherWindow.postMessage(message, targetOrigin, [transfer])
  • otherWindow
    其他窗口的一个引用,写的是你要通信的window对象。
    例如在iframe中向父窗口传递数据时,可以写成window.parent.postMessage(),window.parent表示父窗口。
  • message
    需要传递的数据,字符串或者对象都可以。
  • targetOrigin
    表示目标窗口的源,协议+域名+端口号,如果设置为“*”,则表示可以传递给任意窗口。在发送消息的时候,如果目标窗口的协议、域名或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。例如:
window.parent.postMessage(‘hello world‘,‘http://a.123.com:8080/index.html‘)

只有父窗口是http://a.123.com:8080时才会接受到传递的消息。

  • [transfer]
    可选参数。是一串和message 同时传递的 Transferable 对象,这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。我们一般很少用到。

【接收消息】

window.addEventListener(‘message‘, function (e) {
    console.log(e.data)  //e.data为传递过来的数据
    console.log(e.origin)  //e.origin为调用 postMessage 时消息发送方窗口的 origin(域名、协议和端口)
    console.log(e.source)  //e.source为对发送消息的窗口对象的引用,可以使用此来在具有不同origin的两个窗口之间建立双向通信
})

iframe传递关闭命令

父窗口接收到命令将iframe关闭

二, 父向子传数据

共两个页面,

页面1:www.a.com/a.html 
页面2:www.b.com/b.html

实现目标:两个网站页面实现跨域相互通信 
当前例子依赖于 jQuery 3.0

页面代码:www.a.com/a.html

<iframe id="myIframe" src="http://www.b.com/b.html"></iframe>
<script>
var $myIframe = $(‘#myIframe‘);
// 注意:必须是在框架内容加载完成后才能触发 message 事件哦
$myIframe.on(‘load‘, function(){
    var data = {
        act: ‘article‘,  // 自定义的消息类型、行为,用于switch条件判断等。。
        msg: {
            subject: ‘跨域通信消息收到了有木有~‘,
            author: ‘CSDN-神神的蜗牛‘
        }
    };
    // 不限制域名则填写 * 星号, 否则请填写对应域名如 http://www.b.com
    $myIframe[0].contentWindow.postMessage(data, ‘*‘);
});

// 注册消息事件监听,对来自 myIframe 框架的消息进行处理
window.addEventListener(‘message‘, function(e){
    if (e.data.act == ‘response‘) {
        alert(e.data.msg.answer);
    } else {
        alert(‘未定义的消息: ‘+ e.data.act);
    }
}, false);
</script>

页面代码:www.b.com/b.html

<script>
// 注册消息事件监听,对来自 myIframe 框架的消息进行处理
window.addEventListener(‘message‘, function(e){
    if (e.data.act == ‘article‘) {
        alert(e.data.msg.subject);
        // 向父窗框返回响应结果
        window.parent.postMessage({
            act: ‘response‘,
            msg: {
                answer: ‘我接收到啦!‘
            }
        }, ‘*‘);
    } else {
        alert(‘未定义的消息: ‘+ e.data.act);
    }
}, false);
</script>

原文地址:https://www.cnblogs.com/sweeeper/p/11131000.html

时间: 2024-10-07 21:01:44

iframe中涉及父子页面跨域问题的相关文章

用iframe设置代理解决ajax跨域请求问题

面对ajax跨域请求的问题,想用代理的方式来解决这个跨域问题.在服务器端创建一个静态的代理页面,在客户端用iframe调用这个代理 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题.于是想用代理的方式来解决这个跨域问题. 什么是跨域?简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 方案:在服务器端创建一个静态的代理页面,在

js中ajax如何解决跨域请求

js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操作. 跨域指的协议.域名.端口 有一个不同的情况下都是跨域 例:在本站点请求外站的数据是不允许的 //在本站点请求外站点的资源是不允许的 $(function () { $.ajax({ url: "http://127.0.0.1:14847/Web/jsonp.js", success

在vue中使用axios实现跨域请求并且设置返回的数据的格式是json格式,不是jsonp格式

在vue中使用axios实现跨域请求 需求分析:在项目中需要抓取qq音乐的歌曲列表的数据,由于要请求数据的地址url=https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg.从qq音乐的官网上可以看到该请求的请求头中的referer中的域名是y.qq.com(发送请求页面的域名),而host的域名是c.y.qq.com(被请求页面的域名),由于两者不一样,所以不能通过前端直接发送请求给qq服务器去拿数据.这时候需要服务器做一个代理

Web API中使用CORS解决跨域(暂存)

Web API中使用Cros解决跨域 如果两个页面的协议,端口和域名都相同,则两个页面具有相同的源,注:IE不考虑端口,同源策略不会阻止浏览器发送请求,但是它会阻止应用程序看到响应.如下图所示 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨源服务器,发出请求.CORS需要浏览器和服务器同时支持,目前,主流的浏览器都支持CORS,因此实现CORS通信的关键是服务器.CORS是通过目标服务器返回的Header设

访问腾讯存储桶中的文件,跨域问题的解决

报错如上图,场景:前端同事在使用js请求时,引出来的这个问题. 就报错而言不难解决,在对相应的桶做一个cors配置即可.但问题是依旧是报跨域的错,配置了跨域头未生效. 究其原因,大概率是可能在用户第一次访问cdn,cdn会检查数据没有,回源到源站进行访问.源站对比将数据经过cdn反馈给客户端浏览器.浏览器比对Access-Control-Allow-Origin 后,允许正确,所以跨域正常. 当第二个用户访问时,cdn检测有这个文件,所以会直接给客户端反馈缓存页面.由于CDN之所以失败是因为CD

iframe中操作主体页面的元素,方法

在不使用三大框架的情况下,iframe的使用可以做到在页面中直接引入别的页面作为当前页面的一部分,但是在iframe的使用过程中存在一些相互之间的操作 例如在iframe中获取主页面的元素,使用主页面的js中定义的方法 第一.在iframe中查找父页面元素的方法: $('#id', window.parent.document) 第二.在父页面中获取iframe中的元素方法: $(this).contents().find("#suggestBox") 第三.在iframe中调用父页面

iframe子页面与父页面跨域相互访问方法

自己没事写着玩,要学习的比较多,先记录下来,以后慢慢修改! 1.先写同域情况下的iframe的父子调用 父窗口 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 7 </head> 8 <body> 9 //父窗口 10 <iframe

iframe内嵌页面——跨域通讯

  <template> <div class="act-form"> <iframe :src="src" ref="iframe" frameborder="no" align="middle" width="100%" height="600px" scrolling="auto" /> <el-bu

项目中经常遇到的跨域请求的几种方法

什么是跨域 JSONP proxy代理 cors xdr 关于跨域无非就是jsonp和iframe,随着跨域请求的应用越来越多,W3C提供了跨域请求的标准方案(Cross-Origin Resource Sharing).IE8.Firefox 3.5 及其以后的版本.Chrome浏览器.Safari 4 等已经实现了 Cross-Origin Resource Sharing 规范,实现了跨域请求.在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息. 如