SlideShare a Scribd company logo
pjax~HTML5時代のAjaxサイトプラクティス~第19回HTML5とか勉強会こまつ けんさく
自己紹介名前: こまつけんさくHTML5とか勉強会スタッフGoogle 公認 API Expert (HTML5)Microsoft Valuable Professional (Internet Explorer)Twitter : http://twitter.com/komasshuBlog : http://blog.livedoor.jp/kotesaki/
Main ideapjaxで、より良いAjaxサイトを!!
今回の対象Ajaxを使って、サイトのコンテンツを切り替えるタイプいわゆる従来WebサイトのAjax対応
例えば
今回対象としないものばりばりのWebアプリ
AgendaAjaxのおさらいこれまでのAjaxの課題「戻る」への対応とソーシャルに優しくサーチに対応するには?全ての問題を解決するpjax
AgendaAjaxのおさらいこれまでのAjaxの課題「戻る」への対応とソーシャルに優しくサーチに対応するには?全ての問題を解決するpjax
Ajaxとは?ページを切り替えずに、データを取得/切り替える仕組みJavascriptを使い動的に利用new XMLHTTPRequest();$.ajax()XMLには限らないjsonTextHtml….
サンプル
特徴速い
安い
かっこいいAgendaAjaxのおさらいこれまでのAjaxの課題「戻る」への対応とソーシャルに優しくサーチに対応するには?全ての問題を解決するpjax
まずい書き方「戻る」で戻れないhttp://html5-19th.heroku.com/bad_ajax.html
ソーシャルに優しくない
Htmlを見ても分からない<header>     <h1>       bad ajax sample.    </h1>     - doesn't care about states ;-( -    </header>     <nav>     <ul>       <li><a href="/0">semantics</a></li>       <li><a href="/1">offline</a></li>       <li><a href="/2">device</a></li>       <li><a href="/3">connectivity</a></li>     </ul>     </nav>     <article>     </article>   </body>
検索で引っかからない
AgendaAjaxのおさらいこれまでのAjaxの課題「戻る」への対応とソーシャルに優しくサーチに対応するには?全ての問題を解決するpjax
ハッシュの利用http://html5-19th.heroku.com/hash_ajax.html
ハッシュの利用fragment identifierこれ
状態をhashで指定<nav>     <ul>       <li><a href="#0">semantics</a></li>       <li><a href="#1">offline</a></li>       <li><a href="#2">device</a></li>       <li><a href="#3">connectivity</a></li>     </ul> </nav>
Hashchange eventwindow.onhashchange = function(){    varhref = “/”+location.hash.substring(1); // ID取得      get(href); // ajax処理}See http://www.w3.org/TR/html5/history.html#hashchangeevent
効果と課題効果「戻る」に対応
ソーシャルでもOK
状態が、fragment identifierで指定されている課題サーチでは引っかからない
Javascriptoffだと見れないAgendaAjaxのおさらいこれまでのAjaxの課題「戻る」への対応とソーシャルに優しくサーチに対応するには?全ての問題を解決するpjax
Case1 : Hash-bang#!
Hash-bangこれ
Making ajaxcrawlablehttp://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html
クローラー用のURLを作成https://docs.google.com/present/view?id=dc75gmks_120cjkt2chf
http://twitter.com/?_escaped_fragment_=/komasshu
Case2 : <a>でハッシュを指定しない
普通にHTMLを記述(/0 - /3も同様)<nav>    <ul>      <li><a href="/0">semantics</a></li>      <li><a href="/1">offline</a></li>      <li><a href="/2">device</a></li>      <li><a href="/3">connectivity</a></li>    </ul>    </nav>    <article><h2>semantics</h2>      <hr>      <imgsrc="/images/semantics.jpg">      <br>ving meaning to structure, semantics are front and center with HTML5. A richer set of tags, along with RDFa, microdata, and microformats, are enabling a more useful, data driven web for both programs and your users.    </article>
Jsでトリック$("nav a").click(function(e){e.preventDefault();varhref=$(this).attr("href");location.hash=href;});window.onhashchange = function(){varhref=location.hash.substring(1);      get(href);}
参考)jquery-mobile(Automatic ajax)http://html5-19th.heroku.com/smp/
HTMLをajaxに自動変換<ul data-role="listview" data-inset="true">    <li><a href="./0">semantics</a></li>    <li><a href="./1">offline</a></li>    <li><a href="./2">device</a></li>    <li><a href="./3">connectivity</a></li>  </ul>+<script src="/javascripts/jquery.mobile-1.0b1.min.js"></script>
クローラーには普通のHTML/smp/0/smp/smp/1
更に。。。JavascriptoffのユーザーもOK!!
問題/smp/#/smp/0Javascript onJavascript offRestfulでもない。。。
AgendaAjaxのおさらいこれまでのAjaxの課題「戻る」への対応とソーシャルに優しくサーチに対応するには?全ての問題を解決するpjax
Pjaxpushstate + ajaxhttp://html5-19th.heroku.com/0
! Fragment identifier
HTMLを最初に作るprogressive enhancementhttp://html5-19th.heroku.com/1http://html5-19th.heroku.com/0
ステップ1 ページの切り替えを抑制$('nav a').each(function(e){// コンテキストメニュー(右クリックなど)の時は、pjax処理はしないif ( e.which > 1 || e.metaKey )          return truevarhref = $(this).attr('href');    $(this).click(function(e){e.preventDefault();pjaxGet(href, true);    });});
ステップ2 history apipushstatevar pjaxGet = function(file, push) {    $("article").hide();$.get("/data"+file, function(data){   $("article").html(data).fadeIn();    });if(push) {history.pushState("", “", file);    }}See. http://www.w3.org/TR/html5/history.html#history
ステップ3 popstate「戻る」への対応$(window).bind('popstate', function(e){        if(initState) {// $(window).load時のため、華麗にスルーinitState = false;            return;        }varhref=location.href.match(/[0-9]?$/)[0];pjaxGet("/"+href, false);});
専用HTML(レイアウト無し)をajaxでGEThttp://html5-19th.heroku.com/data/1
Sinatraの場合普通のHTMLget '/:id' do  @data = datas[params[:id].to_i]erb :indexendAjax用get '/data/:id' do  @data = datas[params[:id].to_i]erb :index, :layout => falseend
なので。。。「戻る」もOKソーシャルにも優しくクローラーへも対応JavascriptoffのユーザもOK
Jquery-pjaxhttps://github.com/defunkt/jquery-pjax
使い方$('nav a').pjax('article');http://example.net/2?_pjax=true( X-PJAX:true )defpjax?env['HTTP_X_PJAX']endget '/pjax-jquery/:id' do  @data = datas[params[:id].to_i]erb :index, :views => "pjax_jquery_views", :layout => !pjax?end
まとめ

More Related Content

第19回html5とか勉強会 pjax