五里霧中、暗夜行路、急がば回れ前回、どうやらオリジナル版でちゃんとLocation変更イベントをハンドリングしてたかも、という発見をしてしまいました。
ではどのイベントハンドラで処理を行っているのでしょう。 またコードと睨めっこです。 初期化関数内で、このイベントが起きたらこの関数呼んでね、という登録処理を記述している部分がありました。 この中で怪しそうなのはMousedownイベントです。 ところが、ド素人がざっと読んだ限りでは、このイベント処理では新しくマークを追加することしかやっていないように見えます。 う〜〜ん、一瞬ツールバーアイコンをリセットしてるのは誰なんだろう・・・。
実際にアイコンを変更しているのは"
Reset"関数なのですがこの関数を呼び出しているのは、ページを読み込んだ時、マークを削除した時、全マークを削除した時に実行される関数だけでした。 そして(デバッグ方法を知らないので)各関数に警告ダイアログを表示する一行を追加し、タブを切り替えるオペレーションで表示されるかどうかテストしてみました。 ・・・表示されません。 "
Reset"関数以外にアイコンを切り替えている箇所が見つけられなかったので、行き詰ってしまいました。
ならば、最初の案でいいじゃない。 と思い直し、やはり"
onLocationChange"関数を使う線でいくことに決めました。
海行こう・・・かな?こうなると前回までの改造コードにちょいと手を加えれば完成です。 前回は問答無用で「マークありまへん」に切り替えるようにしましたので、これを条件分岐させるだけです。 では、何を条件にすればいいんだろ?
俺の知ってるアイコン切り替えの条件は「ロードされたページのURLをキーにデータファイルを検索し、登録済みならページ上にマークを復元、ツールバーアイコンを「マークありまっせ」に変更する」という現象だけです。 これはコードを読み解いたわけではなく、実際の動作とデータファイルの存在からの推測に過ぎませんので、さらにじっくりコードを読んでいかなければなりません。
先述のように、ページロードのイベントで実行される関数が登録されていました。 その名も"
LoadMarks"関数。 "
onLocationChange"関数からこいつを呼び出せば万事解決のような気がします。 ところが"
LoadMarks"関数は引数としてイベントオブジェクトを要求しています。 このヤロ〜さすがイベントハンドラだぜ。 "
onLocationChange"関数が知りうる情報は、Webプログレス(何のこっちゃ?)、リクエスト(はい?)、Location(うんうん、URLね)の各オブジェクトだけですので、"
LoadMarks"関数に渡してあげるべきデータを持っていません。 これじゃダメじゃん・・・。
イベントオブジェクトとは一体何ぞやということを知らないので、ネットに頼ってみました。 ・・・何やら奥が深そうです。 ド素人の日曜コーディングじゃとても理解できそうもありません。 ネット上で散見した"windows.event"という組み込みのオブジェクトを試しに渡してみましたが無反応でした。 イベントオブジェクトって発生源のイベント種類によって内容も構成も変わるんですかねえ? 詳しい方教えてください。
いいんですか?これで。本当に?さて、やりたいことはタブ切り替え時にアイコンも反応してくれるだけで良いのですから、なにもページロードの全処理を呼び出すこともありません。 データファイルを検索して既存か否かが分かればいいので、"
LoadMarks"関数内からその部分をコピーすればいいはずです。 ふ〜、また睨めっこかい。
で、ありました。 "
GetData"という関数はURLを渡してやると、それをキーにデータファイルを検索しにいき、既存であればマークの配置情報などを取得しているようです。 既存でなければNULL値を返してきます。
さあ、もうゴールが見ました。 "
onLocationChange"関数の中で"
GetData"関数を呼んでやり、その返り値に応じてアイコンを切り替えれば良いだけです。
果たして、望みどおりの動作を実現することができました。 巡り巡ったコードの海でしたが、なんだかあっさり解決してしまって、物事は単純にシンプルに発想すべきだなと痛感した次第です。
調子に乗ってると・・・せっかくですので、また公開しちゃいます。 何度も言いますがJavaScriptをまったく知らないド素人が趣味で作ったものです(詳しい方、是非添削おねがいします)。 突っ込んだ動作検証もまったくやっていません。 あくまで自己責任でね。 gBrainでの失敗もありますし俺を信用しちゃダメですよ?
⇒
右クリックして「名前を付けてリンク先を保存」を選択してください。<改造前キャプチャ>
以下の画像をクリックすると、Flashファイルがロードされます。(サイズ:約260KB)
<改造後キャプチャ>
以下の画像をクリックすると、Flashファイルがロードされます。(サイズ:約530KB)