【 以下文字转载自 Google 讨论区 】
发信人: modico (modico), 信区: Google
标 题: gmail client code review,part 18
发信站: 水木社区 (Tue Oct 31 17:18:50 2006), 站内
最终的html是怎样生成的?可以是HTML静态文件由服务器送到浏览器;可以是一个CGI程序print出所有的HTML;可以是ASP,JSP之类的由一个较通用的程序处理后输出HTML;可以是由服务器输出一个XML,由浏览器经过一个XSL转换得到HTML......
上面说的都不是 google 在 gmail 中采用的方法。gmail 服务器输出的是一个由若干<script>块构成的html,这个html本身不能作为普通页面显示,它的作用就是执行<script>块里的脚本。这些脚本执行各种各样的任务,其中之一是用于显示界面。
<script><!--
D(["t",
["10ba8664543ce22a",0,0,"6月6日","<span id\u003d\"_upro_adsense-zhs@google.com\">Google AdSense</span>","<b>»</b> ","欢迎光临 Google AdSense","恭喜您! 您的Google AdSense 申请已得到批准。现在您可以启用帐户了,几 …",[]
,"","10ba8664543ce22a",0,"2006年6月6日_16:12",0,"",0,0,1]]);
--></script>
上面的就是一个典型的收件箱列表数据格式,一个数组,第一个元素作为指令,后续的元素作为该指令的待处理数据。
合成HTML通常借助于之前介绍过的字符串数组模板格式化方法,最后用.innerHTML更新界面。
把界面模板放在浏览器端的策略的最大的好处是,它是可以自动根据浏览器当前的环境进行定制的,相对于XSL来说,由脚本构造的模板是活的。
每次像这样的数据报文下来,开头都会有一个版本确认过程;这里面涉及两个版本,js的版本,和array的版本,版本信息在数据报文的最开始,指令是 "v", 如果跟当前脚本已知的版本不匹配,则要处理一些同步问题,比如重新加载js。
有时候 google 的服务器返回来的是一个可以直接执行的脚本,而不是html包装的脚本,有的是可以直接用 eval 的,有些则是以 while(1);\n\n 开始。这样若你贸然使用 eval(), 则立死。真正能用的是在这个陷阱语句之后。
function XmlHttpEval/*Fs*/(xmlhttp)
{
return evalResponseText/*JE*/(xmlhttp.responseText);
}
function evalResponseText/*JE*/(text)
{
assert/*Gd*/(startsWith/*A9*/(text, "while(1);\n\n"), "Bad response: " + text.substring(0, 20));
return eval(text.substring("while(1);\n\n".length));
}
--
FROM 218.249.84.*