iframe中跨域页面访问parent的方法

iframe中跨域页面访问parent的方法javascript

跨域实例:html

如上图所示,系统www.a.com/index.html页面中嵌入一个iframe,iframe中访问不一样域的www.b.com/index.htmljava

而后b中有个按钮“保存”,想调用父页面a.com/index.html中的一个js方法saveFavorite()跨域

问题:浏览器

iframe和父页面若是是同一个域的,那问题很好办,直接parent.saveFavorite()便可。app

但问题难在是不一样域,不一样域是不容许相互访问js代码的。dom

解决方案:函数

跨域的问题,也有很多的解决方案(参考:http://blog.csdn.net/sfdev/archive/2009/02/13/3887006.aspx),这里提供一种比较优雅的方案。this

解决方案说明以下:
在AAA.com域名下的index.htm页面中内嵌了BBB.com域名下的一个页面index.htm,正常状况下iframe内部的index.htm页面是没法访问父页面index.htm中的任何dom对象或者js函数的,由于跨域,但咱们常常又须要作一些参数回传的事情怎么办呢?以上的这种实现方式就很好的解决了这个问题;spa

解决方案的关键优雅之处在于:浏览器虽然会禁止js跨域访问页面中的对象,但对于iframe的层级关系引用并无作限制,即parent仍然可用;该方案就是利用了2层内嵌iframe、使用第二级iframe中的页面与parent.parent的页面是同域名的关系,从而避免跨域问题实现两个页面间相关数据的传递,本质上就是利用parent.parent实现对父父页面中js的回调

代码:

<script type="text/javascript">
    window.onload = function () {
        moduleId = getParam("moduleId");
        conditions = getParam("conditions");
//这是就是去执行顶层父页面的js方法
        parent.parent.SaveFavorite(moduleId, "", "&conditions=" + conditions);
    }
    function getParam(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return (r[2]); return "";
    }
</script>

而后再B.com/Index.html中,在按钮单击事件中添加以下代码:

//别忘记,在index.html中添加一个隐藏的iframe,固然你也能够经过js动态建立
<iframe id="myfarme" src="#" style="display:none;"></iframe>
btnSaveApp: {
   tap: function () {
         win = this.getCdnWin();
                   
         cdt = win.getValues();
         conditions = "&conditions=" + Ext.encode(cdt);
         //这里是核心,要让该页面隐藏的这个iframe和跨域的父页面是同一个域
document.getElementById('myfarme').src="http://172.16.34.128/hzyapp/crossDomain.html?"+location.search.substring(1)+conditions; 
          }
}

这样就能够顺利在跨域的iframe中执行父页面的js方法了,并且能够传递参数,对父页面的相关元素能够任意操做了,对用户来讲是很是友好的。

相关文章
相关标签/搜索