pjaxでスムーズなページ遷移(静的サイトでも手軽にpjax!)
pjaxとはAjaxでコンテンツを入れ替えるのと同時にURLも変更してくれるjQueryのプラグインの名前です。
Githubのようなスムーズでイケてるページ遷移を行います。
※内容をfalsandtru版ライブラリに合わせて書き直しました。以前のdefunkt版の記事はこちら。
このページはfalsandtru版に合わせた内容になっています。APIが結構違うのでご注意下さい。falsandtru.pjax高機能&使いやすい&現状のpjaxの問題点が色々解決されているのでオススメです(๑'―'๑)۶
javascriptの「pushState」などの新しいヒストリー関数とAjaxやサーバーサイドスクリプトを組み合わせて作られているのでjQueryプラグインじゃなくても実装は可能です。実際この技術がなんと呼ばれるのかはわかりませんが、とりあえずpjax(pushState + ajax = pjax)で浸透してるみたいです。Chrome、Firefox、IE10以降などのブラウザで動作し、非対応のブラウザでは通常のページ遷移をします。
PHPで作られた素敵なCMS「」だとpjaxも非常に簡単に実装できます。
- ダウンロード
- デモ
- jQuery.pjax.jsの使い方
- 複数のエリアを設定する
- 静的サイト、またはサーバー処理をしないで実装する
- 切り替えエフェクトの付け方
- ページ読み込み時の処理
- パラメータとイベント
ダウンロード
jQuery本体と、jquery.pjax.jsをダウンロードします。
配布元のReadmeはかなり内容が濃いです。情報量が多いためパラメータなどの項目はこれからfalsandtru版ライブラリを使用する方向けにまとめています。
デモ
MODXを使ったサーバーサイド処理をしてpjaxリクエスト時に本文、ページタイトルを更新させています。
※MODX用のpjax説明ページの共用のデモページなのでパンくずからこのページへ戻れません。
動作デモページ(別窓で開きます)
jQuery.pjax.jsの使い方
サーバーサイドの処理にPHPを使った場合の遷移は以下の様な感じになります。
いまいち分かりにくくてすみません(´・ω・)
pjaxの設定
パラメータのareaで入れ替わる対象を設定して、特定のリンクに絞る場合はlinkを設定します。
以下の例はtarget属性がない全てのリンクを対象にしてクリックすると#pjaxContentが入れ替わります。
$.pjax({
area : '#pjaxContent', // 置き換えるコンテナのID
link : 'a:not([target])' // target属性が無いリンクを指定
});
クラス名をつけたりセレクタを指定する事で特定のエリアのリンクに絞り込む事もが出来ます。
以下の例は.mainの中の.pjaxというクラス名が付いたリンクだけを対象にします。
// セレクタを指定する場合はドキュメントを読み込んだあとに。
$(document).ready(function() {
$('.main').pjax({
area : '#pjaxContent',
link : 'a.pjax' // pjaxを行うリンクを限定(ない場合全てのリンクが対象)
});
});
サーバーサイドアプリ側の設定
pjaxからヘッダー(またはパラメータ)付きのAjaxリクエストが発生するので、PHPなどを使って「ヘッダーのX-Pjaxがtrueの場合はコンテナ部分だけを出力する」という条件で動的にHTML出力するようにします。PHPのgetallheaders()関数が使用できない場合は$_GET['pjax']または$_POST['pjax']で判定する事ができます。
$header = getallheaders();
if ($header['X-Pjax']) {
// pjaxリクエストの場合の処理&コンテナ内のHTMLだけ出力
} else {
// pjaxリクエストじゃない場合の処理&全てのHTMLを出力
}
?>
非pjaxリクエスト時に吐くHTML
タイトル ページタイトル