Jintrick.netagenda2008年03月アーカイブ → 2008年03月11日

Google検索結果をリキッドマルチカラムで一望し、次の検索結果を先行読み込みして高速に表示し、かつ履歴で戻れるGreasemonkeyスクリプト

注:Googleの仕様変更に伴い、このスクリプトは形骸化している。修正版はMulticol Google Search (agenda)で公開している。

Googleをマルチカラム環境に最適化する (agenda)は、10分かそこらで書いた適当なスクリプトだったのでいつか書き直そうと考えていたが、暇を見つけて終わらせたので公開しておく。今回Stylishやユーザースタイルシートは使わず、Greasemonkeyのみで動作するようにした。googlesearchutility.user.js

スクリーンショット
フルサイズ画像(60kb)

留意点など

訳あってwww.google.comでしか履歴は動作しない。www.google.co.jpでも基本的に動作はするが、そこらの履歴の壊れる糞Ajaxアプリケーションになってしまう。また一度に得る検索結果はデフォルトの10件にしておかなければならない。20件以上ではスクロールが必要になり、何のためのマルチカラムか分からなくなるので対応する気はさらさらない。ソースはスパゲティで、書いていてうんざりした。Javascript1.7が使えるならゲージュツ的に仕上げてやるものを。

履歴(戻る、進む)機能

メインコンテンツが書き換わるAjaxアプリケーションを作るなら、ユーザーの履歴を守るのは義務だといっていい。その意味でGoogleカレンダーは正しい動作をしているのだが、Greasemonkeyスクリプトでも同じことをやるのはgoogle.com上のソースを管理する権限のない私にとって難しく、Googleカレンダーのソースを利用させてもらった。/calendar/echo.htmlのスクリプトはlocation.hashを引数に渡して親フレームの_goHist関数をcallしている。つまりユーザーによって引き起こされたいわば「戻る」「進む」イベントを知らせてくれるということだ。Greasemonkeyスクリプトでこれを利用するには、unsafeWindow._goHistを定義してやればいい。問題はunsafeWindow._goHist内部ではGM_xmlhttpRequest関数が使えないことだが、ノードの属性を書き換えるなどしてイベントを引き起こし、そのリスナでGM_xmlhttpRequestを呼び出すなど抜け道はある。

iframeなどのフレームのsrc属性を書き換えると履歴に残るため、履歴を残したいタイミングでsrc属性の書き換えを行うことで、ページ遷移なしにユーザーの履歴をある程度操作可能になる。同じことはハッシュを用いたページ内リンクでもできることは容易に想像できるのだが、「戻る」や「進む」のイベントをキャッチする方法が分からなかった。既に述べたが、iframe内の文書のスクリプトは実質的にイベントリスナーになっているのだ。「戻る進むイベント」さえ得ることができれば、後は何とでもなる。余計な解説も、糞重たいライブラリも一切不要だろう。

「糞重たいライブラリ」と自分で書いていて半ギレしてきたのだが、外部Javascriptファイルを10個も20個もリンクしている馬鹿サイトは本当に頭にくる。読みたい記事10行のために一体どれだけ馬鹿げた糞処理が行われているんだ? 分かった認める。Web2.0という概念を認めるとしよう。しかし殆どのサイトはWeb2.0に乗っかったつもりで電話回線時代のようなノロノロの「Web 0.5」に退行しているのも、これもまた間違いのない事実だ。本当に、本当に間抜けだと思う。なぜってWeb 2.0のその本質は「(体感)速度」なのだから。まあともかく。

基本的に検索結果の各ページは別窓や別タブで開くことを前提にしているが、うっかり同じ窓で開いて先行読み込みした検索結果のキャッシュがクリアされてしまうこともあるだろう。そんなときでも「戻る」操作で一応状態は復元する。しかし動作はもたつく。

本当は現在の「ページ数」をdocument.titleに記載して履歴一覧が機能するようにしたかったがバグに悩まされ、面倒くさくなって放置してある。

先行読み込みの機能

検索が完了すると、次の10件及び最後の検索結果を先行読み込みしてキャッシュに溜め込む。ちなみにGoogleは1000件までしか検索結果を提供しておらず、start=990をURLのパラメタとして付加してやれば最後の検索結果が得られるようだ。読み込みが完了した時点で総ページ数を分母として表示する。

をアクティブにすると最後の検索結果まで一気に移動する。このとき、先行読み込み機能は逆転し、前の10件の検索結果を先行読み込みするように切り替わる。で最初の検索結果に移動すると元に戻り、再び次の10件を先行読み込みするようになる。


webmaster@jintrick.net
公開: 2008年03月11日
カテゴリ: Firefox ,Google ,Javascript ,リキッドマルチカラム