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 相关文章推荐
为超链接加上disabled后的故事
Dec 10 Javascript
快速排序 php与javascript的不同之处
Feb 22 Javascript
纯JS实现的批量图片预览加载功能
Aug 14 Javascript
查找iframe里元素的方法可传参
Sep 11 Javascript
jQuery实现公告文字左右滚动的实例代码
Oct 29 Javascript
Javascript this 关键字 详解
Oct 22 Javascript
Node.js 制作实时多人游戏框架
Jan 08 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
Jul 13 Javascript
vue前后分离调起微信支付
Jul 29 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
PHP4中实现动态代理
2006/10/09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
discuz目录文件资料汇总
2014/12/30 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
Jquery根据浏览器窗口改变调整大小的方法
2017/02/07 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
python程序 创建多线程过程详解
2019/09/23 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
中文系师范生自荐信
2013/10/01 职场文书
2014自主招生自荐信策略
2014/01/27 职场文书
采购经理岗位职责
2014/02/16 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android