`

跨域问题 iframe跨域名js调用

阅读更多

 

转载于:http://hi.baidu.com/zhouyazun/blog/item/dcce7695803386007af4807e.html
先说明一点:我说的某某域名在您的控制下的意思是这个域名下的网页由您来负责开发内部的JavaScript
场景一:将bbs.xxx.com的页面用iframe嵌入到www.xxx.com的中,如何在iframe内外使用js通信(转帖请注明出处:http://blog.csdn.net/lenel)
一级域名都是xxx.com 这个域名一定是在您的控制下,所以你只要在两个页面中同时升级域名即可
在父窗口和iframe内部分别加上js语句:document.domain="xxx.com";
之后2个页面就等于在同一域名下,通过window.parent oIframe.contentDocument就可以相互访问,进行无障碍的JS通信
在新浪、淘宝等很多页面都能找到这样的语句。不过document.domain不可以随便指定,只能向上升级,从bbs.xxx.com升级到yyy.com肯定会出错

场景二:将www.yyy.com的页面用iframe嵌入到www.xxx.com的中,两个域名都在您的控制下,如何在iframe内外进行一定的数据交流(转帖请注明出处:http://blog.csdn.net/lenel)
你可以通过相互改变hash值的方式来进行一些数据的通信

这里的实现基于如下技术要点:
1、父窗口通过改变子窗口的src中的hash值把一部分信息传入,如果src只有hash部分改变,那么子窗口是不会重新载入的。
2、子窗口可以重写父窗口的location.href,但是注意这里子窗口无法读取而只能重写location.href所以要求前提是您控制两个域名,知道当前父窗口的location.href是什么并写在子窗口内,这样通过parent.location.href = "已知的父窗口的href"+"#"+hash。这样父窗口只有hash改变也不会重载。
3、上面两步分别做到了两个窗口之间的无刷新数据通知,那么下面的来说如何感知数据变化。标准中没有相关规定,所以当前的任意浏览器遇到location.hash变化都不会触发任何javaScript事件,也就是说您要自己写监听函数来监视loaction.hash的值的变化。做法是通过setTimeout或者setInterval来写一个监听函数每20-100ms查看一下hash是否变化,如果变化了驱动js根据新的数据做想做的事情。

这种实现的一些分析:
1、信息通道是双向的,当然会兼容单向,如果只是父窗口向子窗口通知数据,只需要子窗口写hash监听,反之亦然。
2、局限性也是颇大,因为这种通信的前提是双方知道对方的location.href。如果父窗口带有动态的location.search也就是查询参数,那么子窗口的处理上就比较困难,需要把父窗口的location.search作为传递信息的一部分告知子窗口。
3、另外的困扰会有浏览器带给你,IE之外的浏览器遇到hash的改变会记录历史,这样你在处理前进后退的时候会非常头疼


场景三:将www.yyy.com的页面用iframe嵌入到www.xxx.com的中,只有被嵌入的yyy.com在您的控制下,如何在iframe内外进行一定的交流(转帖请注明出处:http://blog.csdn.net/lenel)
真实场景:google adsence的一个需求,你希望google发现您的页面不能匹配出相关性非常好的按点击付费广告时,你希望google的广告iframe能够隐藏。
google的广告iframe在google域下显然不能把自己隐藏掉,那么怎么办呢?
1、google会提供给你一个html页面
2、您将这个页面放置在您的域名下,并告诉google它的位置
3、当google发现没有很好的广告时,会将子窗口的loaction重定向到您的那个页面下,这样您的页面因为同域名就可以访问父页面来隐藏自己了
是不是很巧的方法?

场景四:您是内容发布商,如何改造接口,让其他域名下的页面可以从浏览器端出发获得您的数据

我们知道ajax的xmlHttpRequest()说到底是一个无刷新请求服务器数据的辅助工具,但是xmlHttpRequest并不能跨域名请求数据,在某些情况下成了极大的限制。
但是我们如果通过其他方式完成无刷新请求数据不也可以么,我们用Dom方法操作动态JS脚本请求来做这件事。
    //创建一个脚本节点
    var oScript = document.createElement('script');
    //指定脚本src src可以指向任意域名 
    //注意src不再指向静态js,而是带着查询参数指向一个动态脚本广播服务。
    oScript.src = "http://yyy.com/query.php?"+yourQueryString;    
    //如果指定了charset 同时还可以解决xmlHttpRequest另一大困扰 乱码问题                                                                                                                            
    //oScript.charset = "utf-8";
    //通过Dom操作把这个新的节点加入到文档当中                                  
    document.getElementsByTagName("head")[0].appendChild(oScript);

这样只要query.php的输出是可执行的javaScript脚本,比如:djsCallBack({jsondata});
当他从服务器返回后就会自动执行,你可以方便的用json方式来做数据传递了。
要注意,您的脚本请求最好带上时间戳,避免浏览器缓存造成取回数据实时性下降。

如果您是数据提供者,您可以要求数据索取者在查询参数中提供回调函数名,比如query.php?callback=myDataHandler&key=...?
这样您就可以根据参数来提供给他myDataHandler({jsondata}),这样不同的数据索取者都会得到自定义的正确的异步回调。

进一步发展,可以做一个统一的从xml到动态json的数据转化服务器,脱离数据的实际意义,针对任何xml接口都可以作为转化后提供给客户端直接访问。
这样就不用针对单独xml数据服务,为了跨域名而做各自的后台数据抓取转化服务。

用动态脚本传数据功能非常强大,去年我最先在YAHOO的站点上看到这样的应用,让人眼前一亮。

总结总结
第一种场景,相应的处理办法有这非常好的效果,可以说完全解决了问题。
第二种场景,相应的处理办法具有一定的跨域数据交流功效,具有相当大的局限,并不适合在复杂业务流程中应用,实际上我也确实也没看到过基于此的大规模应用。
第三种场景,相应的处理办法比较巧妙,虽然redirect之后就不干你什么事了,但如果你是google一样面向众多域名的内容提供商,也是个不错的解决思路。
第四种场景,相应的处理办法非常强大,对比Ajax可以看到,跨域名没问题,无刷新没问题,本身又是异步的,JSON比xml快的多,同时解决乱码问题,只是请求都是Get方式的,不能做Post方式的请求。多一种武器自然可以从容选择了。

 

------想法:可以通过ajax访问本站的一个页面程序,比如get163Page.aspx,在这个页面程序里面,含下载某个其他域名页面的数据,则通过这种方式间接的AJAX获取其他站点的数据。。呵呵。。欢迎探讨

分享到:
评论

相关推荐

    解决JS跨域访问IFrame的解决方案

    "解决JS跨域访问IFrame的解决方案"这一主题关注的就是如何克服这个限制,使得在JSP页面中嵌入的跨域IFrame能够正常通信。下面我们将详细探讨这个问题以及可能的解决方案。 首先,理解同源策略是关键。同源策略是...

    iframe 跨域解决方法

    然而,由于浏览器的同源策略限制,当`iframe`加载的页面与包含它的页面不在同一个域名下时,就会遇到跨域问题。这篇博客将深入探讨如何解决`iframe`的跨域问题。 首先,理解同源策略是至关重要的。同源策略是浏览器...

    iframe跨域调用父窗口js.zip

    要解决iframe跨域调用父页面js方法的问题,我们可以利用以下几种技术: 1. **HTML5的postMessage和message事件**:这是现代浏览器支持的一种跨域通信方式。在iframe中,我们可以使用`window.parent.postMessage...

    javascript插件 解决双向跨域问题

    在JavaScript编程中,跨域(Cross-Origin)是一个常见的问题,特别是在Web开发中,当尝试从一个源(如一个域名、协议或端口)加载资源到另一个源时,浏览器的安全策略通常会阻止这种行为,以防止恶意脚本从不受信任...

    layer弹窗:top.layer弹窗到父页面跨域解决办法

    如果一个请求的源(协议+域名+端口)与目标资源的源不一致,就会触发跨域问题。跨域问题在进行页面交互、数据获取等方面都会造成阻碍。 为了解决这个问题,HTML5引入了**postMessage** API。`window.postMessage()`...

    js跨域解决方案

    本文将深入探讨JS跨域的解决方案,帮助开发者理解并解决这个问题。 首先,我们需要了解什么是同源策略。同源策略是浏览器为了保护用户数据安全而实施的一项机制,它限制了来自不同源的脚本之间进行交互。然而,这在...

    iframe跨域互相调用资源

    本示例“iframe跨域互相调用资源”提供了一个解决方案,它着重展示了如何通过`iframe`实现在不同源之间进行通信,并且处理了浏览器兼容性问题,特别是对较老版本的IE浏览器(至少支持到IE8)的支持。 首先,`iframe...

    iframe跨域访问示例

    为了解决iframe跨域访问的问题,Web开发中引入了几种解决方案: 1. **CORS(Cross-Origin Resource Sharing)**:这是一种服务器端的方法,允许特定的资源被其他域的页面访问。通过设置HTTP响应头`Access-Control-...

    js跨域问题解决方案.

    JavaScript跨域问题,是Web开发中常见的一个挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源的资源,这在实现某些功能时会带来不便。本文将深入探讨JavaScript跨域问题的原因、影响以及多种解决方案...

    前端后端跨域问题

    - **不同源定义**:当请求的源(域名、端口、协议、IP)与当前页面不一致时,就会触发跨域问题。 - **XMLHttpRequest对象**:在使用XMLHttpRequest对象发送HTTP请求时,如果目标源与当前页面源不一致,则该请求会被...

    在iframe中调用js父页面和子页面方法

    总结,`iframe`中的JavaScript交互涉及到页面间的通信,无论是父页面调用子页面还是子页面调用父页面,都需要理解`window`对象、同源策略以及跨域通信机制。正确使用这些技术,可以在多页面应用中实现更复杂的功能...

    js实现iframe跨页面调用函数的方法

    在JavaScript中,实现iframe跨页面调用函数是一个常见的需求,特别是在构建复杂的Web应用程序时。当一个页面(父页面)嵌入了另一个页面(子页面)作为iframe时,有时需要在两个页面之间通信,调用各自的功能。下面...

    同级iframe间的函数调用

    标题“同级iframe间的函数调用”涉及的是如何在不同`iframe`之间共享数据和交互,这是跨域安全策略下实现页面间通信的一种方式。 在同一个域名下,`iframe`可以相互访问,这是因为它们被视为同一源(same-origin ...

    jQuery实现跨域iframe接口方法调用

    在Web开发中,由于同源策略的限制,不同域名下的页面之间无法直接进行JavaScript通信,这包括了嵌入在一个页面中的iframe。然而,在某些场景下,我们确实需要实现这种跨域通信,例如页面A(www.a.com)嵌入了页面B...

    js 跨域解决方案

    JavaScript跨域是Web开发中一个常见的挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源(协议、域名或端口不一致)的资源,这在开发过程中可能会造成诸多不便。本文将深入探讨JavaScript跨域问题及其...

    js-iframe-传值调用实例代码

    这个实例代码“js-iframe-传值调用”旨在演示如何通过JavaScript在父窗口和iframe之间传递数据,实现页面间的交互。我们将详细探讨这个过程中的关键知识点。 首先,我们要理解iframe的基本结构。一个iframe标签通常...

    iframe兄弟页面相互调用

    - **同源策略:** 由于浏览器的安全限制,只有同源(协议、域名、端口相同)的`iframe`才能互相访问对方的DOM和JavaScript对象。如果跨源,只能使用`postMessage`进行通信。 - **事件冒泡:** `iframe`内的事件不会...

    解决iframe跨域高度自适应问题的源码

    然而,当iframe加载的页面与包含它的页面属于不同的域名时,就会出现跨域问题,这可能导致一系列限制,如无法获取iframe内容的高度,从而影响页面布局和用户体验。本篇文章将深入探讨如何解决iframe跨域高度自适应的...

    父窗口调用iframe子窗口方法

    在Web开发中,"父窗口调用iframe子窗口方法"是一个常见的交互场景,尤其是在构建复杂的单页面应用或者需要跨窗口通信时。这篇文章将详细讲解如何实现这个功能,并提供相关的源码示例。 首先,理解基本概念。`iframe...

Global site tag (gtag.js) - Google Analytics