【 以下文字转载自 Google 讨论区 】
发信人: modico (modico), 信区: Google
标 题: gmail client code review,part 16
发信站: 水木社区 (Thu Oct 26 14:57:29 2006), 站内
gmail上集成了chat,但是我一直没有用过。前天早上我的gmail窗口右下角突然弹出了chat窗口,我收到了信息。直接在网页上chat,这件事情不是什么新玩意,聊天室到处都是。现在的问题是,如果google决定做这件事情,他会怎么做?他会用我们熟悉的那一套吗?
我还没有完整地看完,不过据资料说,google用了push,保持活连接,由服务器推送一些<script>代码到客户端直接执行。这种做法要求Web服务器有适当的基础设施支持,不然通常我们见到的服务器胜任不了这种需求,不能同时保持那么多的客户端连接。所以,google用的客户端代码方法,不见得能在别处用。
通常我们用一个定时器去刷新整个页面,或是刷新页面上的一个IFRAME,但是这会导致IE浏览器右上角开始转球,状态栏的进度条开始活动,在chat这种情景下,给用户的感觉是页面永远加载不完,而且如果启动了音响,IE还会制造“嗒”的类似单击链接的声音,这个给用户的感觉不好。
用xmlhttp的话,也绕不过IE的每页面每站点最多两个连接的限制,一个站点的网页中的xmlhttp又无法访问别的站点。
Google 针对IE用户有一个方法,看下面的代码片断:(虽混淆,但大致还看得清,注释是我加的)
...
Ml: function(a)
{
// 创建一个内存HTML文档
this.Qa = new ActiveXObject("htmlfile");
var b = "";
var c = "<html>";
if (a) {
b = this.window/*Xc*/.location.hostname;
// IFRAME的src执行的主机名可能与主窗口不同,在此处标记同属一个域
c += "<script>document.domain='" + b + "'<\/script>";
}
c += "</html>";
this.Qa.open();
this.Qa.write(c);
this.Qa.close();
var d = this;
// 给这个文档的窗口对象附加一些全局方法,这些方法会在服务器返回的
// <script> 块里直接使用,但是实际是在本类实例的上下文里执行。
this.Qa.parentWindow.m = function(g)
{
d.Xk(g);
};
this.Qa.parentWindow.d = function()
{
d.fh(true);
};
this.Qa.parentWindow.rpcClose = function()
{
d.fh(false);
};
var e = this.Qa.createElement("DIV");
this.Qa.appendChild(e);
var f = this.uri/*ra*/ + "&DOMAIN=" + b;
// 将一个IFRAME嵌入刚才创建的内存文档中, src 指向的url会持续向浏览器传递
// 脚本数据,聊天的内容就包含在这些脚本数据里。
e.innerHTML = '<IFRAME src="' + f + '"></IFRAME>';
g_logger/*Va*/.pm("GET", f, this.type/*xa*/, this.retries/*Pd*/ + 1);
this.tc();
},
...
--
FROM 218.249.84.*