AutoPagerizeの動作の流れを追え!
こんな感じです。というか、こんな感じでよいでしょうか?taizoooさん。
http://d.hatena.ne.jp/os0x/20090508/1241780936
thx!!! os0x
以下、自分のわかりやすいように書き換え中。
function 名まで入れればもっと、わかりやすくなるかな?
発火
-
- ページの読み込み
- Greasemonkey起動(この辺は省略)
- AutoPagerize起動
SITEINFOの読み込み
-
- script に書き込まれている SITEINFO を試す[launchAutoPager(SITEINFO)]
- SITEINFO_IMPORT_URLS の SITEINFO を試す(wedata)[SITEINFO_IMPORT_URL.forEach(funciton(i){})]
- hAutopagerize な microformats な SITEINFO を試す[launchAutoPager([MICROFORMAT])]
- rel="next" と class="autopagerize_insert_before" と class="autopagerize_page_element"
SITEINFO のチェック[launchAutoPager]
初期化処理 [AutoPager]
-
- 次のページのURL取得
- getNextURL
- resolvePath
- getNextURL
- 差込位置の決定、insertBeforeか、pageElementの最後の次の要素
- 最後の要素が取れなかったときには text node を作って(document.createTextNode(' '))その前に差し込み位置を作っている
- 右上アイコン・ヘルプの設置
- initIcon, initHelp, viewHelp
- addEventListener("mouseover", function(){self.viewHelp()}, true)
- スクロール監視の開始(マウスイベントで onScroll を呼ぶ)
- this.scroll - function(){ self.onScroll() }
- window.addEventListener("scroll", this.scroll, false)
- 読み込み開始位置の決定(どこまでスクロールしたら次のページを読み込むかは、ページ全体の高さ、pageElementの位置、BASE_REMAIN_HEIGHTで決まる)
- remainHeight を計算
- getPageElementsBottom, getElementBottom, getElementPosition, getScrollHeight
- remainHeight を計算
- 初期化後、一発目の onScroll を呼ぶ
- 次のページのURL取得
現在のスクロール位置が、読み込み開始位置を超えていないかチェック。閾値を超えたらリクエストを投げる[AutoPager.onScroll] (※)
-
- onScroll が呼び出されるのは 1)初期化後 2)マウスイベント 3)ページを継ぎ足した後
- var remain = scrollHeight - window.innerHeight = window.scrollY
- 閾値を越えたら request を呼ぶ
GM_xmlhttpRequestで次のページにリクエストを投げる[AutoPager.request]
-
- 投げる直前に opt に requestFilters 適用
- GM_xmlhttpRequest でレスポンスを受けとる
- requestLoad を呼ぶ
レスポンスからHTMLテキストを受け取り、そのテキストからドキュメントを作成する(通常、ドキュメントの作成はブラウザが勝手に行うので、JavaScriptでドキュメントを作成することは滅多にない。そういう意味で、AutoPagerizeの肝になる部分。)[AutoPager.requestLoad]
-
- 返ってきたレスポンスに responseFilters 適用
- createHTMLDocumentByString で HTML ドキュメントを生成
- documentFilters 適用
- 作成したドキュメントから pageElement を切り出す[getElementByXPath]
- 同じくドキュメントから nextLink を取得[getNextURL]
- pageElement が取得できていなかったら停止[terminate]
- 右上のアイコン表示を青にして、消すだけ
- 切り出した要素をページに継ぎ足す[addPage]
- filters 適用
- ページ継ぎ足し後、一発目の onScroll を呼ぶ
- nextLink が取得できていなかったら停止[terminate]
- 右上のアイコン表示を青にして、消すだけ
- ここの順番が、onScroll を呼んどいてからなのはなんでだろう?
(※) に戻る
細かいところはわからないので核心部分の流れだけ、一応、全部追ってみた。結構かかった。遊び、あそびで一週間。こんどはこれを整理整頓するのと、個々個々の部分のコードを追ってみるというのをやってみるかな。
あわせて読む。