`
mllongze
  • 浏览: 82696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Cross Frame 与不同域进行交互

 
阅读更多
为何要用不同网域的 Iframe?
   通常较具规模的网站,会考虑这样的安全性问题:当要使用到第三方所提供的 JavaScript 时,得放置在与页面完全不同网域的 Iframe 中。例如在 Yahoo! 工作时,生活+ 与 UrMap 合作的地图就是放在另一个网域的 Iframe 中的。若不这样子做,UrMap 网站的 JavaScript 可以随时窜改 Yahoo! 网页的内容、甚至危害到使用者。

用不同网域的 Iframe 来放置第三方程式码的情形,简单来说就是:「我不信任你的程式、但我需要你的程式成为我网页中的一部分功能」(除了 Iframe,另外还有 ADSafe、Caja、Flash 等方式可以做到,但后三者都有一定的门槛。)

Same Origin Policy
   将第三方网页或程式码、用不同网域的 Iframe 放到你的网页上是一件非常简单的事情 (<iframe src="xxx"></iframe> 人人都会用)。但问题在于当两者网域不同时,JavaScript 是没有办法透过 parent, window.frames, top, opener 等方式存取的。这就是所谓 Same Origin Policy 的限制。

不能互动,就缺乏了弹性与应用的机会。例如刚刚提到 Yahoo! 生活+ 与 UrMap 的合作,生活+ 这边会希望在页面上点选了「餐厅」的连结时、就用 AJAX 取得伺服器的餐厅经纬度资讯、传递到放置地图不同网域的 Iframe 中、Iframe 接到讯息后就以 UrMap API 动态更新网页地图上的座标点。而这样的行为也会因 Same Origin Policy 无法直接达成。

Cross Document Messaging
    WHATWG 提出了 Cross Document Messaging(也是 HTML 5 的 Web Messaging)来解决此一问题。简单来说,你可以丢任何 String 到任何你网页上的 Window 物件,但是该 Window 物件要不要处理此 String,就是它自己的判断(会一併提供来源 Window 的 domain)。范例程式码如下:

A 网页 (http://yahoo.com/a.html) 放置了一个 name=urmap 的 iframe:

<iframe name="urmap" src="http://yahoomashup.com/urmap.html"></iframe>


A 网页想要传递 Hello World 的讯息给此 Iframe:

<script>
/* 我是 yahoo.com */
window.frames['urmap'].postMessage("Hello World!", "*");
</script>


Iframe 裡的 B 网页 (http://yahoomashup.com/urmap.html) 可以这样接到资料:
/* 我是 yahoomashup.com */
window.onmessage = function (e) {
    if (e.origin == "yahoo.com") { // 当来自 yahoo.com 时...
        alert(e.data); // 显示 "Hello World!"
    }
}


好消息是目前大多数的主流浏览器支援此方式,包括 Firefox 3, Google Chrome, Opera, IE8, IE9 皆可。坏消息则是 IE6 与 IE7 没有此功能。

Iframe In Iframe Hack

    如果此主题有任何 A-Grade 浏览器无法使用,那也没写这篇文章的必要。只提供半套作法就逊掉了(这也是我对大多数 HTML 5 的新技术感到冷感的原因,IE[6-8] must die 也只是开发者肝苦下喊爽的产物,现实世界是不能不管 IE 的使用者的)其实早在 2007 年就有一些非正规 Cross Frame 的解法。这篇文章是目前解说最详细的作法:Cross-Domain Communication with IFrames

其实原理相当简单,就是当 A 网页要传递讯息给 B 网页的(在 Iframe 中)时,先动态产生一个与 B 网页同网域的 Iframe,此动态 Iframe 内的 JavaScript 即可利用 window.frames 取得 B 网页及做任何修改。另外还可透过修改生成 Iframe 中的 URL hash (#)、让 JavaScript 可以依照不同参数做动作。这个作法的缺点是,你必须另外在接收端的网域放置一支 Proxy 的 HTML 档、作为动态 Iframe 的网址。

YAHOO.util.CrossFrame 函式库 (YUI2)


虽然原理很简单,但是要能够有系统的沟通、写程式就是一大挑战了、中间的小细节其实是很多的。幸好 Yahoo! 的前端工程师 Julien Lecomte 用 YUI 2 写了一个 CrossFrame Utility。

YAHOO.util.CrossFrame.send(
    "http://www.y.com/proxy.html",
    "frames['mashup']",
    "message"
);

YAHOO.util.CrossFrame.onMessageEvent.subscribe(
    function (type, args, obj) {
        var message = args[0];
        var domain = args[1];
        // Do something with the incoming message...
    }
);


   看到了吗?这边其实就是用 YAHOO.util.CrossFrame.send() 取代 HTML5 的 window.postMessage()、用 YAHOO.util.CrossFrame.onMessageEvent 取代 window.onmessage 事件。单一 API 介面、所有浏览器都能用!

用 YUI 3 改写为 Y.CrossFrame

    因为公司内用的是 YUI 3,有时间的话当然希望改写。另外就是 Julien 当时写那篇文章的时间点是 2007 年,postMessage 只有 Opera 有实作,所以 Julien 对于 Opera 以外浏览器都採用 Iframe in Iframe 的作法,效能差上许多。也因此我改为以 postMessage 为主、Iframe in Iframe 为辅的作法较有效率。

Y.CrossFrame.postMessage(
    "Hello World!",       // 要传递的讯息
    "frames['urmap']",  // 要传递的视窗(请用 String)
    {proxy:"http://yahoomashup.com/b.html"}  //  不支援 postMessage 的浏览器会用到的 proxy 网址
);


Y.Global.on("crossframe:message", function (message, domain, url) {
alert(message);
});

目前测试 IE6, IE7, IE8, FF3, Chrome, Opera 都没有问题(模拟器像是 IE Tester 无法使用)。希望对您有所帮助


原文引用地址  http://www.josephj.com/entry.php?id=338
分享到:
评论

相关推荐

    js操作frame进行消息提示

    总结来说,"js操作frame进行消息提示"是一个关于JavaScript跨框架通信的实践技术,对于前端开发者理解和构建复杂交互的网页应用至关重要。通过学习和掌握这一技术,开发者能够创建出更加动态和响应式的网页,提升...

    在iframe、frame之间,js的相互访问、修改

    在`iframe`中加载的页面可以通过CORS与父页面进行更复杂的交互。 9. 隐藏的`iframe`通信:有时,我们会创建一个隐藏的`iframe`,用来处理一些需要跨域的后台通信,如OAuth登录授权等。通过监听`iframe`的`load`事件...

    iframe 与主框架相互访问例子,同域、跨域访问例子。

    理解并掌握`iframe`与主框架的同域和跨域访问是非常关键的,这不仅涉及页面内容的嵌入和交互,还涉及到Web应用的安全性和性能优化。在实际开发中,需要根据项目需求和安全考虑来灵活运用这些技术。

    small ajax frame

    此外,库可能还支持JSONP(JSON with Padding)或者CORS(Cross-Origin Resource Sharing),以便进行跨域数据请求。JSONP是一种绕过同源策略的手段,适用于简单的数据获取,而CORS则允许服务器定义哪些跨域请求可以...

    Vue axios与Go Frame后端框架的Options请求跨域问题详解

    Vue axios与Go Frame后端框架在处理跨域问题时,...这样,前端的axios请求就可以顺利地与后端GoFrame服务进行交互,不再受到OPTIONS请求的跨域限制。记得在生产环境中,对CORS策略要进行严格的控制,以防止恶意请求。

    js跨域资源共享 基础篇

    JavaScript跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许Web应用程序从不同源(域、协议或端口)获取资源。这是由于浏览器的安全策略,即同源策略(Same-origin policy),它限制了...

    iframe跨域解决方案

    浏览器的同源策略(Same-Origin Policy)是为保障用户安全而设定的一种机制,它规定了只有相同协议、主机名和端口的网页才能相互交互,不同源的页面则无法直接进行DOM操作或读取对方的资源。然而,有时我们需要在不...

    pdfjs跨域展示文件-支持移动端,微信端

    解决PDF.js跨域问题的一种常见方法是通过服务器配置CORS(Cross-Origin Resource Sharing,跨源资源共享)。在服务器端,你需要设置特定的HTTP响应头,如`Access-Control-Allow-Origin`,允许指定的源访问资源。例如...

    iframe框架与主框架通信模块例子.zip

    在网页开发中,有时我们需要在不同的域之间进行通信,特别是在使用iframe框架时。"iframe框架与主框架通信模块例子.zip" 提供了一个解决方案,它演示了如何在iframe和其父页面(即顶层页面)之间实现跨域通信。这种...

    Cross-Platform GUI Programming with wxWidgets.pdf

    ### 跨平台GUI编程与wxWidgets #### 一、wxWidgets简介 **wxWidgets** 是一个开源的跨平台GUI(图形用户界面)工具包,它允许开发者创建原生外观的应用程序,这些应用程序可以在多种操作系统上运行,包括但不限于...

    flex 嵌入完美Iframe

    这通常意味着在服务器上放置一个crossdomain.xml文件,声明允许哪些源进行访问。 3. 监听加载事件:使用SWFLoader的事件监听器,例如`complete`事件,当HTML页面加载完成后执行相应操作。 4. 与HTML内容交互:通过...

    iframe与主框架跨域相互访问

    本文将深入探讨`iframe`与主框架如何进行同域和跨域访问,并提供相关的解决方案。 同域访问: 在同域环境下,即`iframe`的源URL与包含它的页面URL具有相同的协议、主机名和端口,`iframe`与主框架之间的通信是无...

    iframe与主框架跨域相互访问实现方法

    同源策略是浏览器安全策略的核心部分,它要求网页所在的协议、域名和端口必须一致,否则两个网页就不能进行数据交互。然而,在实际开发中,很多时候我们需要在不同的域之间实现通信,这就需要一些特殊的技术手段来绕...

    模态窗口 跨域获取返回值

    在IT行业中,尤其是在Web开发领域,跨域通信是一个常见的需求,但受到浏览器同源策略的限制,不同域名或协议下的页面之间无法直接交互。然而,"模态窗口 跨域获取返回值"这个主题提供了一种解决方案,通过IFRAME的...

    iframe跨域通信解决方法

    尤其是在使用`iframe`嵌入不同源的内容时,主页面往往无法直接与`iframe`内的内容进行交互,这就需要一种解决方案来实现跨文档消息传递。本文档将详细介绍如何在Vue项目或普通Web页面中利用`postMessage`API来实现`...

    python 纯tk制作 三阶魔方还原CFOP

    Tkinter采用事件驱动编程模型,当用户与界面进行交互(如点击按钮)时,会触发预定义的回调函数,这些函数处理事件并更新界面。在这个魔方应用中,每个魔方面的旋转可能都对应一个按钮,点击按钮后,相应的回调函数...

    iframe和父窗口通讯实例

    而关于`iframe`与父窗口之间的通信,是Web开发中的一个重要概念,它允许两个独立的上下文之间进行数据交换,即`iframe`内容与包含它的父页面进行互动。 在`iframe`和父窗口通信的过程中,主要涉及以下几个知识点: ...

    学员管理系统

    这个系统虽然没有内置数据库,但它设计的目的是为了与用户自行创建和连接的数据库进行交互,从而实现数据存储和检索功能。这样的设计灵活性较高,可根据实际需求选择合适的数据库技术,如MySQL、SQLite或SQL Server...

    SWF防下载

    例如,`crossdomain.txt`文件就是用来定义跨域策略的,它告诉其他域的Flash内容哪些操作是允许的。 2. **防止右键菜单**:在ActionScript中,可以通过屏蔽Flash的右键菜单来阻止用户直接保存SWF。这可以通过添加...

Global site tag (gtag.js) - Google Analytics