iframe 与主框架相互访问方法

1.同域相互访问

假设A.htmlb.html domain都是localhost (同域)

A.html中iframe 嵌入 B.html,name=myframe

A.html有js function fMain()

B.html有js function fIframe()

需要实现 A.html 调用 B.html 的 fIframe(),B.html 调用 A.html 的 fMain()

A.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> main window </title><script type="text/javascript">// main js functionfunction fMain(){alert('main function execute success');}// exec iframe functionfunction exec_iframe(){window.myframe.fIframe();}</script></head><body><p>A.html main</p><p><input type="button" value="exec iframe function" οnclick="exec_iframe()"></p><iframe src="B.html" name="myframe" width="500" height="100"></iframe></body>
</html>

B.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> iframe window </title><script type="text/javascript">// iframe js function function fIframe(){alert('iframe function execute success');}// exec main functionfunction exec_main(){parent.fMain();}</script></head><body><p>B.html iframe</p><p><input type="button" value="exec main function" οnclick="exec_main()"></p></body>
</html>

点击A.html 的 exec iframe function button,执行成功,弹出iframe function execute success。如下图

点击B.html 的 exec main function button,执行成功,弹出 main function execute success。如下图

2.跨域互相访问

假设 A.html domain是 localhostB.html domain 是 127.0.0.1 (跨域)

这里使用 localhost 与 127.0.0.1 只是方便测试,localhost 与 127.0.0.1已经不同一个域,因此执行效果是一样的。

实际使用时换成 www.domaina.com 与 www.domainb.com 即可。

A.html中iframe 嵌入 B.html,name=myframe

A.html有js function fMain()

B.html有js function fIframe()

需要实现 A.html 调用 B.html 的 fIframe(),B.html 调用 A.html 的 fMain() (跨域调用)

如果使用上面同域的方法,浏览器判断A.html 与 B.html 不同域,会有错误提示。

Uncaught SecurityError: Blocked a frame with origin "http://localhost" from accessing a frame with origin "http://127.0.0.1". Protocols, domains, and ports must match.

实现原理:

因为浏览器为了安全,禁止了不同域访问。因此只要调用与执行的双方是同域则可以相互访问

首先,A.html 如何调用B.html的 fIframe方法

1.在A.html 创建一个 iframe

2.iframe的页面放在 B.html 同域下,命名为execB.html

3.execB.html 里有调用B.html fIframe方法的js调用

<script type="text/javascript">
parent.window.myframe.fIframe(); // execute parent myframe fIframe function
</script>

这样A.html 就能通过 execB.html 调用 B.html 的 fIframe 方法了。

同理,B.html 需要调用A.html fMain方法,需要在B.html 嵌入与A.html 同域的 execA.html

execA.html 里有调用 A.html fMain 方法的js 调用

<script type="text/javascript">
parent.parent.fMain(); // execute main function
</script>

这样就能实现 A.html 与 B.html 跨域相互调用。

A.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> main window </title><script type="text/javascript">// main js functionfunction fMain(){alert('main function execute success');}// exec iframe functionfunction exec_iframe(){if(typeof(exec_obj)=='undefined'){exec_obj = document.createElement('iframe');exec_obj.name = 'tmp_frame';exec_obj.src = 'http://127.0.0.1/execB.html';exec_obj.style.display = 'none';document.body.appendChild(exec_obj);}else{exec_obj.src = 'http://127.0.0.1/execB.html?' + Math.random();}}</script></head><body><p>A.html main</p><p><input type="button" value="exec iframe function" οnclick="exec_iframe()"></p><iframe src="http://127.0.0.1/B.html" name="myframe" width="500" height="100"></iframe></body>
</html>

B.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> iframe window </title><script type="text/javascript">// iframe js function function fIframe(){alert('iframe function execute success');}// exec main functionfunction exec_main(){if(typeof(exec_obj)=='undefined'){exec_obj = document.createElement('iframe');exec_obj.name = 'tmp_frame';exec_obj.src = 'http://localhost/execA.html';exec_obj.style.display = 'none';document.body.appendChild(exec_obj);}else{exec_obj.src = 'http://localhost/execA.html?' + Math.random();}}</script></head><body><p>B.html iframe</p><p><input type="button" value="exec main function" οnclick="exec_main()"></p></body>
</html>

