AutoPagerizeのSITEINFOを使って本文以外を消してしまう実験
oAutoPagerize が入っているなら 0AutoPagerize.SITEINFO.js が入っているはずなので、それをおもしろいことに使えないかと思って、本文以外の要素を表示しないスクリプトを作ってみた。
実験的に作ったものでクロスブラウザとか考えていない。DOMContentLoaded があるので Opera でしか動かないはず。あまりちゃんとメンテするつもりはないので使用はお勧めしない。誰かが改良して役に立つことがあるかもしれないので作ってみた。
- cleanAutoPagerize.js
- gist: 52875 - GitHub
まず、SITEINFO はグローバルスコープに作られて、oAutoPagerize 実行時点で破棄されるため、その間に捕捉しておく必要がある。(名前順にスクリプトを読み込むと cleanAutoPagerize.js は 0AutoPagerize.SITEINFO.js と oAutoPagerize.js の間になる)
SITEINFO の走査その他もろもろは oAutoPagerize のコードからパクらせてもらった。
肝心のところは、ページ内要素を調べて本文 (=pageElement の XPath にマッチする要素とその先祖要素) には AP_clean_element、不要な要素に AP_dirty_element というクラスを付けている。
それから、SITEINFO を2回も走査するのは嫌なので、oAutoPagerize には走査済みのやつ (=URL の正規表現にマッチするもののみ) を渡すことにしてある。
問題は、DOMContentLoaded 時点では既にページのレイアウトが出来上がって要素の読み込みも始まっているので、それを途中で非表示にするのはどうしても目立つ。
しかも、せっかく Opera では display:none な要素は読み込まないという利点があるのに、読み込みが始まっていてはこれも効果がなくなる。個人的にはこの利点を捨てるのはどうしても惜しいので、まずドキュメント要素を全部非表示にするスタイルを当てておいて、クラスの割り振り完了後にそれを取り除いている。
これによって、ページの読み込みが (見た目上は) 遅くなってしまう。
まあページを常にバックグラウンドで開くような人は気にならないだろう。
非表示にするところはスクリプトではやってないので (やることも出来るけど)、こういう CSS を作って Opera の user CSS フォルダに入れておいた。(Opera が認識するためには再起動が必要)
- cleanAutoPagerize.css
@namespace url(http://www.w3.org/1999/xhtml); /* Name: user:edvakf:cleanAutoPagerize.css */ [class~="AP_dirty_element"]:not([id="autopagerize_icon"]){display:none!important;}
好きに切り替えできるのがいいかなと思ったので。
やってみたのだけど、やっぱりページ内ナビゲーション要素とか (=サイドバーなど) は無くなると不都合があると思った。
もうしばらく使ってみる。
やっぱり非表示と表示をブックマークレットで切り替えることにした。
今日のアップデート版からスタイルシートをグローバル変数に入れることにしたので、
javascript:if(window.apclean){if(apclean.disabled==true)apclean.disabled=false;else{apclean.disabled=true}};void(0);
こんなブックマークレットで切り替えできる。
DOMContentLoaded でページ要素を全部非表示にしているため、oAutoPagerize の以下の部分の判定がうまくいかなくなってしまう。どうしたもんか。
var docRoot = document.documentElement.clientHeight <= document.body.clientHeight ? document.documentElement : document.body;