web项目中的虫洞

分类:Javascript | 发表于2011/08/30 | 1条评论 446 views

虫洞?看看爱因斯坦对虫洞的定义:“虫洞”就是连接宇宙遥远区域间的时空细管。暗物质维持着虫洞出口的敞开。虫洞可以把平行宇宙和婴儿宇宙连接起来,并提供时间旅行的可能性。虫洞也可能是连接黑洞和白洞的时空隧道,所以也叫”灰道”。看起来虫洞就是连接两个距离很远的物体。在我们的WEB项目中会存在这种情况吗?

假设你有一个域名:domain.com。现在主站是www.domain.com。好了,还有一个博客的子域名:blog.domian.com。现在有个需求:要在主站上调用博客子站里面的数据,而且是客户端(通俗的说是页面上)调用。你想到的有几种方式?这个是不是两个感觉很远的物体,好了,让我们来制造一个虫洞来连接这两个跨域的站点。

虫洞一:iframe

是的,iframe在不跨域子域的情况下完全可以互通。假如现在你要在http://www.domian.com/parent.html和http://blog.domain.com/child.html互通,那么在parent.html里面嵌入一个iframe,id为child,src指向child.html。只要满足一个条件:在两个页面上都这样设置:

document.domain=’domain.com’

。这样设置之后两个页面的JS对象完全可以互通。在parent.html里面获得child.html的window对象:

。这样obj对象就是child.html里面的window对象了,有了这个对象可以操作child.html里面的任何东西。在child.html里面操作parent.html更加方便:parent对象就是parent.html的window对象。

上面所说的iframe虫洞只能适用一些简单的需求,但是我接来下所说的一些却是以这个为基础的。

虫洞二:jsonp

陌生吗?其实很熟悉,也许你每天都在用到。打开百度首页,启动你的抓包工具,能抓普通的http包即可(推荐fiddler)。在关键字的输入框里面随便输入一字符串。好了,看下你的抓包工具有没有收获。我这抓到了一个包:http://suggestion.baidu.com/su?wd=d&p=3&cb=window.bdsug.sug&t=1282228746640。这个url返回的内容:

window.bdsug.sug({q:”d”,p:true,s:["dnf","dnf官网","dota","dj","dnf视频","dj舞曲","dell","dn","dj舞曲 超嗨2009 mp3","dnf连发程序下载"]});

好了,这些东西是什么呢?其实这就是一段JS代码,有没有看到抓包工具抓到的URL中有一个cb的参数,值为:window.bdsug.sug,返回的内容就是window.bdsug.sug(object)。也许你已经想到这个怎么使用了,就是通过JS代码来载入一段JS代码。在著名的JS框架Jquery中有一个API:$.getScript(url,callback)。可以告诉你而且这个url可以完全跨域!

虫洞三:AJAX虫洞
AJAX相信大家都非常非常熟悉,这个概念确实改变了很多产品的设计。非常好用,但是有个致命的缺陷,不能跨域,子域名都不能,比如www.domain.com想通过ajax直接访问blog.domain.com是不可能的。注意我说的通过AJAX直接访问,那么有没有间接的方法呢?答案是肯定的。看看我上面写的第一个虫洞iframe,有没有点启发?是的,虽然不能直接访问blog.domain.com,但是可以通过blog.domain.com来ajax。而blog.domain.com又可以通过parent来访问www.domain.com。所以一切都通了。

好了 开始部署这个AJAX虫洞:

1 在blog.domain.com下部署一个proxy.html,里面就一个异步的对象和设置document.domain。这里假设这个异步对象为:pAjax(url,callback);

2 在www.domain.com通过iframe来加载这个proxy.html。

3 在www.domain.com使用proxy.html里面的异步对象呢?看如下代码:

var obj=document.iframes['proxy'].contentWindow;
var ajax=new obj.pAjax(‘http://blog.domain.com/query’,function(response){
//callback
});
ajax.get();

简单总结:
jsonp方式适用于完全跨域,比如a.com可以访问b.com,当然前提是b.com可以给你提供正确的服务。
别的都是要通过iframe来作为桥梁。没有这个桥梁也是不可能!这个桥梁还有许多别的用途,你可以挖掘,比方表单提交到iframe。

关于Web页面字体使用

分类:XHML+CSS | 发表于2011/08/01 | 没有评论 435 views

页面字体适配度比较好的,HTML body 字体的定义:
•Google: font-family: arial,sans-serif;
•Twitter:font: 13px/1.5 Helvetica Neue,Arial,Helvetica,’Liberation Sans’,FreeSans,sans-serif
•豆瓣:font: 12px/162% Arial,Helvetica,sans-serif;
•新浪微博:font-family: Arial,Helvetica,sans-serif;
•Apple中国:font: 12px/18px “Lucida Grande”,”Lucida Sans Unicode”,Helvetica,Arial,Verdana,sans-serif;
•知乎: font: 13px/22px ‘Helvetica Neue’,Helvetica,Arial,Sans-serif;
•Facebook: font-family: “lucida grande”,tahoma,verdana,arial,sans-serif;
•Google+: font: 13px arial,sans-serif;
(全文 …)