<html> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <title>Gmailtitle> <link rel="alternate" type="application/atom+xml" title="Gmail Atom Feed" href="feed/atom" /> <script src="?view=page&name=browser&ver=c0d3d44c64799453"></script> head> <noscript> <font face=arial>
應啟用 JavaScript,才能在標準視圖中使用 Gmail。然而,JavaScript 似乎已被禁用,要么就是您的瀏覽器不支持 JavaScript。要使用標準視圖,請更改您的瀏覽器選項以啟用 JavaScript,然后<a href="">重試<a>。<p>要使用 Gmail 的基本 HTML 視圖(不需要 JavaScript),<a href="?ui=html&zy=n">請單擊此處</a>。<p> </font> </noscript> <script> (編者注:原文如此) </script> </html> |
這是主框架網(wǎng)頁(yè)兼瀏覽器檢測頁(yè)。如果瀏覽器通過(guò)了檢測(支持javascript、cookie和xml
控件)則在頁(yè)面上寫(xiě)一段框架代碼
要注意到的是google在這里耍了一個(gè)小花招,那個(gè)叫做main的框架頁(yè)面里面看來(lái)沒(méi)有多少東西,好東東都在那個(gè)叫js的框架里面呢。
我們接著(zhù)把這個(gè)js框架拉出來(lái)看看:
整整1500多行的javascript代碼!
這個(gè)頁(yè)面有240多k,幾乎全都是javascript代碼。有興趣分析的兄弟姐妹們請點(diǎn)這里下載。
其實(shí)其中大部分都是老生常談的js代碼了,不過(guò)我們可以一窺google的編碼風(fēng)格:盡可能壓縮信息量,變量名能用一個(gè)字母的絕不用兩個(gè),函數名一概都是兩個(gè)字母的,函數內的會(huì )車(chē)是沒(méi)有的,縮進(jìn)也是沒(méi)有的。雖然代碼沒(méi)有特地加密,但是如此處理一番之后也就沒(méi)什么可讀性了。還好系統的關(guān)鍵字是不能縮水的,順著(zhù)xml控件的名字我們可以揪出來(lái)跟AJAX異步加載數據相關(guān)的幾個(gè)關(guān)鍵函數:
function vb() { var a=null; if(r) { var b=fG?"Microsoft.XMLHTTP":"Msxml2.XMLHTTP"; try{a=new ActiveXObject(b)} catch(c) { q(c); alert("您需要啟用活動(dòng)腳本功能和activeX 控件。") } }else{ a=new XMLHttpRequest(); if(!a){;alert("此瀏覽器不支持 XMLHttpRequest。")} } return a } //emu注釋 構造XML控件并返回給調用者
function ot(a,b){; try{ a.send(b) } catch(c) { q(c); if(c.number==-2146697208){ alert("請確保 Internet Explorer 的”語(yǔ)言”設置部分不是空白。")} } }
//emu注釋 執行發(fā)送數據操作 a:XML控件 b:要發(fā)送的數據
function Wf(a,b,c){ Da(3); b=Ld(b); Hf(a,b,c) }
//emu注釋 a:XML控件 b:訪(fǎng)問(wèn)的url c:回調函數 Da是驗證參數長(cháng)度的函數 //Ld是一個(gè)url轉換加工的函數,主要處理url自帶的CGI參數和翻頁(yè)的頁(yè)數等
function Hf(a,b,c){ Da(3); a.onreadystatechange=c; a.open("GET",b,true); ot(a,null) } //emu注釋 不發(fā)送數據直接請求資源 a:XML控件 b:訪(fǎng)問(wèn)的url c:回調函數
function nt(a,b,c,d){ Da(4); a.onreadystatechange=d; a.open("POST",b,true); ot(a,c) } //emu注釋 發(fā)送數據并請求資源 a:XML控件 b:訪(fǎng)問(wèn)的url c:要發(fā)送的數據 d:回調函數 |
基本上就這么多了,很失望吧,沒(méi)有什么新鮮的東西。發(fā)送http請求之后它又怎么處理返回的xml的呢?事實(shí)上他沒(méi)有處理。他所處理的僅僅是最基本responseText,而cgi則直接生成js腳本到客戶(hù)端回調(用eval運行),或者生成文本信息。這就是為什么gmail可以輕松跨域幾個(gè)瀏覽器了。
作為最受推崇的一個(gè)AJAX應用,卻幾乎沒(méi)有用到xml。像這樣用xml控件來(lái)收發(fā)文本信息后在頁(yè)面上展現的技術(shù),基本上就是現在A(yíng)JAX最流行的應用方式了,不過(guò)這樣也能叫AJAX嗎?我寧可就叫它AJ,最多叫AJAH。