addFilterメソッドでいける!?

あれやこれやググった結果、AutoPagerizeで追加されたページに対してもuserscriptを適用させたい時は、addFilterメソッドにさせたい処理を渡せばいけるのでは?と思い、試しにやってみた。

ソース

// ==UserScript==
// @name           chiebukuroUsefulPointGetter
// @namespace      http://d.hatena.ne.jp/so_blue/
// @include        http://my.chiebukuro.yahoo.co.jp/my/myspace_ansdetail.php*
// ==/UserScript==
(function(){

	function func() {
		//公開idの取得
		var oid = document.getElementsByClassName('yjmthloginarea')[1].getElementsByTagName('B')[0].textContent;

		//解決済みの行だけ取得
		var xpath = '/descendant::img[@alt=\'\u89e3\u6c7a\u6e08\u307f\']';
		var r = document.evaluate(xpath, document.body, null, 7, null);
		var re = new RegExp('\\d+', 'ig');
		for (var i = 0, len = r.snapshotLength; i < len; i++) {
			var sURL = r.snapshotItem(i).parentNode.getElementsByTagName('A')[0].href.split('\*-')[1];
			GM_xmlhttpRequest({
				method: 'GET',
				url: sURL,
				onload: setUsefulPoint(i)
			});
		}

		//お役立ちポイントの取得
		function setUsefulPoint(nodeIndex) {
			return function(req) {
				var x = document.createElement('DIV');
				x.innerHTML = req.responseText;

				//お役立ちポイントを y / x みたいな風に加工する
				var t = x.getElementsByClassName('useful')[0].getElementsByTagName('P')[0].textContent;
				var s = t.split('\u4eba\u4e2d');
				var s1 = s[0].match(re).join('');
				var s2 = s[1].match(re).join('');
				s = s2 + ' / ' + s1;
				var elmSPAN = document.createElement('SPAN');
				elmSPAN.setAttribute('style', 'border: solid 1px #ccc; width: 3em; display: inline-block; text-align: center; font-size: small; -moz-border-radius: 5px; margin-left: 10px; padding: 2px;');
				//elmSPAN.style.padding = '3px';

				//ベストアンサーが自分かどうかを判定して、自分の場合は
				//背景色をピンクに変える
				var baid = x.getElementsByClassName('bestAnswer Extends-details')[0].getElementsByTagName('EM')[0].textContent;
				if (baid == oid) elmSPAN.style.backgroundColor = 'pink';

				elmSPAN.textContent = s;
				r.snapshotItem(nodeIndex).parentNode.parentNode.getElementsByTagName('DIV')[0].appendChild(elmSPAN);

			}
		}
	}

	//AutoPagerizeで継ぎ足されたページにも適用させられるかの検証
	if (window.AutoPagerize) { window.AutoPagerize.addFilter(func); }
	
})();

とりあえず確認したかっただけなので、一旦、今回のグリモン自体を一つの関数にして、それをaddFilterに渡してみた。

試してみて

継ぎ足されたページに対してもグリモンが動いた!! …のはいいんだけど、このソースだと

  1. 継ぎ足される度に元ページ〜最新のページにグリモンが動く
  2. ページを進めていくほど時間がかかる
  3. ページが継ぎ足されてからでないとグリモンが動かない(最初にページ開いた時にはグリモンが動かない)

といった新たな問題が。
3はすぐ対応出来そうなんでいいとして、1を対応するとなると最初に差分をとって、差分に対してだけグリモンを動かすみたいにしないと駄目って事だな。AutoPagerize側でもページ管理的な事はしてないのかな?もっとAutoPagerizeのソースを読んでみたり*1、他のグリモンのソースを参考にしたりするか。

とはいえ

新たな問題が出てきたけど、AutoPagerizeで継ぎ足されたページに対してもグリモンを動かす事が出来たのは収穫。
ほんの少しだけど前進。
-

*1:って、ろくに読めもしないくせに…orz