Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2008-12-24

LDR/Fastladderのソース読んでる

18:11

ここに書いてあることは、後日別のところに書くための自分用メモです。


ページをこのように開くこともできる。

http://reader.livedoor.com/reader/#guide
http://reader.livedoor.com/reader/#manage
http://reader.livedoor.com/reader/#config

ハッシュ無しの URL の場合は #guide と同じ。#config は静的なページであり、#guide より読み込む画像等が少ないため、少し速くなるかもしれない。


init は、他の部分が全部読み終わってから実行する。ここでフィードリストを取得したりガイドページを読み込んだりする。

Fastladder は HTML の最後にこういう↓部分があり、本体の JavaScript ファイルを実行した直後に init を実行しているが、 LDR はしていない。

<script type="text/javascript" charset="UTF-8" src="/js/fl_aio.0.3.2.js"></script>
<script type="text/javascript">init();</script>

init は window.onload にもなっているので、LDR ではこちらで動いてる。実はタイミングが違う。Fastladder は海外からのアクセスを想定しているので、画像などを読み込んで load を出すまでに多少時間がかかる。全部待たずに init を実行したほうが速いはず。

一度実行されるとフラグが立って次からは実行されない。というか init が呼ばれてすぐに return する。

LDR で動く Greasemonkey スクリプトが Fastladder で動かなかったりするのは、これに起因することが多い気がする。

つまり Fastladder では init() より前に自由に操作を挿入することができないので、それだけ自由が制限される。

例えば、普通ならフィードリストを読み込んだ後で「s」を押さないと prefetch を実行しないが、読み込んだ瞬間に prefetch してくれるようなスクリプト

// prefetch first 3 feeds onload
register_hook("AFTER_SUBS_LOAD", function(){
    window.Ordered.list.slice(0,3).forEach(prefetch);
});

は LDR では正常に動くはずだが Fastladder では動かないはず。あとで試す。


LDR/Fastladder は親切にもこれだけフックできるタイミングが用意されているが、BEFORE_INIT や AFTER_INIT などは Fastladder では使えないはず。

LDR.trigger = new Class.Trigger(
	// Window LOAD/UNLOAD
	'AFTER_LOAD','BEFORE_UNLOAD',
	// Application INIT
	'BEFORE_INIT', 'AFTER_INIT',
	'BEFORE_CONFIGLOAD','AFTER_CONFIGLOAD',
	// sub contents
	'AFTER_INIT_CONFIG','AFTER_INIT_GUIDE','AFTER_INIT_MANAGE',
	// EVENT
	'WINDOW_RESIZE',
	'BEFORE_ANYKEYDOWN','AFTER_ANYKEYDOWN',
	'BEFORE_SUBS_LOAD','AFTER_SUBS_LOAD',
	'BEFORE_PRINTFEED','AFTER_PRINTFEED','COMPLATE_PRINTFEED'
);

init 以降に使われる関数や変数を書き換えることも容易にできる。グローバル関数が多くて嬉しい。

例えば、ガイドページの変わりに自分専用のトップページを表示するためにこういうスクリプトを書いたとする。

// show custom page instead of guide page
window.init_custom = function(){
  var h = '<div style="font-size:700%;text-align:center;">Welcome!</div>';
  $('right_body').innerHTML = h;
  invoke_hook('AFTER_INIT_GUIDE');
}
window.default_right_init = init_custom;

これは LDR では動くが Fastladder では動かないはず。あとで試す。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20081224
 |