2010-03-01
Progress Listenersでロケーションバーのurl変更されたときに何かする
javascript, firefox | |
firefoxの拡張機能開発メモ. 戻るボタンが押されたり, タブが切り替わったり, ページがロードされるなど表示されているページが切り替わるタイミングで何か実行したい. 調べてみるとProgress Listenersというものを使えば実現できるようです.
正直, めちゃくちゃ理解が曖昧なんですが, こうやるとできましたというメモです.
Progress Listeners
Progress listenersを使うとロケーションバーのurlの変化をイベントとして扱うことができるようになります. ロケーションバーのurlが変化するタイミングとは, ページがロードされた, タブが切り替わった, 戻る・進むボタンが押されたなどの場合です.
ちなみに, 単にページロードのイベントが欲しいだけだったら, onPageLoadを使った方が簡単です. Progress Listenersはそれよりも細かい条件を指定できます.
方法は, 基本的に上記チュートリアルのサンプルコードの通りにすればできます. nsIWebProgressというインタフェースを実装して, それをgBrowserのaddProgressListener()というメソッドでブラウザに渡します. 以下の関数を実装して, ひとつのオブジェクトにまとめて, addProgressListenerに引数として渡します. 今回の用途だと, onLocationChangeだけ実装すれば大丈夫です.
Listening to events on all tabs - MDN
- onStateChange
- onLocationChange
- onProgressChange
- onStatusChange
- onSecurityChange
- onLinkIconAvailable
コード全体はこんな感じ.
window.addEventListener('load', function() { myExtension.init(); }, false); window.addEventListener("unload", function() { myExtension.uninit(); }, false); var myExtension = { // 古いurlを保存 oldUrl: null, // nsIWebProgressインタフェースの実装 urlBarListener: { QueryInterface: function(aIID) { if (aIID.equals(Components.interfaces.nsIWebProgressListener) || aIID.equals(Components.interfaces.nsISupportsWeakReference) || aIID.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; }, // 現在のタブのドキュメントのURIが変更されたらコールされる onLocationChange: function(aProgress, aRequest, aUri) { myExtension.processNewUrl(aUri); }, onStateChange: function() {}, onProgressChange: function() {}, onStatusChange: function() {}, onSecurityChange: function() {}, onLinkIconAvailable: function() {} }, // progress listener を追加する init: function() { gBrowser.addProgressListener(myExtension.urlBarListener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT); }, // progress listener を削除する uninit: function() { gBrowser.removeProgressListener(myExtension.urlBarListener); }, // urlが変わっていたら何かする processNewUrl: function(aUri) { if (aUri.spec == myExtension.oldUrl) return; // ここにコードを書く myExtension.oldUrl = aUri.spec; } };
参考
- Progress Listeners - MDN
- Listening to events on all tabs - MDN
- あとはAutopagerの中でこの処理が使われていたので参考にしました.
コメントを書く
トラックバック - http://d.hatena.ne.jp/cou929_la/20100301/1267434283
リンク元
- 9 http://www.google.co.jp/url?sa=t&rct=j&q=javascript url 紊????&source=web&cd=4&ved=0CEkQFjAD&url=http://d.hatena.ne.jp/cou929_la/20100301/1267434283&ei=OlKkTum7K8yVmQWFxamADw&usg=AFQjCNHXNNaIvBZEz2wE_WJn-AqNulUuPg&sig2=_qTBe_HV
- 7 http://webcache.googleusercontent.com/search?q=cache:XJiy-OvMEhYJ:d.hatena.ne.jp/cou929_la/20100225/1267073048+dvipdfmx+オプション+印刷&cd=2&hl=ja&ct=clnk&gl=jp
- 7 http://www.google.co.jp/search?q=nsIWebProgress&hl=ja&client=firefox-a&hs=UNg&rls=org.mozilla:ja:official&prmd=ivns&ei=uOOVTdf9D5DcvQOR3JjxCw&start=10&sa=N
- 6 http://twitter.com/cou929
- 5 http://www.google.co.jp/search?q=javascript+url+変更&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&hl=ja&client=firefox-a
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDoQFjAB&url=http://d.hatena.ne.jp/cou929_la/20100301/1267434283&ei=D5JqT7OEA6zDmQW6v62mBg&usg=AFQjCNHXNNaIvBZEz2wE_WJn-AqNulUuPg
- 4 http://d.hatena.ne.jp/
- 4 http://efcl.info/2010/0821/res1906/
- 4 http://search.yahoo.co.jp/search?p=nsIWebProgress+Javascript&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&x=wrt
- 4 http://www.google.co.jp/search?q=nsIWebProgress&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:unofficial&client=firefox-a


