December 21, 2004
ごめん、タイトルは大げさ。Googleのクライアントスクリプトの制御技術はいつも参考になります。(というか、アメリカ人のJavaScript技術はいつも尊敬する)
送受信データを見る限り、実際はIFRAMEなどのダミー?のフレームを作って、そこにaとかbとか入力された文字を送りつけ、サーバから帰ってきた文字列には、候補文字列を引数にして、画面の更新を行うJavaScriptが書いてあるとな。
だから、サーバからデータが帰ってくると、即入力候補が更新されるわけ。
zを入力すると、サーバからこんなJavaScript呼び出しが帰ってくる。
sendRPCDone(frameElement, "z", new Array("zip codes", "zone alarm", "zip code", "zogby", "zonealarm", "zales", "zara", "zellers", "zdnet", "zip code finder"), new Array("7,890,000 results", "3,070,000 results", "24,400,000 results", "290,000 results", "2,350,000 results", "127,000 results", "1,420,000 results", "170,000 results", "26,100,000 results", "4,260,000 results"), new Array(""));
・・・だから、Safariとかでも動くわけですな。
単純なHTML更新とFRAME間のスクリプト呼び出しに落とし込んでるのがこいつの汎用性のミソ。
MSにはRemoteScriptってのがあって、アプレットを使ってて同様のことを実現しているが、それに比べると1000倍ぐらいエレガント。透明Flashでもできるけど、これもIE限定になってしまう。
RIAでFlashも良いけど、HTMLでも結構イケるよねってのをGoogleはいつも見せてくれるなぁ。
BlogをはじめてからJavaScriptやHTMLの基本を応用した使い方をたくさん知ることができて、すごく楽しいです。
ここ数年、やれプラグインはIEしかうごかねぇとか、そういうのに辟易していたので。
ちなみに、制御コードを斜め読みすると以下のコードがあるが、
function jb(){var A=null;try{A=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{A=new ActiveXObject("Microsoft.XMLHTTP")}catch(oc){A=null}}if(!A&&typeof XMLHttpRequest!="undefined"){A=new XMLHttpRequest()}return A}
・・・ドコでMSXMLを使ってるの?
なんとなくマルチバイト文字列に対しては、RemoteMethod呼び出しにMSXMLを使おうとかそういう腹なんでしょうか。なんとなくロケール処理に絡んで処理が分岐してるように見える。
もしMSXMLを使ったら、いつもネタにはあがるが実績がなくて諦めていた、クライアントサイドでのMSXMLを使うという方式が改めて使えるようになって、それはそれでうれしいのだが。
・・・なんかXML RPC呼び出しやSOAP呼び出しもJavaScriptで完結する日も近いですかね。
ただ、最近、IEだけの機能に頼っちゃダメよーんという動きも出てきるから、そこは自重ですかな。