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


Posted in Javascript onSeptember 14, 2017

1.同域相互访问

假设A.html 与 b.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。如下图

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

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

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

2.跨域互相访问

假设 A.html domain是 localhost, B.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>

执行如下图:

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

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

源码下载地址:点击查看

Javascript 相关文章推荐
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
Jul 21 Javascript
JavaScript写的一个DIV 弹出网页对话框
Aug 14 Javascript
JavaScript使用concat连接数组的方法
Apr 06 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
Sep 23 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
Apr 25 Javascript
JavaScript 中使用 Generator的方法
Dec 29 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
jQuery实现的两种简单弹窗效果示例
Apr 18 jQuery
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 Javascript
微信小程序自定义联系人弹窗
May 26 Javascript
React配置子路由的实现
Jun 03 Javascript
VsCode插件整理(小结)
Sep 14 #Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
Sep 14 #Javascript
vue 计时器组件的实现代码
Sep 14 #Javascript
详解tween.js的使用教程
Sep 14 #Javascript
JS库之wow.js使用方法
Sep 14 #Javascript
JavaScript正则表达式和级联效果
Sep 14 #Javascript
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 #Javascript
You might like
PHP大转盘中奖概率算法实例
2014/10/21 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
Yii框架安装简明教程
2020/05/15 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
基于Vue单文件组件详解
2017/09/15 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
使用Python对SQLite数据库操作
2017/04/06 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
python挖矿算力测试程序详解
2019/07/03 Python
利用python画出AUC曲线的实例
2020/02/28 Python
django 读取图片到页面实例
2020/03/27 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
留学经费担保书
2014/05/12 职场文书
助理政工师申报材料
2014/06/03 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
python实现socket简单通信的示例代码
2021/04/13 Python
golang特有程序结构入门教程
2021/06/02 Python
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android