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对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 Javascript
js触发asp.net的Button的Onclick事件应用
Feb 02 Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 Javascript
js获取ip和地区
Mar 10 Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 Javascript
Vue 去除路径中的#号
Apr 19 Javascript
Vue2.0 v-for filter列表过滤功能的实现
Sep 07 Javascript
详解Vue前端对axios的封装和使用
Apr 01 Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 Javascript
原生JS实现拖拽效果
Dec 04 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中使用正则表达式提取中文实现笔记
2015/01/20 PHP
php表单提交实例讲解
2015/11/12 PHP
如何在PHP中生成随机数
2020/06/04 PHP
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Python 模板引擎的注入问题分析
2017/01/01 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python ubplot使用方法解析
2020/01/10 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
美国旅游网站:Tours4Fun
2017/02/17 全球购物
前台领班岗位职责
2013/12/04 职场文书
楼面经理岗位职责范本
2014/02/18 职场文书
剪彩仪式主持词
2014/03/19 职场文书
岗位职责说明书
2014/05/07 职场文书
美食节目策划方案
2014/05/31 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
Django与数据库交互的实现
2021/06/03 Python
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
解决MySQL报“too many connections“错误
2022/04/19 MySQL
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python