execA.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> exec main function </title></head><body><script type="text/javascript">parent.parent.fMain(); // execute main function</script></body>
</html>

execB.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> exec iframe function </title></head><body><script type="text/javascript">parent.window.myframe.fIframe(); // execute parent myframe fIframe function</script></body>
</html>

执行如下图:

iframe与主框架跨域相互访问方法相关推荐

  1. 跨域(cross-domain)访问 cookie (读取和设置)

    跨域(cross-domain)访问 cookie (读取和设置) Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去.坦白 ...

  2. WCF跨域 这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP...

    尝试向 URI"http://localhost:8001/AccountService.svc"发出请求时出错.这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不 ...

  3. 本地主机作服务器解决AJAX跨域请求访问数据的方法

    本地主机作服务器解决AJAX跨域请求访问数据的方法 参考文章: (1)本地主机作服务器解决AJAX跨域请求访问数据的方法 (2)https://www.cnblogs.com/QiScript/p/5 ...

  4. Chrome浏览器端跨域不能访问问题处理办法

    Chrome浏览器端跨域不能访问问题处理办法: 地址栏输入 chrome://flags/#block-insecure-private-network-requests 设置Block insecu ...

  5. 几种允许跨域请求的方法

    "跨域请求 Cross-Origin Resource Sharing(CORS) 被禁止"这个问题,应该很常见了,网上也有很多解释原因和解决方案的文章. 鉴于网上搜到的文章内容比 ...

  6. springboot2.4跨域配置的方法

    这篇文章主要介绍了springboot2.4跨域配置的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 1.如果只是一个简单的springbo ...

  7. Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案

    Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案 参考文章: (1)Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录 ...

  8. 利用ES6-Promise()方法封装原始jsonp实现跨域请求公用方法(告别使用JQuery封装好的jsonp)

    在项目中,经常需要用到jsonp实现跨域请求,假如使用JQuery封装好的jsonp方法,是很容易实现的,缺点:需要引入JQuery库. $.ajax({url : './package.json', ...

  9. JQuery - Ajax和Tomcat跨域请求问题解决方法!

    JQuery - Ajax和Tomcat跨域请求问题解决方法! 参考文章: (1)JQuery - Ajax和Tomcat跨域请求问题解决方法! (2)https://www.cnblogs.com/ ...

最新文章

  1. 图灵奖得主Bengio又出新论文:用强化学习提升模型泛化性!网友崩溃:idea撞车了......
  2. CVE-2016-0095提权漏洞学习笔记
  3. [转]自适应网页设计(Responsive Web Design)
  4. mysql 数据泵导入导出_【Oracle篇】约束和数据泵导入导出
  5. 单例模式在JDK应用的源码分析
  6. 全局路径规划:图搜索算法介绍3(A stars tie breaker)
  7. java循环输入_【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)...
  8. “我将 20 年前开发的操作系统迁移到 .NET 6,居然成功了”
  9. 文/有品生活(pinpinlife) 小户型家具如何摆?
  10. 什么是token以及token的原理
  11. 传奇开群服/公益服用什么服务器最好?
  12. springboot项目Banner配置
  13. 专访马云:面对股东的期待,未来如何保持阿里继续增长?
  14. timeGetTime函数用法
  15. 深度学习中的图像增强
  16. 口红试色app开发,轻松找到满意的口红色号
  17. 用 22 张照片打开 23 年
  18. ttest函数使用方法_用MATLAB做T检验(ttest)
  19. 系统分析师考试介绍(一)
  20. 怎样安装西门子PLC

热门文章

  1. svn 项目文件出现左边红色箭头,右边绿色箭头的双箭头的解决方法
  2. 全球共模扼流圈行业收入预计2028年达到9.167亿美元
  3. TFN F1 工程 高校 通信都在用的光时域反射仪
  4. 我是怎么找到电子书的
  5. 「新拟物化」过时了!此刻你最应该拥抱的是「玻璃拟物化」
  6. 路径压缩优化并查集的时间复杂度
  7. 电信行业相关指标(DOU、MOU、ARPU、ARPM)与词汇
  8. iTop-4412_开发板Linux编程之TFTP服务器学习笔记
  9. mongodb高级聚合查询
  10. 电动汽车简化设计,“减重瘦身”不再难