也来谈谈”完美”跨域
作者:oldfish 来源:Alipay UED 发布时间:2008-12-19 12:34:00
关于跨域这个话题,很早就答应过要分享,但是因为懒,一直拖着,直到D2上有人谈起了“完美跨域”。“跨域”应该已经算不上什么难题了,只是提起“完美”这两个字,突然觉得有了新意,那就写点什么吧,至少对自己有个交代嘛!跨域方案有很多,接下来一一枚举,会给出demo,demo的宗旨是尽可能简单的让新手明白,各方案中跨域的原理,实际应用请酌情修改。
方案一、剪贴板
原理:IE本身依附于windows平台的特性为我们提供了一种基于iframe,利用内存来“绕行”的方案,在这里我称之为,本地存储原理。
缺点:不支持非IE浏览器,并且影响到用户对剪贴板的操作,用户体验非常不好,特别是在IE7下,受安全等级影响,会弹出提示框。
演示:[ 点此阅览 ]
子页面在子域:demo.ioldfish.cn下,在页面中加入如下代码获取页面高度并存入剪贴板。
<script type="text/javascript">
var ua = navigator.userAgent;
if ((i = ua.indexOf("MSIE")) >= 0)
{
var iObjH = window.document.documentElement.scrollHeight;
window.clipboardData.setData('text',String(iObjH));
}
</script>
在页面中加入如下代码,获取剪贴板的值并赋值为子页面所在的iframe的高度。
<script type="text/javascript">
window.onload = function()
{
var iObj =document.getElementById('iId');
iObj.style.height=parseInt(window.clipboardData.getData('text'))+'px';
}
</script>
方案二、document.domain
原理:设置了document.domain,欺骗浏览器
缺点:无法实现不同主域之间的通讯。并且当在一个页面中还包含有其它的iframe时,会产生安全性异常,拒绝访问。
演示:[ 点此阅览 ]
子页面在子域:demo.ioldfish.cn下,在两个页面的头部都加入如下代码:
<script type="text/javascript">
document.domain="ioldfish.cn";
</script>
方案三、通过JS获取hash值实现通讯
原理:hash可以实现跨域传值实现跨域通讯。
缺点:对于父窗口URL参数动态生成的,处理过程比较复杂一些。并且IE之外的浏览器遇到hash的改变会记录历史,影响浏览器的前进后退功能,体验不佳。
演示:[ 点此阅览 ]
在页面中添加如下代码,因为hash是不受跨域限制的,所以可以将本页面的高度顺利的传送给主页面的hash。
<script type="text/javascript">
var hashH = document.documentElement.scrollHeight;
var urlA = "http://www.ioldfish.cn/wp-content/demo/domain/hash/a2.html";
parent.location.href= urlA+"#"+hashH;
</script>
在页面中添加如下代码,首先取得子页面传递过来的hash值,然后将hash值赋到子页面所在的iframe的高度上。
<script type="text/javascript">
window.onload = function()
{
var iObj = document.getElementById('iId');
if(location.hash)
{
iObj.style.height=location.hash.split("#")[1]+"px";
}
}
</script>
方案四、传hash值实现通讯改良版
原理:该方案通过“前端代理”的方式,实现hash的传值,体验上比之方案三有了很大的提升。
缺点:对于父窗口URL参数动态生成的,处理过程比较复杂一些。
演示:[ 点此阅览 ]
在页面中添加如下代码,首先在页面里添加一个和主页面同域的iframe[也可动态生成],他的作用就像是个跳板。C页面中不需任何代码,只要确保有个页面就防止404错误就可以了!该方法通过修改iframe的name值同样可以跨域传值,只是比较”猥琐“而已。
<iframe id="iframeC" name="iframeC" src="http://www.ioldfish.cn/wp-content/demo/domain/hashbetter/c.html" frameborder="0" height="0"></iframe>
然后在页面中加上如下代码,利用页面C的URL接收hash值,并负责把hash值传给同域下的主页面。
<script type="text/javascript">
hashH = document.documentElement.scrollHeight;
urlC = "http://www.ioldfish.cn/wp-content/demo/domain/hashbetter/c.html";
document.getElementById("iframeC").src=urlC+"#"+hashH;
</script>
在页面中添加如下代码,获取从C页面中传递过来的hash值。这里应用到一个技巧,就是直接从A页面用frames["iId"].frames["iframeC"].location.hash,可以直接访问并获取C页面的hash值。这样一来,通过代理页面传递hash值,比起方案三,大大提高了用户体验。
<script type="text/javascript">
window.onload = function()
{
var iObj = document.getElementById('iId');
iObjH = frames["iId"].frames["iframeC"].location.hash;
iObj.style.height = iObjH.split("#")[1]+"px";
}
</script>


猜你喜欢
- 如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了
- 本文向大家介绍了使用SQL语句提取数据库所有表的表名、字段名的实例代码,在SQLserver 中进行了测试,具体内容如下:--查询所有用户表
- 这个标题实在拗口,Javascript命名变量所遵循的规则1、第一个字符必须是字母、汉字字符、 下划线(_)或美元符号($)2、剩下的可以是
- Python-pip安装失败问题一、问题描述root@ubuntu:/home/chao# apt-get install python-p
- 前面的文章,主要讲到如何使用无序列表ul元素来实现复杂柱状图,但是在Web标准中,除了注重表现外,更加注重语意,所谓的语意就是样式和内容的相
- 写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉
- 众所周知tensorflow造势虽大却很难用,因此推荐使用Keras,它缺省是基于tensorflow的,但通过修改keras.json也可
- 今天展示一个利用pandas将json数据导入excel例子,主要利用的是pandas里的read_json函数将json数据转化为data
- 五子棋游戏相信大部分人都玩过,今天我们用python来实现一次具体代码可以访问我的GitHub地址获取构建五子棋棋盘from collect
- 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程。本文主要是通过thread和threading这两个模
- 一、时间对象timetime模块使用的是C语言函数库中的函数。只能处理1970/1/1到2038/12/31之间的数据。1.测量运行时间方法
- 本文实例为大家分享了bootstrap响应式工具的具体代码,供大家参考,具体内容如下<!DOCTYPE html><htm
- 如何解决pycharm配置跨域不提示?正常我们需在在如上中间件内配置跨域,但是2019之前的版本配置中间件可能需要全部自己敲出来,不会有提示
- 1.文件的读取操作文件的第一步就是得打开要操作的文件,然后进行读取文件,最后关闭文件。在python中我们可以使用open函数来打开一个文件
- Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到
- django和webpy都是python的web开发框架。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件
- 使用索引获取列表的元素(随机读取)列表元素支持用索引访问,正向索引从0开始colors=["red","blu
- 制作初衷:外地开了票到公司后发现信息有错误,无法报销;公司的行政和财务经常在工作日被问及公司开票信息,影响心情和工作;引入相应的专业APP来
- 我就废话不多说了,大家还是直接看代码 吧~package mainimport ( "fmt" "sort&q
- 前言用过Pandas和openpyxl库的同学都知道,这两个库是相互互补的。Pandas绝对是Python中处理Excel最快、最好用的库,