设为首页 收藏本站
查看: 1378|回复: 0

[经验分享] javascript 跨域双向通信方案,通过postMessage和window.name实现

[复制链接]

尚未签到

发表于 2017-2-24 08:51:06 | 显示全部楼层 |阅读模式
  更新:
  最近项目使用在node-webkit中用于iframe flash的调用,有一个json版本,设计方面还是有些缺陷,没有设计成mian,client可以1对多创建的方式,考虑重构
  此方案在IE6,7下面通过window.name实现跨域信息的传递,会导致一系列的BUG,项目中需要兼容的话,请使用以下技术处理
  http://www.alloyteam.com/2013/11/the-second-version-universal-solution-iframe-cross-domain-communication

  前言:
  专门从事js工作其实也有1年时间了,水平一般。获取前端相关的知识,主要通过 司徒正美的博客 和 司徒正美的QQ群-javascript罗浮宫。
  在去年的项目中,做消息推送的时候,由于推送服务部署在一个独立的服务上,后来试了一些方案,
  最后是通过window.name和postMessage结合的方式解决跨域问题,从而实现消息推送(AJAX 的长轮询).
  最近项目比较空,特地花了时间整理了下代码。当然跨域的实现,还是首推JSONP的方式
  作用:
  我们作为客户端,开放相关API给其他第3方进行访问
  (如果该js真的能解决你的需求,希望能支持下,让更多人得到方便)。
  原理:
  相关原理可以参考 http://js8.in/752.html,对于通过name的方式,本js加入了代理页(about:blank),不会污染主端window.name,结构下图

  功能:
  1.实现main.html和client.html之间的双向通信,通过提供相关Command。
  2.通过callback机制,可以方便的对返回的数据进行相应的处理。
  3.多参数支持,参数支持字符串,数字,通过加载JSON的js,支持object,数组
  例子:
  https://github.com/legu2009/cross-domain-javascript
  github上有相关例子的环境,可以安装nodejs,进行调试。(去掉注释,可支持json格式,例子简化了下,主要演示一个主端向客户端调用API的过程).
  mainAPI.html


View Code


<body>
</body>
<!--script type="text/javascript" src="http://localhost:9099/json2.js"></script-->
<script type="text/javascript" src="http://localhost:9099/crossDomain.js"></script>
<script>
(function () {
var host = '  main.html';//window.location.host;
var slice = Array.prototype.slice;
typeof console == "undefined" && (console = {
log: function () {
alert(slice.call(arguments).join(':'));
}
});
var config = {
clientUrl: "http://localhost:9098/clientAPI.html"
//,aboutBlank: 'NO'
//,isSameDomain: false
    };
var crossDomain = getCrossDomain(config);
/*
crossDomain.message.set({
params2str: function () {
return JSON.stringify(slice.call(arguments, 0));
},
str2params: function (str) {
return JSON.parse(str);
}
});*/
function callback (str) {
var str = slice.call(arguments).join(',') + '=>>';
return function () {
console.log(host+'@',str+slice.call(arguments).join(','));
}
//console.log(host+':'+slice.call(arguments, 0).join(','));
    }
crossDomain.message.send('clientCall','hello,i\'m main');//调用命令
    crossDomain.message.send('clientCall','your name',callback('your name'));//调用命令,并显示返回值
    crossDomain.message.send('clientCall','your mail',callback('your mail'));
crossDomain.message.send('clientCall','your mail', 'the date',{'aa':123},callback('your mail', 'the date',{'aa':123}));//多参数支持

})();
</script>
  clientAPI.html


View Code


<body>
</body>
<!--script type="text/javascript" src="http://localhost:9099/json2.js"></script-->
<script type="text/javascript" src="http://localhost:9099/crossDomain.js"></script>
<script>
(function () {
var host = 'client.html';//window.location.host;
var slice = Array.prototype.slice;
typeof console == "undefined" && (console = {
log: function () {
alert(slice.call(arguments).join(':'));
}
});
var config = {
clientUrl: "http://localhost:9098/clientAPI.html"
//,aboutBlank: 'NO'
//,isSameDomain: false
    };
var crossDomain = getCrossDomain(config);
/*
crossDomain.message.set({
params2str: function () {
return JSON.stringify(slice.call(arguments, 0));
},
str2params: function (str) {
return JSON.parse(str);
}
});*/
var apiMap = {
'your name': 'guwei',
'your mail': '89415119@qq.com',
'the date': new Date().toString()
}
crossDomain.clientCommand.add('clientCall', function(str, callback) {
console.log(host+'@','clientCall:',slice.call(arguments));
try {
console.log(host+'@','aa:'+arguments[2].aa);//判断JSON支持
        } catch (e) {}
var callback = arguments[arguments.length-1];
var ary = slice.call(arguments, 0, -1);
//console.log(host+':'+ary.join(','));
for (var i =0;i<ary.length;i++) {
ary = apiMap[ary]||ary;
}
callback.apply(null,ary);//即使有的API没有数据返回,也需要执行下callback
    });
})();
</script>
  执行结果:

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346392-1-1.html 上篇帖子: Node.js[5] connect & express简介 下篇帖子: Yeoman学习与实践笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表