去年年底,Google推出了一項新的服務(wù)Google Suggest,可以提供和你搜索關(guān)鍵字相關(guān)的關(guān)鍵字建議。目前還只有英文的beta版本,網(wǎng)址在這里:
http://www.google.com/webhp?complete=1&hl=en。
比如我在搜索框中輸入java,效果圖如下:
提示效果的實(shí)現原理,我們大概可以猜到,很有可能是利用js通過(guò)xmlhttp獲得google后臺整理出來(lái)的索引數據,并動(dòng)態(tài)生成一個(gè)layer或者iframe顯示出來(lái)。
這個(gè)效果具體是怎樣的一個(gè)流程呢?對google 的技術(shù)的崇拜促使我決心去弄清楚。通過(guò)查看該頁(yè)源碼,我發(fā)現其加載了一個(gè)腳本 ac.js,下下來(lái)一看,一頭霧水,因為幾乎所有的腳本都被混淆了,滿(mǎn)眼看到的是與亂碼無(wú)異的abcd。經(jīng)過(guò)耐心的(我都被自己感動(dòng))抽絲剝繭,基本清楚了套路。
與我最初的猜測一致,確實(shí)是通過(guò)xmlhttp,js將關(guān)鍵字提交到如下的地址:
http://www.google.com/complete/search?hl=en&js=true&qu=java最后的 qu=java 就是我鍵入的搜索關(guān)鍵字 java。那么google返回的是什么呢?請看:
sendRPCDone(frameElement, "java", new Array("java", "javascript", "java download", "java games", "java virtual machine", "java script", "java api", "java in a nutshell", "java tutorial", "javanoid"), new Array("132,000,000 results", "42,000,000 results", "14,500,000 results", "7,210,000 results", "2,890,000 results", "4,730,000 results", "3,960,000 results", "452,000 results", "5,320,000 results", "23,400 results"), new Array(""));
出乎我的意料,google 沒(méi)有返回 xml 數據,而是直接返回了一段 javascript,這段javascript是執行一個(gè)名為 sendRPCDone 的方法,這個(gè)方法其實(shí)早已定義在ac.js中。其后的參數我想大家都明了了。調用這個(gè)方法的結果我們用腳底也可以想到,一定是將數據寫(xiě)入動(dòng)態(tài)產(chǎn)生的iframe中,然后popup。
讓我感興趣的是,通常js+xmlhttp的應用都是傳遞xml格式的數據,google直接返回javascript的方式,我想它的用意是為了省卻了解析xml的消耗并提高兼容性,畢竟解析DOM是比較消耗內存的,而且在各種瀏覽器中處理DOM的語(yǔ)法還沒(méi)有完全統一。
我不禁想到,xmlhttp 這個(gè)名字以xml開(kāi)頭也許限制了我們的想像,使我們習慣或者盲目的硬要帶上x(chóng)ml來(lái)解決問(wèn)題。不光如此,很多時(shí)候,我覺(jué)得xml被濫用了,一些項目或者產(chǎn)品,很簡(jiǎn)單的屬性都要用xml來(lái)配置。很多時(shí)候我更愿意看到一個(gè) properties 文件。
向大家推薦一個(gè)東東,
JSON-RPC-Java : javascript 與 java 進(jìn)行 rpc 調用。底層通訊當然仍舊是xmlhttp。我以為用它,Google Suggest會(huì )更完美。我會(huì )用連載的形式比較詳細的介紹它。本文算是一個(gè)引言吧。