2011年6月19日日曜日

ブログ画像のポップアップ表示を簡単に導入する方法④ AutoPager / AutoPagerize に対応させる

前回記事 までで、画像のポップアップ・ライブラリの導入設定作業は終わりました。しかし一つ、設定していないことがありました。それはスクロールすることによりページを次々に表示する、AutoPagerAutoPagerize そして AutoPatchWork に対する設定です。このため今回は簡単に、これらの設定をしてみます。

設定の仕組み

設定方法については以前、SyntaxHighlighterの設定の中で紹介している。

参考: ブログ上でプログラムソースを表示する方法⑤ AutoPager / AutoPagerize に対応させる

同じようにポップアップ・ライブラリも設定すればよい。

ページ継ぎ足し時のイベントに合わせて、必要なスクリプトを動かす必要がある。ページ継ぎ足し時に各ツールが発生させるイベントは次のようになる。

ツールイベント
AutoPagerAutoPagerAfterInsert
AutoPagerizeAutoPagerize_DOMNodeInserted
AutoPatchWorkAutoPatchWork.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>
他のライブラリを使用している場合も、6行目 及び 12~16行目 を同様に追加すれば設定可能だ。

参考
jQuery日本語リファレンス - bind(type, [data], fn)
jQuery日本語リファレンス - Namespaced Events