第19回html5とか勉強会 pjax

52
PJAX HTML5 時時時 AJAX 時時時時時時時時時 時 19 時 HTML5 時時時時時 時時時 時時時時

Upload: kensaku-komatsu

Post on 15-Jan-2015

20.412 views

Category:

Technology


4 download

DESCRIPTION

pjax = pushState + ajaxのプレゼン これまでのajaxの課題を解決する、history api(pushStateなど)を使ったプラクティスです。

TRANSCRIPT

Page 1: 第19回html5とか勉強会 pjax

PJAX ~ HTML5 時代の AJAX サイトプラクティス~

第 19 回 HTML5 とか勉強会こまつ けんさく

Page 2: 第19回html5とか勉強会 pjax

自己紹介名前: こまつけんさく

HTML5 とか勉強会スタッフGoogle 公認 API Expert (HTML5)

Microsoft Valuable Professional (Internet Explorer)

Twitter : http://twitter.com/komasshu

Blog : http://blog.livedoor.jp/kotesaki/

Page 3: 第19回html5とか勉強会 pjax

MAIN IDEA

pjax で、より良いAjax サイトを !!

Page 4: 第19回html5とか勉強会 pjax

今回の対象

Ajax を使って、サイトのコンテンツを切り替えるタイプ

いわゆる従来 Web サイトの Ajax 対応

Page 5: 第19回html5とか勉強会 pjax

例えば

Page 6: 第19回html5とか勉強会 pjax

今回対象としないものばりばりの Web アプリ

Page 7: 第19回html5とか勉強会 pjax

AGENDA

Ajax のおさらい

これまでの Ajax の課題

「戻る」への対応とソーシャルに優しく

サーチに対応するには?

全ての問題を解決する pjax

Page 8: 第19回html5とか勉強会 pjax

AGENDA

Ajax のおさらい

これまでの Ajax の課題

「戻る」への対応とソーシャルに優しく

サーチに対応するには?

全ての問題を解決する pjax

Page 9: 第19回html5とか勉強会 pjax

AJAX とは?ページを切り替えずに、データを取得/切り替える仕組み

Javascript を使い動的に利用new XMLHTTPRequest();$.ajax()

XML には限らない• json• Text• Html• ….

Page 10: 第19回html5とか勉強会 pjax

サンプル

Page 11: 第19回html5とか勉強会 pjax

特徴

• 速い• 安い• かっこいい

Page 12: 第19回html5とか勉強会 pjax

AGENDA

Ajax のおさらい

これまでの Ajax の課題

「戻る」への対応とソーシャルに優しく

サーチに対応するには?

全ての問題を解決する pjax

Page 13: 第19回html5とか勉強会 pjax

まずい書き方

「戻る」で戻れない

http://html5-19th.heroku.com/bad_ajax.html

Page 14: 第19回html5とか勉強会 pjax

ソーシャルに優しくない

Page 15: 第19回html5とか勉強会 pjax

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>

Page 16: 第19回html5とか勉強会 pjax

検索で引っかからない

Page 17: 第19回html5とか勉強会 pjax

AGENDA

Ajax のおさらい

これまでの Ajax の課題

「戻る」への対応とソーシャルに優しく

サーチに対応するには?

全ての問題を解決する pjax

Page 18: 第19回html5とか勉強会 pjax

ハッシュの利用

http://html5-19th.heroku.com/hash_ajax.html

Page 19: 第19回html5とか勉強会 pjax

ハッシュの利用FRAGMENT IDENTIFIER

これ

Page 20: 第19回html5とか勉強会 pjax

状態を 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>

Page 21: 第19回html5とか勉強会 pjax

HASHCHANGE EVENT

window.onhashchange = function(){     var href = “/”+location.hash.substring(1); // ID 取得 get(href); // ajax 処理}

See http://www.w3.org/TR/html5/history.html#hashchangeevent

Page 22: 第19回html5とか勉強会 pjax

効果と課題効果• 「戻る」に対応

• ソーシャルでも OK

• 状態が、 fragment identifier で指定されている

課題• サーチでは引っかからない

• Javascript off だと見れない

Page 23: 第19回html5とか勉強会 pjax

AGENDA

Ajax のおさらい

これまでの Ajax の課題

「戻る」への対応とソーシャルに優しく

サーチに対応するには?

全ての問題を解決する pjax

Page 24: 第19回html5とか勉強会 pjax

CASE1 : HASH-BANG

#!

Page 25: 第19回html5とか勉強会 pjax

HASH-BANG

これ

Page 26: 第19回html5とか勉強会 pjax

MAKING AJAX CRAWLABLE

http://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html

Page 27: 第19回html5とか勉強会 pjax

クローラー用の URL を作成

https://docs.google.com/present/view?id=dc75gmks_120cjkt2chf

Page 28: 第19回html5とか勉強会 pjax

HTTP://TWITTER.COM/?_ESCAPED_FRAGMENT_=/KOMASSHU

Page 29: 第19回html5とか勉強会 pjax

CASE2 : <A> でハッシュを指定しない

Page 30: 第19回html5とか勉強会 pjax

普通に 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> <img src="/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>

Page 31: 第19回html5とか勉強会 pjax

JS でトリック

$("nav a").click(function(e){ e.preventDefault(); var href=$(this).attr("href"); location.hash=href;});

window.onhashchange = function(){ var href=location.hash.substring(1); get(href);}

Page 32: 第19回html5とか勉強会 pjax

参考) JQUERY-MOBILE(AUTOMATIC AJAX)

