JavaScript跨域解决办法
在找到跨域解决办法之前,我们要先弄清楚一些基本概念
- 什么是跨域?
- 什么是“同源策略”?
- 跨文档消息通信 & 跨域请求数据
- 主域相同而子域不同
- 不同域名的跨域访问
什么是跨域?
什么是同源策略?
- 跨文档消息通信 (如读取不同源页面的DOM对象等)
- 跨域请求数据(跨域ajax请求, jsonp请求等)
跨文档消息通信
我们经常在工作中碰到的有两种:
主域相同而子域不同
可以通过设置document.domain+iframe的办法来解决
不同域名的跨域访问
解决方案有很多,例如:
1. iframe+代理页+hash的方式
2. iframe + name
3. postMessage
下面我们用个例子来实现 “跨文档消息通信”
需求:a页面里有一个iframe(b页面)。当b页面加载完成后,同步一下iframe的高度。
1、“主域相同而子域不同” 的情况
下次上代码
2、“不同域名的跨域访问” 的情况
iframe+代理页+hash的方式:利用proxy.html代理页来实现. 这个办法比较绕,但是可以解决完全跨域情况下的脚步置换问题。原理是利用location.hash来进行传值原理及流程。来张我画的草图:

a页面,位于sport.taobao.com域名下
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<script src="http://a.tbcdn.cn/s/kissy/1.3.0/kissy-min.js"></script>
<style>
body{background:#00ae8f;}
.iframeArea{margin-top:30px;}
</style>
</head>
<body>
A:运动页面 此页面访问时的url是这样的:
http://sport.taobao.com/market/sports/a.php?iframeUrl=http://wanke.etao.com/mobile/product-600000000007215.html
<div class="iframeArea">
<iframe id="J_sport_iframe" name="sport_iframe" src="" frameborder="0" style="display: block; margin: 0 auto; height: 1000px;" width="990" scrolling="no" >
</iframe>
</div>
<script>
(function(S){
KISSY.use('uri',function(S,Uri){
var url = new Uri(location.href).getQuery().get('iframeUrl');
if(url){
S.all('#J_sport_iframe').attr("src",url); //给iframe赋src的值
}else{
S.all('#J_sport_iframe').attr("src","http://wanke.etao.com/error.html");
}
});
})(KISSY);
</script>
</body>
</html>
b页面位于wanke.etao.com域名下
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<script src="http://a.tbcdn.cn/s/kissy/1.3.0/kissy-min.js"></script>
</head>
<body>
<div>
我是玩客页面:http://wanke.etao.com/mobile/product-600000000007215.html
</div>
<script>
/*
etao的B.html js 写在页面结束时
*/
(function (S) {
if (window != top) {
//在etao的页面B.html中创建iframe代理
S.one('body').append('<iframe id="iframeproxy" name="iframeproxy" src="" width="0" height="0" style="display:none;" ></iframe>'); function updateHeight() {
if (window !=top && S.one("#iframeproxy")) {
var ht = S.one("body").height() + 10, a = window.name, b;
b = "http://sport.taobao.com/market/sports/iframe-proxy2.php"
S.one("#iframeproxy")[0].src = b + "#" + ht;
}
}
updateHeight();
S.one(window).on('load', function () {
updateHeight();
});
}
})(KISSY);
</script>
</body>
</html>
proxy页面位于sport.taobao.com域名下,但是插入到b页面中
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<script src="http://a.tbcdn.cn/s/kissy/1.3.0/kissy-min.js"></script>
</head>
<body>
<script>
/*
taobao站点页面中的js http://sport.taobao.com/market/baobao/iframe-proxy2.php
*/
(function(S){
function pseth() {
var iObj = window.top.document.getElementById('J_sport_iframe');//A和iframe-proxy2同域,所以可以访问节点
iObjH = window.location.hash;//访问自己的location对象获取hash值
iObj.style.height = (+iObjH.split("#")[1]+5)+"px";//操作dom
}
pseth();
S.all(window).on("hashchange",function(){
pseth();
}); })(KISSY);
</script>
</body>
</html>
3. postMessage
我这里有篇文章专门写postMessage做跨域的。请看 http://www.cnblogs.com/summer_shao/p/3998695.html
JavaScript跨域解决办法的更多相关文章
- JAVA联调接口跨域解决办法
JAVA联调接口跨域解决办法 第一种代码: HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus. ...
- 关于iFrame特性总计和iFrame跨域解决办法
1.iframe 定义和用法 iframe 元素会创建包含另外一个文档的内联框架(即行内框架). HTML 与 XHTML 之间的差异 在 HTML 4.1 Strict DTD 和 XHTML 1. ...
- JavaScript跨域解决方法大全
跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...
- javascript 跨域问题解决办法总结
跨域的意思就是不同域名之间的页面默认是无法通信的.因为浏览器默认是禁止跨域的: 图所示:chrome浏览器尝试获取mainFrame失败,提示DomException 1).假如你有个网站 a.com ...
- JavaScript跨域解决方式
平时工作中经常被JavaScript跨域问题所困扰,其实有很多种解决方式,下面给大家介绍常用的几种: 1.jsonp解决跨域问题 客户端代码: <!DOCTYPE html> <ht ...
- javascript 跨域请求详细分析(终极跨域解决办法)
自从我接触前端以来,接手的项目里面很大部分都是前后端分离的,后端只提供接口,前端根据后端接口渲染出实际页面.个人觉得这是一个挺好的模式,前后端各自负责各自的模块,分工明确,而且也给前端更大的发挥空间. ...
- iFrame跨域解决办法
按情境分1.不跨域时2.主域相同.子域不同时3.主域不同不跨域时访问iframe: contentWindow访问父级:parent访问顶级:top a.html <html xmlns=&qu ...
- ajax跨域解决办法
在使用jquery的ajax作请求时,http://127.0.0.1:8080,类似这样的一个本地请求,会产生跨域问题, 解决办法一: jsonp: var url= "http://12 ...
- tornado django flask 跨域解决办法(cors)
XMLHttpRequest cannot load http://www.baidu.com. No 'Access-Control-Allow-Origin' header is present ...
随机推荐
- js模拟Map对象,实现key---value
js模拟Map对象,实现key---value 根据java中map的属性,实现key----value保存 function Map() { var struct = function (key, ...
- 【转】Visual Studio快捷键汇总
原文网址:http://www.cnblogs.com/lanxuezaipiao/p/3451943.html Visual Studio最好用的快捷键(你最喜欢哪个) 每次在网上搜关于VS有哪些常 ...
- 处理MVC中默认的Json方法返回时间的问题
利用 Json方法返回 数据时,如果有时间格式,会变成 "\/Date(1369419656217)\/" 这个样子,问了同事找到个解决方法 using Newtonsoft.Js ...
- linux c/c++ GDB教程详解(转)
http://www.gnu.org/manual/ http://www.gnu.org/software/gdb/documentation/ http://sourceware.org/gdb/ ...
- STL总结之vector
STL中vector是通常作为数组使用,不过它更像一个动态数组,在实际项目开发中大量使用. 优点:存储空间连续,可以使用下标访问,时间复杂度O(1). 缺点:不适合从中间删除和添加元素. C++标准规 ...
- HDU-3706 Second My Problem First
http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 MS (Ja ...
- C#实现Zip压缩解压实例【转】
本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZipLib.dll[下载地址]. 另外说明一下的是,这个类压缩格式是ZIP的,所以文件的后缀写成 .zip. ...
- QT-opencv小结
gcc –v 4.5 cmake编译opencv 2.4.4 ox00000005错误(gcc版本不对) gcc –v4.5 <----------qt 推荐打包,而不是static
- 纯CSS的颜色渐变效果
本例展示了一个纯css渐变的效果.其兼容IE6以上浏览器等各主流浏览器: 案例效果:查看演示 代码如下: css: *{margin:0;padding:0;} .linear{ width:100% ...
- 在win7的虚拟机中LINUX与winxp两客户机互通问题
本人实际操作:两个虚拟机都选Host-Onl,查看主机VirtualBox Host-Only Network ip地址为192.168.56.1,那我让linux,windowsxp都让为该网址19 ...