« 失われたエントリの復旧は簡単 | Main | 完成版 HaloScan のコメント数を全部表示する »
このブログで採用しているより障害に強い HaloScan 利用方法(参照「Thingamablog にコメントとトラックバックを付ける」)を、他のブログのエントリ「HaloScan のコメント数が改善されました」で述べた HaloScan の仕様変更に対応させてみた。
これに伴いテンプレートセット Mac_Stripe-XHTML_Strict-ja をアップデートした。
この度の HaloScan の仕様変更により、今までコメント数が表示されなかった古いコメントスレッドもコメント数が表示できるようになった。しかしここで採用している(そして Mac_Stripe-XHTML_Strict-ja に埋め込まれている)方法で HaloScan を利用しているとそれを享受できない。
そこでテンプレートセットと JavaScript ファイル に改良を加えた。変更点は次のとおり。
head 要素の中の一番最後に次を追加した。
<script type="text/javascript"><!--
var ThreadIDs = new Array;
<BlogEntry>if (hs['entry_<$EntryID$>'] == undefined) ThreadIDs[ThreadIDs.length] = 'entry_<$EntryID$>';
</BlogEntry>
HaloScanLoad('<$HaloScanAccount$>', ThreadIDs);
// --></script>
テンプレートで使用している JavaScript 関数 HaloScanLoad を定義した。定義内容は次のとおり。
function HaloScanLoad(account, threadIDs, elmt) {
if (document.createElement && threadIDs.length > 0) {
var scriptElmt = document.createElement('script');
scriptElmt.src = 'http://www.haloscan.com/load/'
+ account
+ '/?c='
+ ThreadIDs.join('+');
scriptElmt.type = 'text/javascript';
try {
if (!elmt) {
elmt = document.getElementByTagName('head');
elmt = elmt[0];
}
elmt.appendChild(scriptElmt);
}
catch (e) {
}
}
}
http://www.haloscan.com/load/HaloScanアカウント名 によってコメント数とトラックバット数を格納した JavaScript の配列をロードするのは従来通り。その上で、そのページでコメント数が欲しい各コメントスレッドについて(テンプレートの <BlogEntry> </BlogEntry> という部分)、コメント数が取得できていないとき(テンプレートの if (hs['entry_<$EntryID$>'] == undefined) の部分)ものは、そのページでコメント数が欲しいコメントスレッドの ID として記憶する(テンプレートの ThreadIDs[ThreadIDs.length] = 'entry_<$EntryID$>' の部分)。
その記憶したコメント数が欲しいコメントスレッドの ID 達と自分の HaloScan アカウント名について HaloScan にコメント数を要求する(テンプレートの HaloScanLoad('<$HaloScanAccount$>', ThreadIDs) の部分)。
JavaScript 関数 HaloScanAccount は HaloScan に要求する URL を生成し、それをロードするコードを head 要素の一番後ろに加えるようになっている。
この関数が実行されるときには head 要素はまだ読み終わっていないので、ブラウザは head 要素の終端(</head>)を読む直前に HaloScanAccount によって追加されたコードを解釈する。
以上によりページの body 要素の解釈が始まる前に全ての必要なコメントスレッドのコメント数が(もしあれば)ロードされるというようになっている。