也来谈谈”完美”跨域(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也可以实现跨域,只是还没去实践,实践完了再补充。啥时候能补完呢?恩……
以上这么多方案,有可以“完美跨域”的吗?单一的看,我想没有吧,都有缺陷,但是只要不同情况下使用合适的方法,我想这才是最完美的!原来绕了一圈,我只是再说废话,哎!不论怎么样,还是希望这些废话对还在苦苦追求“完美”的同学们有所启发!
猜你喜欢
- JavaScript中有很多内部属性和方法,在大多数情况下,只有JavaScript引擎才可以访问,但不论什么都是有特例的,在这里就是指Mo
- SQL Server数据库日志清除的两个方法:方法一一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,
- 很多网站现在都有使用QQ作为在线客服工具,我们点击它可以很方便的和网站人员联系,本站为你整理了在网站上使用QQ在线客服的代码,共13种风格,
- 写了个JavaScript版的DateAdd、DateDiff、IsDate函数,大家评评!需要说明的是,JavaScript中IsDate
- MySQL Order By keyword是用来给记录中的数据进行分类的。MySQL Order By Keyword根据关键词分类ORD
- 一、简化代码采用更为简短的写法,不仅可以减少输入的字符数,还可以减少文件大小。大部分采用简单写法的代码,执行效率都有轻微提高。1.1&nbs
- 先想创意,再画草图,接着鼠绘,最后做成flas * 。这是我的习惯流程。 这是想到中秋时,我第一时间内能浮想出的图像:大意是嫦娥奔
- 如何做一个只搜索本网站的引擎? 用下面两个文件即可实现:searchfiles.html &l
- 有一编文章是用JavaScript对XML文件操作来实现无限级联动菜单的,我们可结合ASP来完成对数据库值的读取,然后写入XML文件,再用J
- CSS样式和JavaScript脚本是应该放在外部文件中呢?还是把它们放在页面本身之内呢?如何处理是关于一些性能规则的思维,就这些问题,我们
- 一个常常令设计师和前端开发人员都头疼的事情就是字体的使用,设计师常常在设计稿中使用某些很漂亮的字体,以实现比较酷炫的界面。但这样常常给编码人
- 支持实时监控sliderbar的数据,允许有callback回调的函数,有示例1、可自定样式SetStyle() 2、带有onSroll功能
- FrontPage 2003在功能上增强了不少,下面我们一起来看看新版本中比较突出的9个新功能。1.自定义浏览器分辨率预览检查 在
- 下面是模板的一般形式,显示了指定 SQL 查询和 XPath 查询的方式: <ROOT xmlns:sql="ur
- caller 属性返回一个对函数的引用,该函数调用了当前函数。functionName.caller functionName 对象是所执行
- 从MySQL 5.0 开始,支持了一个全新的SQL句法:PREPARE stmt_name FROM preparable_stmt;EXE
- 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字
- 以前我就是一篇博文 就给出一个好用的函数,它在我几篇博文中被广泛运用的。最近看了不少东西,于是便有了这篇博文,以梳理我学到的新东西。毫无疑问
- 概述 -------------------------------------------------------------------
- IE8正式版已经发布了。本篇文章不会非常扯蛋地去进行什么评测,然后给出什么“Chrome运行JavaScript能力是IE8的15倍”、什么