由于浏览器(同源策略)限制,JavaScript 跨域的问题,一直是一个颇为棘手的问题。HTML5 提供了跨文档消息传输的功能,在网页文档之间互相接收与发送信息。使用这个功能,不仅同源(域 + 端口号)的 Web 网页之间可以互相通信,还可以在两个不同域名之间实现跨域通信。
跨文档消息传输Cross Document Messaging提供了postMessage方法在不同网页文档之间互相传递数据,支持实时消息传递。现在很多浏览器都将支持这个功能,比如Google Chrome 2.0+、Internet Explorer 8.0+、Firefox 3.0+、Opera 9.6+、Safari 4.0+等
那么,IE6、IE7等不支持 HTML5的浏览器怎么办?
可以使用window.name方法,因为window.name的修改不涉及跨域问题,虽然使用起来不是特别理想,但效果还可以接受。
但是,我们总不能每次涉及到跨域都去写一遍window.postMessage、window.addEventListener、window.name等等这些内容吧。
为此,我把这整个跨域过程抽象出来,封装成一个JavaScript 插件,解决双向跨域问题,实现不同网页文档之间的实时通信,可以在两个不同域名之间实现跨域通信。
demo下载地址:http://download.csdn.net/detail/cwqcwk1/6675081,版本v2
javascript跨域插件jcrossdomain.js
(function (win){
/**
* 没有开花的树
* http://blog.csdn.net/mycwq/
* 2013/12/07 17:12
*/
var _jcd = {
isInited : false,
elmt : false,
hash : '',
delims : ',',
rand : function(){
return (new Date).getTime()
},
msg : function(){
alert('Warning: You must call init function at first');
},
init : function(callback, elmt){
if(_jcd.isInited == true)
return;
_jcd.isInited = true;
_jcd.elmt = elmt;
if(win.postMessage){
//浏览器支持 HTML5 postMessage 方法
if(win.addEventListener){
//支持火狐、谷歌等浏览器
win.addEventListener("message", function(ev){
callback.call(win, ev.data);
},false);
}else if(win.attachEvent){
//支持IE浏览器
win.attachEvent("onmessage", function(ev){
callback.call(win, ev.data);
});
}
_jcd.msg = function(data){
_jcd.elmt.postMessage(data, '*');
}
}else{
//浏览器不支持 HTML5 postMessage 方法,如IE6、7
setInterval(function(){
if (win.name !== _jcd.hash) {
_jcd.hash = win.name;
callback.call(win, _jcd.hash.split(_jcd.delims)[1]);
}
}, 50);
_jcd.msg = function(data){
_jcd.elmt.name = _jcd.rand() + _jcd.delims + data;
}
}
}
};
var jcd = {
initParent : function(callback, iframeId){
_jcd.init(callback, document.getElementById(iframeId).contentWindow);
},
initChild : function(callback){
_jcd.init(callback, win.parent);
},
sendMessage : function(data){
_jcd.msg(data);
}
};
win.jCrossDomain = jcd;
})(window);
父网页中调用方法:
//自定义回调函数
var cb = function(msg){
alert("get msg:" + msg);
};
//初始化,载入回调函数和 iframe 的id
jCrossDomain.initParent(cb, 'iframeA');
//发消息
jCrossDomain.sendMessage('hello, child');
子网页中调用方法:
//自定义回调函数
var cb = function(msg){
alert("get msg:" + msg);
};
//初始化,载入回调函数
jCrossDomain.initChild(cb);
//发消息
jCrossDomain.sendMessage('hello, parent');
模拟测试小提示:
为了实现不同域之间的通信,可以在操作系统的 hosts 文件添加两个域名,进行模拟。
hosts 文件中添加两个不同的域名
127.0.0.1 parent.com
127.0.0.1 child.com
程序猿的进化过程:
分享到:
相关推荐
实现javascript跨域,可以在不同域名双向通信,内含demo,支持IE6+、火狐,谷歌等浏览器 配套文章:http://blog.csdn.net/mycwq/article/details/16344171
本文将深入探讨JavaScript插件如何解决双向跨域问题,并通过具体的插件实例——jcrossdomain,来阐述其实现方式。 首先,理解什么是“双向跨域”至关重要。在单向跨域中,通常是一个源请求另一个源的数据,而双向...
### JavaScript实现的双向跨域插件分享知识点 #### 同源策略和跨域问题 在Web开发中,同源策略(Same-origin policy)是一种安全策略,限制了来自不同源的文档或脚本如何交互。同源指的是两个页面拥有相同的协议、...
实现javascript跨域,可以在不同域名双向通信,内含demo,支持IE6+、火狐,谷歌等浏览器 配套文章:http://blog.csdn.net/mycwq/article/details/16344171
然而,在实际应用中,比如前后端分离、API接口调用、社交媒体插件等场景,往往需要突破这一限制,这就需要用到跨域访问的技术。 实现跨域访问有多种方法,其中常见的包括: 1. **CORS(Cross-Origin Resource ...
它利用了Flash插件可以跨域发送HTTP请求的能力,将原本JavaScript不能跨域的Ajax请求转换为Flash可以执行的跨域请求。Strophe.js的`strophe.flxhr.js`则是Strophe.js的一个扩展,它将Strophe.js的XMLHttpRequest部分...
3. **IFrame和Window.postMessage**:通过在不同的源之间创建IFrame,利用`window.postMessage`方法可以实现双向通信,从而达到跨域数据交换的目的。这种方法需要双方页面的协调,并且存在一定的兼容性问题。 4. **...
本文将深入探讨如何使用C#开发IE插件,特别是ActiveX控件,并实现与JavaScript的双向交互。ActiveX是Microsoft提出的一种技术,它允许在网页中嵌入各种功能组件,如播放器、Flash等,而C#则提供了强大的面向对象编程...
JSONP常用于获取API数据、社交媒体插件、广告追踪等需要跨域数据交互的场景。特别是在API接口设计早期,JSONP是解决跨域问题的一个常见选择。 ### JSONP的优缺点 #### 优点 1. **兼容性好**:JSONP适用于所有支持...
4. Flash:利用Flash插件的跨域特性来实现数据传输。 然而,HTML5为了解决跨域问题,引入了window.postMessage()方法。这个方法提供了一种安全的进行跨源通信的方式,允许Window对象之间使用postMessage方法发送...
在现代Web开发中,为了实现实时双向通信,JavaScript结合Socket技术(通常指的是WebSocket协议)成为一种常见且强大的解决方案。WebSocket是HTML5引入的一个新特性,允许服务器和浏览器之间建立长时间保持连接的通道...
FlashXMLHttpRequest是一个技术解决方案,主要用于实现JavaScript在浏览器环境中进行跨域异步数据传输。由于浏览器的安全策略限制,JavaScript原生的XMLHttpRequest对象无法直接进行跨域请求,但Flash插件在那时具有...
Vue.js中可以使用axios或fetch库配合JSONP插件实现。 4. **POSTMessage API**: 当两个页面在不同的源中,可以通过`window.postMessage`方法进行通信。这种方式需要双方窗口都有监听事件和发送消息的代码。 5. **...
常见的JavaScript库如Socket.IO和Pusher,可以简化WebSocket的实现,提供更高级的功能,如心跳检测、重连机制和跨域支持。 #### 3.3 前后端通信 前端JS插件负责用户界面交互和WebSocket通信,后端服务器处理消息...
在本项目中,我们主要探讨的是如何将Vue.js前端框架与Unity WebGL进行集成,实现两者之间的双向通信。Vue.js是一个轻量级、高性能的前端框架,而Unity则是一款强大的3D游戏开发引擎,WebGL是Unity导出为浏览器运行的...
WebSocket是一种在客户端...总结来说,`dwebsocket`插件为Django提供了WebSocket支持,使得在Python的Web开发环境中实现双向实时通信变得更加简单。通过它,开发者可以构建出高性能、低延迟的实时应用,提高用户体验。
6. **JSONP(JSON with Padding)** 和 **CORS(Cross-Origin Resource Sharing)**:这两个机制允许JavaScript跨域访问Java服务,是前后端数据交换的常见手段。 7. **Web Services**:包括RESTful API和SOAP等,...
Silverlight是由微软开发的一种插件技术,用于在浏览器中创建丰富的媒体和交互式用户体验,而JavaScript则是Web前端的主要脚本语言,负责处理用户交互、动态内容更新等任务。当这两种技术结合时,能够实现更复杂的...