javascript iframe跨域详解


Posted in Javascript onOctober 26, 2016

1.什么引起了ajax跨域不能的问题

ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告。

2.有什么完美的解决方案么?

没有。解决方案有不少,但是只能是根据自己的实际情况来选择。

具体情况有:

一、本域和子域的相互访问: www.aa.com和book.aa.com
二、本域和其他域的相互访问: www.aa.com和www.bb.com 用 iframe
三、本域和其他域的相互访问: www.aa.com和www.bb.com 用 XMLHttpRequest访问代理
四、本域和其他域的相互访问: www.aa.com和www.bb.com 用 JS创建动态脚本

解决方法:

一、如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和iframe里面都加上document.domain = "aa.com",这样就可以统一域了,可以实现跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了。(这个办法我没有尝试,不过理论可行)

二、当两个域不同时,如果想相互调用,那么同样需要两个域都是由你来开发才可以。用iframe可以实现数据的互相调用。解决方案就是用window.location对象的hash属性。hash属性就是http://domian/web/a.htm#dshakjdhsjka 里面的#dshakjdhsjka。利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信。不过除了IE之外其他大部分浏览器只要改变hash就会记录历史,你在前进和后退时就需要处理,非常麻烦。不过再做简单的处理时还是可以用的,具体的代码我再下面有下载。大体的过程是页面a和页面b在不同域下,b通过iframe添加到a里,a通过JS修改iframe的hash值,b里面做一个监听(因为JS只能修改hash,数据是否改变只能由b自己来判断),检测到b的hash值被修改了,得到修改的值,经过处理返回a需要的值,再来修改a的hash值(这个地方要注意,如果a 本身是那种查询页面的话比如http://domian/web/a.aspx?id=3,在b中直接parent.window.location是无法取得数据的,同样报没有权限的错误,需要a把这个传过来,所以也比较麻烦),同样a里面也要做监听,如果hash变化的话就取得返回的数据,再做相应的处理。

三、这种情形是最经常遇到的,也是用的最多的了。就是www.aa.com和www.bb.com你只能修改一个,也就是另外一个是别人的,人家告诉你你要取得数据就访问某某连接参数是什么样子的,最后返回数据是什么格式的。而你需要做的就是在你的域下新建一个网页,让服务器去别人的网站上取得数据,再返回给你。domain1下的a向同域下的GetData.aspx请求数据,GetData.aspx向domain2下的 ResponseData.aspx发送请求,ResponseData.aspx返回数据给GetData.aspx, GetData.aspx再返回给a,这样就完成了一次数据请求。GetData.aspx在其中充当了代理的作用。具体可以看下我的代码。

四、这个和上个的区别就是请求是使用<script>标签来请求的,这个要求也是两个域都是由你来开发才行。原理就是JS文件注入,在本域内的a 内生成一个JS标签,它的SRC指向请求的另外一个域的某个页面b,b返回数据即可,可以直接返回JS的代码。因为script的src属性是可以跨域的。具体看代码,这个也比较简单。

在父窗口中获取iframe中的元素

格式:window.frames["iframe的name值"].document.getElementById("iframe中控件的ID").click(); 
实例:window.frames["ifm"].document.getElementById("btnOk").click();

格式:  

var obj=document.getElementById("iframe的name").contentWindow; 
var ifmObj=obj.document.getElementById("iframe中控件的ID"); 
ifmObj.click(); 
实例: 
var obj=document.getElementById("ifm").contentWindow; 
var ifmObj=obj.document.getElementById("btnOk"); 
ifmObj.click();

 在iframe中获取父窗口的元素

格式:window.parent.document.getElementById("父窗口的元素ID").click(); 
实例:window.parent.document.getElementById("btnOk").click();

jquery

在父窗口中获取iframe中的元素

格式:$("#iframe的ID").contents().find("#iframe中的控件ID").click();//jquery 方法1 
实例:$("#ifm").contents().find("#btnOk").click();//jquery 方法1
格式:$("#iframe中的控件ID",document.frames("frame的name").document).click();//jquery 方法2 
实例:$("#btnOk",document.frames("ifm").document).click();//jquery 方法2

  在iframe中获取父窗口的元素

格式:$('#父窗口中的元素ID', parent.document).click(); 
实例:$('#btnOk', parent.document).click();

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript cookie解码函数(兼容ff)
Mar 17 Javascript
javascript 对表格的行和列都能加亮显示
Dec 26 Javascript
关于删除时的提示处理(确定删除吗)
Nov 03 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
Jan 08 Javascript
jquery实现的Accordion折叠面板效果代码
Sep 02 Javascript
关于JS中prototype的理解
Sep 07 Javascript
Javascript基础_嵌入图像的简单实现
Jun 14 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
Dec 16 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
BootStrap与Select2使用小结
Feb 17 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
Oct 26 #Javascript
jQuery的ready方法实现原理分析
Oct 26 #Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 #Javascript
BootStrap tab选项卡使用小结
Aug 09 #Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 #Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 #Javascript
BootStrap modal模态弹窗使用小结
Oct 26 #Javascript
You might like
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
NestJs 静态目录配置详解
2019/03/12 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
详解Vite的新体验
2021/02/22 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
Python科学计算包numpy用法实例详解
2018/02/08 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
python实现代码统计程序
2019/09/19 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
个人职业生涯规划书1500字
2013/12/31 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
计算机系本科生求职信
2014/05/31 职场文书
公司离职证明样本
2014/09/13 职场文书
2014年科室工作总结
2014/11/20 职场文书
小学同学聚会感言
2015/07/30 职场文书
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python