`
gezhonglei2007
  • 浏览: 2036 次
文章分类
社区版块
存档分类
最新评论

iframe跨域javascript访问

 
阅读更多
问题抽提主页A.html在域www.aaa.com中,要用Ifame嵌入在域www.bbb.com中的B.html网页。现在需要让B.html中进行某一操作之后,调用A.html中的js函数onExcute。如果进行一般的操作在B.html中使用"window.parent.onExcute();"调用根本不会被执行,也不提示错误,在调试时会得到"Permissiondenied to access property"的提示信息。如果是在同域的两个页面这么使用没有问题,但是在跨域环境下就会出现这样的情况,这就是所谓的“iframe跨域问题"。

在A.html中

<script type="text/javascript">
function onExcute(wellStr){ 
//事件响应               
}</script>  

<iframe id="bFrameId" src="http://www.bbb.com/B.html" width="100%" height="100%"></iframe> 



在B.html中的某一事件响应函数中,需要调用A.html中onExcute(……)方法。

问题分析:

(1)A.html与B.html跨域,在B.html使用window.parent.onExcute(……),会因跨域访问,受浏览器“强制”限制。

(2)网上很解决“iframe高度自适应”的解决方法,都通过B.html的window的location是可以公共访问的,location.hash用来存放需要需要传递的参数。但是本问题是方法调用,需要触发js函数的调用,而不仅仅是参数的获取。基于此也有极差的解决办法是,监测B.html中location.hash值的变化,在A.html中写一函数定时检测(如一秒钟)此值,一旦B.html中响应事件之后将参数放于location.hash中,那么A.html在周期内会检测到此值的变化。

(3)网上还有解决解决方法:其一是欺骗法,两个网页document.domain尽管不一样,可以强制使值一样为“aaa.com",以此达到欺骗IE的目的(其它浏览器不一定起效)。不适用于原因主页面使用大量的脚本框架,会影响其它部分功能的使用。其二是"同域iframe无限制“的方法,就是由于跨域脚本中对parent访问iframe的属性无限制。就是在B.html中再嵌入iframe(内容是来自与A.html同域的网页C.html),特别适用于解决高度自适应的问题(C.html可以直获取B.html的iframe宽高信息,而A.html与C.html是同域的,可以js函数调用不会受限)。

但是,仍然无法实现事件的即时触发。

解决方案:结合以上两种方法(location.hash存储参数,同域iframe脚本调用无限制)

(1)在B.html中触发事件(例如函数btnEvent())中,修改C.html的location.href。其中的hash是url后面的从"#"开关的部分,用于存储参数,hash值的改变不影响iframe的刷新;而url后面的参数"redirected=true"用于修改url(实际上还是本页),主要用于触发cFrame重新加载(即C.html中的window.onload事件)

function btnEvent(){
var str = 'well_1,well_2';
//注意: frames获取C.html的frame时, cFrameId 是iframe的name属性
//其中‘redirected=true’故意添加参数,强迫C.html的页面刷新,响应onload事件
document.getElementById('cFrameId').setAttribute('src', 'http://www.aaa.com/C.html?redirected=true' + '#' + str);
}
<iframe id="cFrameId" name=' cFrame' src="http://www.aaa.com/C.html" style="display: none"></iframe>


(2)在C.html中,使用页面加载过程中响应事件,通过url的参数判断当前加载是否是B.html的操作引起的,如果是,则需要马上响应A.html中的onExcute()函数,然后需要再次刷新当前页,来恢复url中的无参状态,以保证B.html中通过修改url能够再次触发C.html刷新页面加载onload事件。

window.onload = function(){
var url = window.location.href;
if(url.indexOf('redirected=true') > -1){              
var str= location.hash;      //以#开头的信息
if(str.length > 1){
str= str.substring(1);
}
window.parent.parent.onExcute(str);
window.location.href = 'http://www.aaa.com/C.html';    //恢复状态,以方便B.html再次响应事件
}
}

总结:在B.html中能够调用A.html中的js函数的根本原因,是B.html能够控制其内嵌iframe(cFrame)的location,从而导致其内嵌iframe(因刷新页面)触发的onload事件。而从B.html传递的参数,则是通过url后缀加(以"#"开开头的)hash值来实现的,实际上,也可以不用hash,(既然用到了参数,何不用两个参数呢?)用两个url参数就可以,一个用来表示状态(如上面的"redirected=true"),一个用来传递B.html要调用A.html中js函数的参数(用来替换上面在url后面缀加hash值用来传参的方法)。同理,如果反过来,希望A.html调用B.html中的js函数,则需要通过修改bFrame(B.html所在的iframe)中location,来触发B.html的加载,在onload时通过url参数来判断是否该调用此B.html中的js函数。这样做可以解决这样的问题,但缺陷是B.html刷新太频繁,每次调用都需要刷新B.html两次。

分享到:
评论

相关推荐

    javascript iframe跨域详解

    1.什么引起了ajax跨域不能的问题 ...二、本域和其他域的相互访问: www.aa.com和www.bb.com 用 iframe 三、本域和其他域的相互访问: www.aa.com和www.bb.com 用 XMLHttpRequest访问代理 四、本域和其他域的相

    cross-domain:通过三层Iframe嵌套实现JS跨域访问

    使用在iframe中内嵌一个动态生成的指向与父页面同域的iframe实现跨域文件列表A域(父页面)中的文件cross_domain_transfer.html 实现跨域的关键文件,B域要指向的目标跨域跳转页面URL ;Parent.html A域示例页面,...

    iframe跨域通信封装详解

    iframe跨域通信 查看演示 源码下载 众所周知,由于前端javascript对跨域访问做了安全限制,javascript只能访问与包含它的文档在同一域下的内容。 用法举例: 需求是在http://www.demo.org/top.html中通过iframe...

    asp.net结合html,javascript实现无刷新跨域数据提交

    在本文中,我们将使用HTML的iframe元素和JavaScript来实现跨域数据提交。首先,在A域中,我们创建一个HTML页面a.html,其中包含一个iframe元素,指向B域中的main.aspx页面。main.aspx页面中包含两个iframe元素,一个...

    用iframe设置代理解决ajax跨域请求问题

    简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。 方案:在服务器端创建一个静态的...

    前端常见跨域解决方案(全).mht

    2、 document.domain + iframe跨域 3、 location.hash + iframe 4、 window.name + iframe跨域 5、 postMessage跨域 6、 跨域资源共享(CORS) 7、 nginx代理跨域 8、 nodejs中间件代理跨域 9、 WebSocket...

    javascript iframe parent?

    NULL 博文链接:https://bozch.iteye.com/blog/2005518

    js实现跨域访问的三种方法

    javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档属性,下面将列出三种实现javascript跨域方法: 1.基于iframe实现跨域 基于iframe实现的跨域要求两个域...

    JavaScript同源策略和跨域访问实例详解

    本文实例讲述了JavaScript同源策略和跨域访问。分享给大家供大家参考,具体如下: 1. 什么是同源策略 理解跨域首先必须要了解同源策略。同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。 何谓同源: URL由...

    跨域 iframe 实例 (Cross-Domain Javascript execution library)

    NULL 博文链接:https://justcoding.iteye.com/blog/1374728

    AJAXCDR:利用 Flash 完美解决 JavaScript 和 AJAX 跨域 HTTP POST/GET 表单请求

    JavaScript 和 AJAX 跨域访问分为两大类,一是本域和子域的交互,二是本域和其他域的交互。  一、本域和子域的交互:www.s135.com 和 blog.s135.com  二、本域和其他域的交互:blog.s135.com 和 api.bz  本域和...

    海康威视h5player.js 2.0版 跨域隔离

    海康威视h5player.js 2.0版 跨域隔离

    cross-domain:一个利用html5的跨域api postMessage解决多iframe跨域通信的框架

    cross-domain一个利用html5的跨域api postMessage解决多iframe跨域通信的js框架背景最初公司只有一个系统来做销售,随着公司业务越来越多,搭建很多类似的系统(这些系统本来是没有任何关系的,每个系统目前都非常...

    详解JavaScript跨域总结与解决办法

    JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。这里把涉及到跨域的一些问题简单地整理一下: 首先什么是跨域,简单地理解就是因为...

    javascript跨域方法、原理以及出现问题解决方法(详解)

    javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档属性,下面将列出三种实现javascript跨域方法: 1.基于iframe实现跨域  基于iframe实现的跨域要求两个域...

    JavaScript实现iframe自动高度调整和不同主域名跨域

    又例如第三方网站使用了瀑布流插件,要滚动加载自动计算高度,那么先说跨域:iframe主域名不同跨域方法,假如网站 A.com B.com A 里面放入一个iframe 引用了B.com,这种情况下B.com里面的Js是无法访问到A.com的。...

    origin-storage:跨域访问的同源存储(IndexedDBWebSQLlocalStorage)

    一个用于跨域访问的同源存储,它基于localForage,并支持IndexedDB,WebSQL和localStorage。 origin-storage在不支持IndexedDB或WebSQL的浏览器中使用localStorage。 并且不支持Safari。 目录 动机 当不同的网站域...

Global site tag (gtag.js) - Google Analytics