`
mbn
  • 浏览: 23326 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

iFrame用代理(proxy)实现文档跨域通信

阅读更多
页面域关系:

主页面a.html所属域A:www.taobao.com
被iframe的页面b.html所属域B:www.alimama.com,假设地址:http://www.alimama.com/b.html

实现效果:

A域名下的页面a.html中通过iframe嵌入B域名下的页面b.html,由于b.html的宽度和高度是不可预知而且会变化的,所以需要a.html中的iframe自适应大小.

问题本质:

js对跨域iframe访问问题,因为要控制a.html中iframe的高度和宽度就必须首先读取得到b.html的大小,A、B不属于同一个域,浏览器为了安全性考虑,使js跨域访问受限,读取不到b.html的高度和宽度.

解决方案:

引入代理代理页面c.html与a.html所属相同域A,c.html是A域下提供好的中间代理页面,假设c.html的地址:www.taobao.com/c.html,它负责读取location.hash里面的width和height的值,然后设置与它同域下的 a.html中的iframe的宽度和高度.

代码如下:

a.html代码
<!--首先a.html中通过iframe引入了b.html-->
<iframe id=”b_iframe” height=”0″ width=”0″ src=”http://www.alimama.com/b.html” frameborder=”no” border=”0px” marginwidth=”0″ marginheight=”0″ scrolling=”no” allowtransparency=”yes” ></iframe>

b.html代码
<script type=”text/javascript”>
  var b_width = Math.max(document.documentElement.clientWidth,document.body.clientWidth);
  var b_height = Math.max(document.documentElement.clientHeight,document.body.clientHeight);
  var c_iframe = document.getElementById(”c_iframe”);
  c_iframe.src = c_iframe.src+”#”+b_width+”|”+b_height; //http://www.taobao.com/c.html#width|height”
}
</script>
<!–js读取b.html的宽和高,把读取到的宽和高设置到和a.html在同一个域的中间代理页面车c.html的src的hash里面–>
<iframe id=”c_iframe”  height=”0″ width=”0″  src=”http://www.taobao.com/c.html” style=”display:none” ></iframe>

c.html代码
<script type=”text/javascript”>
var b_iframe = parent.parent.document.getElementById(”b_iframe”);
var hash_url = window.location.hash;
var hash_width = hash_url.split(”#”)[1].split(”|”)[0]+”px”;
var hash_height = hash_url.split(”#”)[1].split(”|”)[1]+”px”;
b_iframe.style.width = hash_width;
b_iframe.style.height = hash_height;
</script>
a.html中的iframe就可以自适应为b.html的宽和高了.
分享到:
评论

相关推荐

    iframe 跨域解决方法

    5. **`Window.proxy`**:在`iframe`的源页面中定义一个全局函数,如`window.proxy = function(data) {...}`,然后在父页面中通过`iframe.contentWindow.proxy`调用这个函数,实现数据传递。 6. **`Window.post...

    WEB前端关于跨域问题的8种解决方案

    5. **IFrame和postMessage**:通过IFrame嵌入不同源的页面,并使用`window.postMessage`方法进行跨文档消息传递,可以实现安全的跨域通信。这种方式适用于需要交互但不涉及敏感数据的场景。 6. **代理服务器**:在...

    js 跨域解决方案

    JavaScript跨域是Web开发中一个常见的挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源(协议、域名或端口不一致...同时,对于开发环境,使用代理服务器可以方便地解决跨域问题,使得前端开发不受限制。

    windowName跨域详解.pdf

    在使用window.name属性进行跨域通信时,应当注意其安全性问题。由于window.name是全局属性,所以其存储的数据对后续页面可见,这可能会导致敏感数据泄露。幸运的是,由于windowName跨域模块在数据获取后销毁了iframe...

    详解vue-cli项目中的proxyTable跨域问题小结

    【Vue CLI 项目中的 proxyTable 跨域问题详解】 跨域是前端开发中常见的问题,源于...Vue CLI 的 `proxyTable` 是开发阶段的一个便捷工具,但在生产环境中,通常需要依赖 CORS 设置或其他服务器端代理来实现跨域通信。

    前端解决跨域问题的8种方案.docx

    以上三种方法只是跨域问题解决方案的一部分,还有诸如CORS(跨源资源共享)、JSONP、Server Proxy等更多方式,每种方法都有其适用场景和局限性。开发者应根据实际需求选择最合适的方案来解决跨域问题。

    iframe代理测试

    这个技术常用于实现页面组件的复用、内容的嵌入,甚至是跨域通信等场景。"iframe代理测试"可能是指利用iframe进行特定的网络请求或者数据传递的测试方法,尤其是当涉及到跨域策略时,代理服务器就显得尤为重要。 1....

    js前端解决跨域问题的8种方案(最新最全)

    例如,父页面通过监听hash变化,当IFrame中的页面修改hash时,可以捕获到这个变化,从而实现跨域通信。 - **CORS(Cross-Origin Resource Sharing)**:服务器通过设置响应头`Access-Control-Allow-Origin`来指定...

    【JavaScript源代码】react项目从新建到部署的实现示例.docx

    - **工具:** 使用 `iframe-resizer` 插件来实现 iframe 的自动调整大小。 - **实现:** 为了使 iframe 内容能够正确填充整个容器空间,需要在子应用中引入 `iframeResizer.contentWindow.js`,并自定义高度计算方法来...

    Web前端黑客技术揭秘(Web2Hack.org)_(i)7.6.5 跨子域:document.domain技巧1

    在Web开发中,跨域策略是一项重要的安全机制,它限制了不同源的文档或脚本之间的交互。然而,有时候为了实现特定功能,如单点登录(SSO)或资源共享,开发者会利用`document.domain`属性来打破这种限制,允许跨子域...

Global site tag (gtag.js) - Google Analytics