pjax利用時のJSやCSSの挙動
pjax( https://github.com/defunkt/jquery-pjax )について疑問に思った事をまとめておく。
- pjaxによるページ遷移後、titleタグの中身はどうなるの?
- pjaxによるページ遷移後、descriptionの中身はどうなるの?
- pjaxによるページ遷移後、リンク先のhead内のscriptで読むJSは実行されるの?
- pjaxによって更新されない場所のHTMLのCSSはどうなるの?
- pjaxによって更新される場所のHTMLのCSSはどうなるの?
- pjaxによって更新されない場所のHTMLにバインドされたイベントはどうなるの?
- pjaxによって更新される場所のHTMLにバインドされたイベントはどうなるの?
以下検証用HTML、CSS、JS。
pjax_test1.html
<html> <head>test1 </head> <body>div1-1div1-2div1-3div1-4div1-5div1-6pjax_test1.html pjax_test2.html </body> </html>
pjax_test2.html
<html> <head>test2 </head> <body>div2-1div2-2div2-3div2-4div2-5div1-6pjax_test1.html pjax_test2.html </body> </html>
pjax_test_common.js
alert('here is pjax_test_common.js'); jQuery(function($){ alert('here is pjax_test_common.js load'); $('#div5').click(function(){ alert('common'); }); if ($.support.pjax) { var tagname_change = '#div3'; var change_speed = 400; $('a').on('click', function(e){ e.preventDefault(); var href = $(this).attr('href'); $(tagname_change).animate({opacity: 0}, change_speed, function(){ $.pjax({ url: href, container: tagname_change, fragment: tagname_change, timeout: 2000 }); }); }); $(document).on('pjax:end', function(){ $(tagname_change).animate({opacity: 1}, change_speed); }); } });
pjax_test_1.js
alert('here is pjax_test_1.js'); jQuery(function($){ alert('here is pjax_test_1.js load'); $('#div1').click(function(){ alert(1); }); $('#div2').click(function(){ alert('titleは'+$("title").html()); alert('descriptionは'+$("meta[name=description]").attr("content")); }); });
pjax_test_2.js
alert('here is pjax_test_2.js'); jQuery(function($){ alert('here is pjax_test_2.js load'); $('#div1').click(function(){ alert(2); }); $('#div4').click(function(){ alert(2); }); $('#div6').click(function(){ alert(2); }); });
pjax_test_common.css
div { margin: 5px; } #div1 { width: 100px; height: 100px; border: 1px solid black; background-color: #FFAAAA; } #div2 { width: 100px; height: 100px; border: 1px solid black; background-color: #AAFFAA; } #div3 { width: 120px; height: 250px; border: 1px solid black; background-color: #AAAAFF; } #div4 { width: 100px; height: 100px; border: 1px solid black; background-color: #FFAAFF; } #div5 { width: 100px; height: 100px; border: 1px solid black; background-color: #FFFFAA; } #div6 { width: 100px; height: 100px; border: 1px solid black; background-color: #AAFFFF; }
pjax_test_1.css
body { background-color: #FFEEEE; }
pjax_test_2.css
body { background-color: #EEEEFF; } #div5 { width: 100px; height: 100px; border: 1px solid black; background-color: blue; }
結果
pjax_test1.html → pjax_test2.html
pjax_test2.html → pjax_test1.html
pjaxによるページ遷移後、titleタグの中身はどうなるの?
変更される。pjax_test1.html → pjax_test2.htmlで確認。遷移前は「titleはtest1」と表示されるが遷移後は「titleはtest2」と表示される。
pjaxによるページ遷移後、descriptionの中身はどうなるの?
変更されない。pjax_test1.html → pjax_test2.htmlで確認。遷移前は「descriptionはtest1」と表示され、遷移後も「descriptionはtest1」と表示される。
pjaxによるページ遷移後、リンク先のhead内のscriptで読むJSは実行されるの?
実行されない。各JSファイルにロード時にalert()を付けているが、pjax遷移後では呼び出されない。また、リンク先のhead内ではなく、更新される部分にscriptタグを書いても実行されない。なので、ページのロードが完了したら実行するJSをリンク先に書いてある場合は実行されないので注意が必要。
pjaxによって更新されない場所のHTMLのCSSはどうなるの?
遷移前のCSSが使用されるpjax_test1.html → pjax_test2.htmlで確認。pjax_test1.html ではbodyは薄い赤の背景色を指定していて、pjax_test2.html ではbodyは薄い青の背景色を指定しているが、pjaxによる遷移後もpjax_test1.html の設定が継続して利用されている。
pjaxによって更新される場所のHTMLのCSSはどうなるの?
遷移前のCSSが使用されるpjax_test1.html → pjax_test2.htmlで確認。pjax_test1.html では#div5は薄い黄色の背景色を指定していて、pjax_test2.html では#div5は濃い青の背景色を指定しているが、pjaxによる遷移後もpjax_test1.html の設定が継続して利用されている。
pjaxによって更新されない場所のHTMLにバインドされたイベントはどうなるの?
遷移前のバインドが持続される。pjax_test2.html → pjax_test1.htmlで確認。#div1をクリックした場合、遷移前も遷移後も「2」とアラートされる。遷移先のpjax_test1.htmlのクリックイベントは一切バインドされないし、遷移元のpjax_test2.htmlのクリックイベントが2重にバインドされることもない。
pjaxによって更新される場所のHTMLにバインドされたイベントはどうなるの?
何もバインドされていない。pjax_test1.html → pjax_test2.htmlで確認。
pjax_test1.htmlでは#div5をクリックすると「common」とアラート、pjax_test2.htmlでも#div5をクリックすると「common」とアラートされるが、pjaxによる遷移を行うとクリックしても何も起きない。また、pjax_test2.htmlでも#div4をクリックすると「2」とアラートされるが
pjaxによる遷移だとクリックしても何も起きない。