`
zyeming
  • 浏览: 18008 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

网页插件开发总结(2) - Ajax和Iframe的跨域通信

阅读更多
(二)Ajax和Iframe的跨域通信

既然是网页插件,还用到了iframe,自然会涉及到跨域的问题。其实跨域的问题有很多种解决方案,比如XDomainRequest,Crossdomain XHR,还有让人期待的HTML5,可惜这些目前很多主流浏览器都不支持。其实Ajax的跨域还是很好解决的,目前最常用的就是JSONP了,即使没有jQuery,用前一篇里的loadModule函数也可以进行简单的JSONP调用。

不过iframe的跨域问题就有点棘手了。因为插件是在第三方页面上的,而我们的iframe是在我们自己的域名下面的,因此如果iframe里的内容有所更新,我们无法直接从iframe内来通知页面以更新页面上的内容或是改变iframe大小。

不过我们从这篇文章里找到解决方法,文章里作者提出了下面这一个定义和四个法则。

引用
定义:一个窗口可以指一个iframe或者是顶层窗口(即主窗口)
法则1:这个层级系统中任意一个窗口都可以获取到另一个窗口的对象。
法则2:只有同属一个域名的窗口才能相互存取它们的内部状态和数据。
法则3:这个层级系统中的任意一个窗口都可以设置(但不一定能读取)另一个窗口的URL,即使它们属于不同的域名。
法则4:当一个窗口的URL Fragment发生改变时,页面不会刷新。


作者其实提到了三种解决方法,但它们最基本的原理都是上面提到的那些法则。我们使用的是第一种方法,在iframe里通过设置主窗口的URL Fragment来给主窗口传递信息,而主窗口里的JavaScript则每隔100ms轮询一次处理消息并把URL Fragment复位。主窗口中的代码如下:
    setInterval(function() {
        var h = window.location.hash;
        if (h.substring(0,7) == "#height") {
            window.location.hash = "#_";
            currentHeight = parseInt(h.substring(8), 10);
            adjustPostion(currentHeight);
        } else if (…) {
		……
	}
    }, 100);


在IFrame中则用如下代码传递消息:
window.parent.location.href = srcUrl + "#height=280";

或者
parent.window.location.hash = “height=280”;

前者代码里的的srcUrl就是主窗口的URL;后者更方便,但有时在IE下面好像有问题,所以我们还是用的前者。

当然这个方法也有副作用,首先你需要去轮询,必然就会有延迟,而且会改变主窗口的URL(多一个Fragment)。不过对我们来说都还可接受。作者还提到了另外两个方法,都是通过第三个隐藏的iframe作为proxy来避免轮询和改变主窗口URL。一种是每次发送消息时就创建一个proxy iframe,发送完就关掉;另一种是只创建一个proxy iframe,并同过window.resize和监控resize事件来通知proxy iframe有新的消息。可惜这两个方法我们都没法用。因为它们都要求创建一个和主窗口在同一个域名下的iframe,再由此iframe内的JavaScript来传递消息给主窗口,而主窗口是第三方网页,其域名根本不在我们的控制范围内……当然在一定的情况下,这两种方法还是有用的,有兴趣的可以参考原文。

参考:
Cross-Domain Communication with IFrames
http://softwareas.com/cross-domain-communication-with-iframes

1
0
分享到:
评论

相关推荐

    ajax跨域解决办法

    3. **IFrame和Window.postMessage**:通过在不同的源之间创建IFrame,利用`window.postMessage`方法可以实现双向通信,从而达到跨域数据交换的目的。这种方法需要双方页面的协调,并且存在一定的兼容性问题。 4. **...

    Extjs6-iframe-优化.rar

    在ExtJS6中,IFrame.js插件可能被用来创建和管理IFrame组件,以便在应用中加载外部资源或实现跨域通信。然而,根据描述,这个插件存在一个问题:在某些情况下,IFrame加载的内容可能无法正常访问。这可能是由于网络...

    跨域iframe通讯

    但是,在实际应用中,如社交媒体插件、广告嵌入、数据分析等场景,我们需要打破这种限制,实现跨域通信。 在标题提到的“跨域iframe通讯”中,主要探讨的是如何在主页面和嵌入的iframe页面之间传递信息,这两个页面...

    jQuery跨域问题

    总的来说,jQuery提供了丰富的工具来处理跨域问题,无论是简单的GET请求还是复杂的文件上传,只要合理利用JSONP、CORS、IFrame等机制,都可以在保证安全性的同时实现跨域通信。在实际开发中,根据项目需求和服务器...

    ckeditor 自己写的一个简单的image上传js 运用iframe的ajax上传

    2. **AJAX**:AJAX(Asynchronous JavaScript and XML)是一种在无需刷新整个页面的情况下,能够更新部分网页的技术。在这个例子中,`myAddImage.js`或`mydialog.js`文件中可能包含了使用AJAX的代码,通过...

    IFrame简单例子

    5. **跨域通信**:通过`postMessage`和`message`事件实现不同源IFrame之间的通信。 ### IFrame的高级用法 1. **沙盒模式**:通过`sandbox`属性限制IFrame内的行为,如禁止脚本执行、防止弹出窗口等。 2. **尺寸...

    AjaxUpload.rar 文件上传

    4. iframe跨域通信:通过iframe,AjaxUpload可以实现跨域文件上传,尽管存在同源策略限制,但iframe可以通过特定的配置进行跨域通信。 **三、AjaxUpload的优缺点** 优点: - 用户体验好:无需页面刷新,用户可以...

    jquery 跨iframe拖拽

    "jquery 跨iframe拖拽"的核心在于利用jQuery的拖拽插件(如jQuery UI的draggable/droppable)以及DOM操作和事件处理来实现跨IFrame通信。下面我们将分步骤解析这个过程: 1. **引入jQuery和jQuery UI**:在项目中,...

    HTML5中使用postMessage实现Ajax跨域请求的方法

    3. iframe+location.hash:使用iframe和URL的hash部分来进行跨域通信。 4. Flash:利用Flash插件的跨域特性来实现数据传输。 然而,HTML5为了解决跨域问题,引入了window.postMessage()方法。这个方法提供了一种...

    iframe简单应用

    2. **安全性**:跨域策略限制了iframe与父页面之间的通信,除非目标页面允许(通过设置`CORS`头)。 3. **性能**:iframe会增加页面的加载时间,特别是在加载大型或者多个iframe时。 4. **SEO**:搜索引擎爬虫可能...

    使用HTML5中postMessage知识点解决Ajax中POST跨域问题

    4. flash:使用Flash插件创建跨域通信。 然而,这些方法都有一定的局限性或者不安全性。因此,HTML5提出了postMessage API,为跨域通信提供了一个安全、有效的方式。使用postMessage不仅可以实现跨域消息传递,还...

    ajax upload

    综上所述,Ajax上传是通过异步通信和前端脚本实现的一种高效、用户体验友好的文件上传方式。在ASP.NET环境中,开发者可以选择多种技术和工具来实现这一功能,包括IFrame、控件、jQuery插件、Web API,以及HTML5的...

    java web ajax异步提交方式上传文件

    在这个项目中,jQuery用于在前端实现页面上的DOM操作和Ajax通信。 3. **jQuery-form插件**:此插件扩展了jQuery的功能,使得表单数据可以通过Ajax方式提交,包括文件上传。它处理了文件上传的复杂性,如创建隐藏...

    Allow-Control-Allow-Origin.rar

    在前端开发中,跨域(Cross-Origin)是一个常见的问题,特别是在进行Ajax请求或者资源加载时。"Allow-Control-Allow-Origin.rar" 提供的解决方案是针对谷歌浏览器(Google Chrome)的一个插件,名为 "Allow-Control-...

    xdomainajax.zip

    JSONP、CORS、IFrame、Window.postMessage等技术应运而生,而jQuery的xdomainajax.js插件就是基于这些技术实现的跨域AJAX请求工具。 二、xdomainajax.js工作原理 1. JSONP(JSON with Padding):xdomainajax.js主要...

    ajax文件异步上传工具

    异步上传(Asynchronous Upload)是一种不阻塞用户界面的文件上传方式,它利用Ajax技术将文件数据分块发送到服务器,同时用户可以继续浏览网页其他内容,提高了用户体验。在jQuery库的支持下,实现异步上传变得更加...

    Jquery实现跨域异步上传文件总结

    总的来说,跨域异步上传文件涉及到多个技术和策略,包括jQuery.form插件、CORS、JSONP以及IFrame。理解并掌握这些技术是开发现代Web应用所必需的,尤其是在涉及多平台兼容性时。通过合理地运用这些工具和方法,我们...

    java excel 下载功能插件

    同时,需要处理好跨域问题,确保前端和后端通信顺畅。 8. **错误处理和日志记录**: 对于可能出现的异常,如文件生成失败、网络错误等,都需要有适当的错误处理机制,并记录日志,以便于调试和问题定位。 以上知识...

    第十三次 课程讲解 网页制作之JavaScript上课

    在“博硕网页设计师工具”中,我们可能会了解到一些辅助JavaScript开发的专业软件或插件。这些工具能够帮助开发者更高效地编写代码,调试错误,以及进行性能优化。例如,它们可能包括代码编辑器、调试器、代码压缩...

    淘宝的HTML5实践

    这款工具最初不兼容Internet Explorer,而是采用了HTML5的跨文档消息传递功能(Cross Document Messaging),而非传统的iframe跨域方法。 - **技术细节**:使用了HTML5的WebSocket技术替代了传统的Ajax轮询,提高了...

Global site tag (gtag.js) - Google Analytics