http://html5-19th.heroku.com/smp/

Page 33: 第19回html5とか勉強会 pjax

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>

Page 34: 第19回html5とか勉強会 pjax

クローラーには普通のHTML

/smp

/smp/0

/smp/1

Page 35: 第19回html5とか勉強会 pjax

更に。。。

Javascript off のユーザーも OK!!

Page 36: 第19回html5とか勉強会 pjax

問題/smp/#/smp/0

Javascript on Javascript off

Restful でもない。。。

Page 37: 第19回html5とか勉強会 pjax

AGENDA

Ajax のおさらい

これまでの Ajax の課題

「戻る」への対応とソーシャルに優しく

サーチに対応するには?

全ての問題を解決する pjax

Page 38: 第19回html5とか勉強会 pjax

PJAXPUSHSTATE + AJAX

http://html5-19th.heroku.com/0

Page 39: 第19回html5とか勉強会 pjax

! FRAGMENT IDENTIFIER

Page 40: 第19回html5とか勉強会 pjax

HTML を最初に作るPROGRESSIVE ENHANCEMENT

http://html5-19th.heroku.com/0 http://html5-19th.heroku.com/1

Page 41: 第19回html5とか勉強会 pjax

ステップ 1 ページの切り替えを抑制

$('nav a').each(function(e){ // コンテキストメニュー ( 右クリックなど)の時は、 pjax 処理はしない if ( e.which > 1 || e.metaKey ) return true

var href = $(this).attr('href'); $(this).click(function(e){ e.preventDefault(); pjaxGet(href, true); });});

Page 42: 第19回html5とか勉強会 pjax

ステップ 2 HISTORY APIPUSHSTATE

var 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

Page 43: 第19回html5とか勉強会 pjax

ステップ 3 POPSTATE「戻る」への対応

$(window).bind('popstate', function(e){ if(initState) { // $(window).load 時のため、華麗にスルー initState = false; return; } var href=location.href.match(/[0-9]?$/)[0]; pjaxGet("/"+href, false);});

Page 44: 第19回html5とか勉強会 pjax

専用 HTML( レイアウト無し ) を AJAX で GET

http://html5-19th.heroku.com/data/1

Page 45: 第19回html5とか勉強会 pjax

SINATRA の場合

get '/data/:id' do @data = datas[params[:id].to_i] erb :index, :layout => falseend

get '/:id' do @data = datas[params[:id].to_i] erb :indexend

普通の HTML

Ajax 用

Page 46: 第19回html5とか勉強会 pjax

なので。。。「戻る」も OK

ソーシャルにも優しく

クローラーへも対応

Javascript off のユーザも OK

Page 47: 第19回html5とか勉強会 pjax

JQUERY-PJAX

https://github.com/defunkt/jquery-pjax

Page 48: 第19回html5とか勉強会 pjax

使い方$('nav a').pjax('article');

def pjax? env['HTTP_X_PJAX']end

get '/pjax-jquery/:id' do @data = datas[params[:id].to_i] erb :index, :views => "pjax_jquery_views", :layout => !pjax?end

http://example.net/2?_pjax=true( X-PJAX:true )

Page 49: 第19回html5とか勉強会 pjax

まとめ何も

考えないAjax

Hash(Fragment Identifier)

Hash 改善版(HASH-BANG な

ど)pjax

Ajax 動作 ○ ○ ○ ○

「戻る」への対応

× ○ ○ ○

ソーシャルへの対応 (js on)

× ○ ○ ○

クローラーへの対応

× × ○ ○

ソーシャルへの対応( js off)

× × × ○

HTML5 的要素 N/A hashchange hashchange History API(pushState etc.)

ブラウザサポート ○

IE(> 8), FF4, Chrome10,

Safari5, Opera11.5

IE(> 8), FF4, Chrome10, Safari5,

Opera11.5

FF4, Chrome10,

Safari5,Opera11.5

pollyfill - $.hashchange() $.hashchange() -

Page 50: 第19回html5とか勉強会 pjax

今回のソースコード

https://github.com/KensakuKOMATSU/19th_techtalk_pjax

Page 51: 第19回html5とか勉強会 pjax

GITHUB も PJAX

Page 52: 第19回html5とか勉強会 pjax

THANK YOU!!

http://pjax.heroku.com/