关闭

[置顶] iframe与主框架跨域相互访问方法

标签: iframemain跨域父窗口子窗口
168794人阅读 评论(71) 收藏 举报
分类:

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 function
  function fMain(){
	alert('main function execute success');
  }

  // exec iframe function
  function exec_iframe(){
	window.myframe.fIframe();
  }
  </script>

 </head>

 <body>
  <p>A.html main</p>
  <p><input type="button" value="exec iframe function" onclick="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 function
  function exec_main(){
	parent.fMain();
  }
  </script>

 </head>

 <body>
  <p>B.html iframe</p>
  <p><input type="button" value="exec main function" onclick="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 function
  function fMain(){
	alert('main function execute success');
  }

  // exec iframe function
  function 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" onclick="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 function
  function 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" onclick="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>

执行如下图:




源码下载地址:点击查看


Tips:我已封装成类,文章地址《php main 与 iframe 相互通讯类(同域/跨域)》



11
8
查看评论

iframe跨域调用问题

iframe框架之间的函数调用 知识点:iframe同域window对象的函数调用,iframe跨域window对象的函数调用。获取页面中iframe中的window对象介于兼容性的问题,推荐使用contentWindow属性获取iframe中的window对象。
  • stopllL
  • stopllL
  • 2017-04-11 19:49
  • 4258

利用domain+iframe跨域

此方法行得通的前提是,不同的域有公共域部分。 我在wamp中配置了两个域名 www.newDomain.com; www.script.newDomain.com; 他们的公共域为newDomain.com;下面是具体步骤以及代码: 1. 首先我们要在两个不同域的文档里都设置document.d...
  • mzzzzq
  • mzzzzq
  • 2016-04-14 19:37
  • 3109

iframe 通信和跨域通信

几年前页面里使用iframe嵌套使用的还是很多的。 以下是多种使用方法: 1、同域下嵌套: 父页面: window.onload=function(){ //父页面修改iframe var docu=document.querySelector('#iframe2'...
  • starwmx520
  • starwmx520
  • 2016-06-06 15:01
  • 1714

iframe跨域通信的通用解决方案-第二弹!(终极解决方案)

转自:http://justcoding.iteye.com/blog/2026396 iframe跨域通信的通用解决方案-第二弹!(终极解决方案) 一年前,我发过一篇关于跨文档通信方案的文章《iframe跨域通信的通用解决方案》,提供了一种基于创建iframe与...
  • danfeixia
  • danfeixia
  • 2016-11-23 15:37
  • 1098

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

iframe 与主框架相互访问方法 1.同域相互访问 假设A.html 与 b.html domain都是localhost (同域) A.html中iframe 嵌入 B.html,name=myframe A.html有js fun...
  • menghuannvxia
  • menghuannvxia
  • 2017-08-02 10:23
  • 246

利用代理页面解决html iframe跨域访问网站问题

原文:利用代理页面解决html iframe跨域访问网站问题 源代码下载地址:http://www.zuidaima.com/share/1854884509142016.htm 在做项目的时候遇到跨域问题,经过自己的一番摸索终于找到一种解决iframe跨域问题的方案,或许很...
  • yaerfeng
  • yaerfeng
  • 2016-11-15 09:57
  • 5669

完美解决iframe跨域问题

  • 2016-04-18 14:37
  • 237KB
  • 下载

JavaScript实现内嵌的iframe跨域调用父页面js方法

源码下载 功能说明:http://www.yf3.com/admin.html嵌套页面http://www.yf4.com/customer.html,http://www.yf4.com/customer.html调用http://www.yf3.com/admin.html中的js方法,在...
  • qq285679784
  • qq285679784
  • 2017-06-12 10:40
  • 3476

iframe 跨域

方法一: window.name 跨域: 原理:name 在浏览器环境中是一个全局window对象的属性,在一个窗口中赋了window.name之后,无论怎么刷新该窗口其window.name属性都不会变。但window.name 属性仅对相同域名的 iframe 可访问。因此我们可以在异域目...
  • u013372487
  • u013372487
  • 2016-09-02 16:10
  • 568

Uncaught DOMException: Blocked a frame with origin "null" from accessing a cross-origin frame.

代码如下: /*window.frames[]可以通过下标或名称访问单独的frame*/ window.onload=function(){ var h1=window.frames["header"];//.document.getElementsByTagName(&...
  • MBLHQ
  • MBLHQ
  • 2017-04-29 11:43
  • 17859
    微博
    微信公众号
    微信分享公众平台-破晓领域
    破晓领域
    微信号:fdipzone-idea
    名称:破晓领域

    个人资料
    • 访问:7818716次
    • 积分:46031
    • 等级:
    • 排名:第81名
    • 原创:295篇
    • 转载:24篇
    • 译文:0篇
    • 评论:511条
    博客专栏
    最新评论