前回記事 までで、画像のポップアップ・ライブラリの導入設定作業は終わりました。しかし一つ、設定していないことがありました。それはスクロールすることによりページを次々に表示する、AutoPager や AutoPagerize そして AutoPatchWork に対する設定です。このため今回は簡単に、これらの設定をしてみます。
設定の仕組み
設定方法については以前、SyntaxHighlighterの設定の中で紹介している。
参考: ブログ上でプログラムソースを表示する方法⑤ AutoPager / AutoPagerize に対応させる
同じようにポップアップ・ライブラリも設定すればよい。
ページ継ぎ足し時のイベントに合わせて、必要なスクリプトを動かす必要がある。ページ継ぎ足し時に各ツールが発生させるイベントは次のようになる。
ツール | イベント |
---|---|
AutoPager | AutoPagerAfterInsert |
AutoPagerize | AutoPagerize_DOMNodeInserted |
AutoPatchWork | AutoPatchWork.DOMNodeInserted |
設定方法
それでは設定方法について考えて行こう。
SyntaxHighlighter の設定ではイベント処理用に addEventListener を利用した。しかしポップアップ・ライブラリの設定では jQuery を導入したため、今回は jQuery の機能を使ってみる。
jQuery のイベント処理では bind を利用する。以前設定した FancyBox の設定 と合わせて bind を設定すると次のようになる。
<link href='http://xxxxx/fancybox/jquery.fancybox-1.3.4.css' media='screen' rel='stylesheet' type='text/css'/> <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js' type='text/javascript'/> <script src='http://xxxxx/fancybox/jquery.fancybox-1.3.4.pack.js' type='text/javascript'/> <script type='text/javascript'> jQuery(function($){ $(document).bind('ready AutoPagerize_DOMNodeInserted AutoPagerAfterInsert AutoPatchWork.DOMNodeInserted', function(){ $("a[href*='picasaweb.google.com']:has(img)").each(function(){ $(this).fancybox({'href': this.firstChild.src.replace(/\/s\d+(?:\-c)?\/([^\/]+)$/, '/$1')}); }); $("a[href*='bp.blogspot.com']:has(img)").fancybox(); $("a[href*='up.seesaa.net']:has(img)").fancybox(); }); }); </script>追加したコードは 6と12行目だ。bind で ready / AutoPagerAfterInsert / AutoPagerize_DOMNodeInserted / AutoPatchWork.DOMNodeInserted の各イベントに処理を設定している。複数のイベントを同時に設定する記法は、jQuery 1.4 以上でサポートしている。
しかし上記の設定には問題がある。AutoPatchWork のイベント名を見て欲しい。
AutoPatchWork.DOMNodeInsertedイベント名の中にドット文字が含まれる。bind に設定するイベントにドットがあると、jQuery はドット以降を 名前空間(namespace) として認識する仕様となっている。
名前空間として認識されないような回避方法を探ってみたが、今のところ有効な設定方法を探せなかった。このため「まとめ」のように、AutoPatchWorkだけ addEventListener を使用した記述方法を採用している。
まとめ
FancyBox の設定(例)
<link href='http://xxxxx/fancybox/jquery.fancybox-1.3.4.css' media='screen' rel='stylesheet' type='text/css'/> <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js' type='text/javascript'/> <script src='http://xxxxx/fancybox/jquery.fancybox-1.3.4.pack.js' type='text/javascript'/> <script type='text/javascript'> jQuery(function($){ function handler(){ $("a[href*='picasaweb.google.com']:has(img)").each(function(){ $(this).fancybox({'href': this.firstChild.src.replace(/\/s\d+(?:\-c)?\/([^\/]+)$/, '/$1')}); }); $("a[href*='bp.blogspot.com']:has(img)").fancybox(); $("a[href*='up.seesaa.net']:has(img)").fancybox(); } $(document).bind('ready AutoPagerize_DOMNodeInserted AutoPagerAfterInsert', handler); if (window.addEventListener) { window.addEventListener('AutoPatchWork.DOMNodeInserted', handler, false); } }); </script>
参考
jQuery日本語リファレンス - bind(type, [data], fn)
jQuery日本語リファレンス - Namespaced Events