也来谈谈”完美”跨域(2)
作者:oldfish 来源:Alipay UED 发布时间:2008-12-19 12:34:00
方案五、JSONP
原理:有点脚本注入的味道
缺点:服务器端程序运行比脚本早,跨域交互时无法捕获前端页面元素的相关数据,比如自适应高度。
演示:[ 点此阅览 ]
在页面中添加如下代码,动态创建一个script,然后指定到子域的动态文件,在动态文件后面可以添加参数,在这里我加了一个回调函数,当请求返回后,会运行这个回调函数。
<script type="text/javascript">
function loadContent()
{
var scriptDom=document.createElement('script');
var url = "http://www.lzdaily.com/domain/jsonp/Test.aspx?f=setDivContent'";
scriptDom.src= url;
document.body.appendChild(scriptDom);
}
function setDivContent(love)
{
var fishDiv = document.getElementById("oldFish");
fishDiv.innerHTML = love;
}
</script>
在页面中添加如下代码,首先先取得主页面传过来的回调函数名,然后生成一段javascript代码,以回调函数带参数的形式返回主页面,这样就完成了跨域之间的通讯。由于服务器端程序执行总是优先于javascript代码,所以基本上没办法获取到子页面中DOM的相关数据,所以小白同学,我可以很负责人的告诉你,想通过这种方法实现跨域自适应高度是不可能的!
<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
string f = Request.QueryString["f"];
Response.Clear();
Response.ContentType = "application/x-javascript";
Response.Write(String.Format(@"{0}({1});", f,1122));
Response.End();
}
</script>
方案六、window.name
原理:window.name本身并不能实现跨域,只是中间做了代理。
缺点:获取异域的前端页面元素值有一定局限性,比如取自适应高度的值。但是此方法在前端页面元素的数据交互上明显比JSONP强。
演示:[ 点此阅览 ]
这个方案,YAHOO的同事已经给出了详细的demo,我就不重复了,演示demo出自YAHOO克军之手。详细的说明可以参看“怿飞的BLOG”,个人觉得方案四比window.name适用面更广一些。
方案七、window.navigator
原理:window.navigator这个对象是在所有的Iframe中均可以访问的对象。应该是IE的一个漏洞!
缺点:不支持IE外的浏览器下的跨域。严格的dtd申明后,该方法失效!
演示:[ 点此阅览 ]
首先先申明一个Json用来保存所有页面的高度window.navigator.PagesHeight={”":0};,然后根据name的属性找到页面的数据window.navigator.getData,最后将页面的数据注册到window.navigator.PagesHeight中。这里还定义了一个函数resetIframeData,在页面加载的时候调用它,完成跨域的数据交互。注释中详细说明了参数的作用。
<script type="text/javascript">
window.navigator.PagesHeight={"":0};
window.navigator.getData=function(pageName) {
return window.navigator.PagesHeight[pageName];
};
window.navigator.putData=function(pageName,pageHeight)
{
window.navigator.PagesHeight[pageName]=pageHeight;
};
/*
*iframeId:页面中iframe的标识id
*key:子页面自定义的json标识,这里就是子页面定义的"PortalData".
*defaultData:无法取到值时候调用
*/
function resetIframeData(iframeId,key,defualtData)
{
var obj=document.getElementById(iframeId);
if(window.navigator.getData)
{
var pageHeight = window.navigator.getData(key);
if(pageHeight && String(pageHeight).match(/\d+/))
{
obj.style.height=pageHeight+'px';
}
else
{
obj.style.height=defualtData + 'px';
}
}
else
{
obj.style.height=defualtData + 'px';
}
}
</script>
获取到页面高度后,将高度存到主页定义的Json中,Json标识为”PortalData”,这里可以自定义。
<script type="text/javascript">
window.onload = function getPageData()
{
var pageHeight = document.body.scrollHeight;
if(window.navigator.putData)
{
window.navigator.putData("PortalData",pageHeight);
}
}
</script>
其实通过css也可以实现跨域,数据获取的实质其实就是动态载入一段CSS,然后解析其中的字段提取数据,这个方法比较“猥琐”,再这里就不多介绍了,当然flash也可以实现跨域,只是还没去实践,实践完了再补充。啥时候能补完呢?恩……
以上这么多方案,有可以“完美跨域”的吗?单一的看,我想没有吧,都有缺陷,但是只要不同情况下使用合适的方法,我想这才是最完美的!原来绕了一圈,我只是再说废话,哎!不论怎么样,还是希望这些废话对还在苦苦追求“完美”的同学们有所启发!


猜你喜欢
- Pygame模块一览表:引入pygame模块 ,若本机没有请自行pip install pygame#载入必要的模块import pygam
- 问题产生:今天在编写神经网络的Cluster作业时,需要根据根据数据标签用不同的颜色画出数据的分布情况,由此学习到了这种高效的方法。传统思路
- 如下:data = pd.read_csv('20180201.txt',sep = '|',dtype =
- Python自动化办公之删除重复文件思路介绍两层判断:1.先判断文件大小是否为相同,大小不同则不是重复文件,予以保留;2.文件大小相同再判断
- REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具
- 本文实例讲述了python生成器/yield协程/gevent写简单的图片下载器功能。分享给大家供大家参考,具体如下:1、生成器:'
- 核心代码: header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); head
- 再写入数据库对时间进行加减操作时候django报告了错误TypeError: can't subtract offset-naive
- 之前在实现表单中file类型input选择多图片的时候找到一种方式 也许不是最好的但亲测可行且支持ie7以上以及chrome浏览器在表单中使
- 1.socket黏包问题原理黏包:指数据与数据之间没有明确的分界线,导致不能正确的读取数据。应用数据想要发送数据就必须将数据交给操作系统,而
- 一、requests模块说明介绍Requests是Python语言的第三方的库,专门用于发送HTTP请求。特点1.Requests支持HTT
- SQLSERVER编译与重编译编译的含义当SQLSERVER收到任何一个指令,包括查询(query)、批处理(batch)、存储过程、触发器
- 图表库下面的类库可以让你很简单就能创建复杂的图表和图片。当然,它们需要GD库的支持。pChart - 一个可以创建统计图的库。Libchar
- def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print(&quo
- pyecharts介绍pyecharts是python与echarts链接,一个用于生成Echarts图标的第三方库,pyecharts分为
- Git 恢复到之前版本1. 应用场景进行了错误提交,需要将代码回退至某个版本;或者需要检出某个版本的代码,再切换回最新版本。2. 解决方法2
- 目录项目介绍已有功能环境安装Windows用看这里ubuntu用户看这里使用方式:主要代码项目地址项目介绍可以下载doc,ppt,pdf.对
- 1. auth模块auth模块是对登录认证方法的一种封装,本身就是一个对象,可以获取用户的详细信息,有了auth模块可以验证登录信息是否存在
- 原理:print() 函数会把内容放到内存中, 内存中的内容并不一定能够及时刷新显示到屏幕中(应该是要满足某个条件,这个条件现在还不清楚)。
- 前言使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法在类的一个对象被建立时,马上