際際滷

際際滷Share a Scribd company logo
Introduction DOM Storage and Inside Ex DOM Storage library Toru Yamaguchi id:ZIGOROu <zigorou@cpan.org>
アジェンダ DOM Storage  ってなんだよ localStorage  と  sessionStorage Cookie  との`い Inside Ex DOM Storage  Behavior  の児A岑R userData Behavior  HTML Component Behavior onpropertychange  Ex DOM Storage  のこれから
DOM Storage とは DOM Storage  とは採か DOM Storage  とは  JavaScript  から夛晒されたデ`タをクライアントサイドに隠贋する室gで  HTML 5  でカ┐気譴討い http://www.whatwg.org/specs/web-apps/current-work/#structured-client-side-storage Fr泣では  IE8, Fx2, Fx3, Safari 4  などで旋喘竃栖る DOM Storage  には喟Aデ`タ隠贋喘の  localStorage   とセッションデ`タ隠贋喘の  sessionStorage   がある 慌に  key-value  侘塀でデ`タを  String  として隠贋竃栖る
localStorage localStorage host  g了 で嗤燭篇西A議なクライアントサイドキャッシュです if  (localStorage.foo)  {   // 2 指朕參週のアクセス console.log(localStorage.foo);  }   else   {   //  兜指のアクセス localStorage.foo = ^bar ̄;  }
sessionStorage sessionStorage host  g了で嗤燭如▲屮薀Ε兇鱸]じるとえます また  sessionStorage  は  window  オブジェクトごとに護り輝てられます
Storage interface Storage interface interface  Storage  { readonly attribute unsigned long  length ; [IndexGetter] DOMString  key (in unsigned long index); [NameGetter] DOMString  getItem (in DOMString key); [NameSetter] void  setItem (in DOMString key, in DOMString data); [XXX] void  removeItem (in DOMString key); void  clear (); };
StorageEvent interface Storage interface interface  Storage  { readonly attribute unsigned long  length ; [IndexGetter] DOMString  key (in unsigned long index); [NameGetter] DOMString  getItem (in DOMString key); [NameSetter] void  setItem (in DOMString key, in DOMString data); [XXX] void  removeItem (in DOMString key); void  clear (); };
Storage interface Storage interface interface  StorageEvent  : Event {  readonly attribute DOMString  key ;  readonly attribute DOMString  oldValue ; readonly attribute DOMString newValue; readonly attribute DOMString  url ; readonly attribute  Window   source ; void  initStorageEvent ( in DOMString typeArg, in boolean canBubbleArg,  in boolean cancelableArg, in DOMString keyArg,  in DOMString oldValueArg, in DOMString newValueArg,  in DOMString urlArg, in Window sourceArg);  void  initStorageEventNS ( in DOMString namespaceURI, in DOMString typeArg,  in boolean canBubbleArg, in boolean cancelableArg,  in DOMString keyArg, in DOMString oldValueArg,  in DOMString newValueArg, in DOMString urlArg,  in Window sourceArg);  };
Storage event (1) Storage event setItem(), removeItem()  犁韻I尖がg佩された栽に  storage  イベントがk伏します。 鵑箸覆辰  key  式び、仟症の、  event  オブジェクトに秘ってます clear()  メソッドがg佩された栽も  storage  イベントがk伏します。 event.key, event.oldValue, event.newValue  プロパティは  null  になっている  localStorage  の栽は、揖匯ホストで慌嗤されるので、 storage  イベントはg鏡の  window  だけに宥岑されるのではなく、vSする畠ての  window  に  fire  されます。 event.source  プロパティに  localStorage  への筝を佩った  window  オブジェクトが秘ります
Storage event (2) sample var  l =  function (evt)  {   console.log(^key:  ̄ + evt.key); console.log(^oldValue:  ̄ + evt.oldValue); console.log(^newValue: ^ + evt.newValue);  } ;  window .addEventListener( &quot;storage&quot; , l,  false );
Cookie vs DOM Storage (1) 嗤親斛 Cookie  は  expire  を峺協すれば販吭の豚gまで峺協でき、峺協しない栽はブラウザを]じるとえる localStorage  は苧幣議にさない泙衽西A議。 sessionStorage  はブラウザを]じるとえる。 つまり峺協r震でえるような  Storage  を聞いたければ  localStorage  を採らかの圭隈で砿尖する駅勣がある
Cookie vs DOM Storage (2) 否楚 IE  の栽、 Cookie  は  4096 byte  までしか隠贋竃栖ず、また  key-value  のペアは  20  が貧沺 IE  の栽、 DOM Storage  には  10MB  ほど隠贋できる API Cookie  は  document.cookie  プロパティを喘いるが  getter/setter  の咾Oめてキモイ DOM Storage  は宥械の  Object  をハッシュのようにQうのと揖じように ( つまりプロパティ旗秘が ) 聞えるし、またきちんとメソッド  (getItem, setItem, removeItem, clear)  U喇でも荷恬竃栖る
Cookie vs DOM Storage (3) 軆發之屬る  Cookie vs DOM Storage  の慌嗤 same host ( domain, path はO協してない彜B )  Window 1 Window 2 Window 3 Window 4 Window 5 localStorage / Cookie sessionStorage
IE6, 7 で聞えないEx DOM Storage で竃栖るよ Ex DOM Storage IE6, IE7  で聞える  DOM Storage  ライブラリ 彎恬です http://coderepos.org/share/wiki/ExDOMStorage 書晩のメインの Inside Ex DOM Storage }泣と書瘁について
Ex DOM Storage の嶄附の古待 Ex DOM Storage  で旋喘しているニッチ室gの古勣 userData Behavior  HTML Component Behavior onpropertychange  による旗秘奮
Behavior の児A岑R Behavior  とは採か 瘁から販吭の勣殆にプロパティ、メソッド、イベントやイベントハンドラを弖紗できるMみを  DHTML Behavior  と冱う 屡にラつかの  Behavior Library  がMみzまれている #default#userData #default#VML カスタムの  Behavior  を  HTML Component  と冱う Mozilla  の  XBL (XML Binding Language)  は  HTC  のパクリ
userData Behavior (1)  userData Behavior  とは IE  にデフォルトで原いてくる  Behavior  ライブラリの匯つ もろにクライアントサイドストレ`ジ、聞い圭も階g element.addBehavior( &quot;#default#userData&quot; );  element.load( ^my Storage  ̄ ); //  iみzみ element.setAttribute( ^myData ̄ ,  ^blah blah ̄ ); //  、淋O協  element.save( ^my Storage  ̄ );  //  きzみ
userData Behavior (2) userData Behavior  の嗤森 host  g了で隠贋されるので  DOM Storage  と揖じ。 key-value  のO協 恷兜は  attribute  として  key  を燕Fしようと房ったのだが、 userData Behavior  をm喘した  element  の栽、 attribute  の双い貧返く佩かない ( 碧っぽぃ ) JSON  で融っzむ並に。
userData Behavior (3) Lock 竃栖ない Window (1) Window (2) load(skey) setAttribute(key, value) save(skey) load(skey) このr泣で、 value  には  JSON  デ`タが秘る。 { foo: ^blah ̄ }  とかそういう。 Window (1) の load() 念のデ`タが函れてしまう。參和待升
HTML Component Behavior (1)  HTC  のサンプル  <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot;?> <public:component  xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:public=&quot;urn:HTMLComponent&quot;> <script type=&quot;text/javascript^ src=/slideshow/client-side-cache-presentation/826166/^/path/to/src.jp ̄></script> <public:attach  event=&quot;oncontentready&quot;  onevent=&quot;handlers.contentready(event);^ for=&quot;element&quot; /> <public:attach  event=&quot;onresize^ onevent=&quot;handlers.resize(event);^ for=&quot;window&quot; /> </public:component>
HTC Component Behavior (2) HTC  の旋泣 勣殆の咾魃否^議徭喇にQめる並が竃栖る 峺協した  width  を富なくとも_隠するような咾箸  (c.f. min-width) 販吭のメソッドを伏やしたり あるいは  property  にする  getter/setter  を蒙協の  JavaScript  メソッドに護り輝てたり IE  は  defineGetter, defineSetter  が贋壓しない readonly  のプロパティが恬れ、さらに麻Y惚などを卦せる length  プロパティとかに聞える
HTML Component Behavior (3) HTC の塘佚rの廣吭 HTC  は  text/x-component  で塘佚 AddType text/x-component .htc HTC  のロ`ド  - 3 N PI 凋綜として <?import namespace=^svg ̄ implementation=^svg.htc ̄ ?> element.addBehavior(/slideshow/client-side-cache-presentation/826166/^foo.htc ̄) CSS  として div.foo { behavior: url(/slideshow/client-side-cache-presentation/826166/^foo.htc ̄); }
HTML Component Behavior (4) localStorage, sessionStorage  オブジェクトの燕F gは  script  勣殆を 屈つ document.createElement()  で恬撹して、 head  勣殆坪に  appendChild()  して、この  script  勣殆に  HTC  を  element.addBehavior()  している。 尖喇は屈つ property  への  getter/setter  を聞いたいから onpropertychange  を  localStorage.foo = ^blah ̄  のような旗秘猟の奮に聞いたいから
Ex DOM Storage の HTC ファイル (1) Ex DOM Storage  の  HTC <!DOCTYPE html> <public:component xmlns=&quot;http://www.w3.org/1999/xhtml^ xmlns:public=&quot;urn:HTMLComponent&quot;> <public:property name=&quot;length&quot; get=&quot;getLength&quot; /> <public:property name=&quot;remainingSpace&quot; get=&quot;getRemainingSpace&quot; /> <public:method name=&quot;clear&quot; /> <public:method name=&quot;getItem&quot; /> <public:method name=&quot;key&quot; /> <public:method name=&quot;removeItem&quot; /> <public:method name=&quot;setItem&quot; /> <public:attach  event=&quot;onreadystatechange&quot; for=&quot;element&quot; onevent=&quot;initialize();&quot; /> <public:attach  event=&quot;onpropertychange&quot; for=&quot;element&quot; onevent=&quot;syncronize(window.event);&quot; /> <script type=&quot;text/javascript&quot; src=/slideshow/client-side-cache-presentation/826166/&quot;../src/json2.js&quot;></script> <script type=&quot;text/javascript&quot; src=&quot;../src/exdomstorage_impl.js&quot;></script> </public:component>
Ex DOM Storage の HTC ファイル (2) ちなみに丹^にあった  DOCTYPE  傚冱 document.compatMode  が  HTC  にも贋壓する DOCTYPE  傚冱や  xml  傚冱に唹される CSS1Compat  じゃないと札Qモ`ドなので、 DOM  荷恬に弼?屶嬾が竃る なので  HTC  は  XML  侘塀ですが  HTML  として  DOCTYPE  傚冱を秘れると耳
Ex DOM Storage の HTC g廾何 g廾何 /* * Implementation Storage Interface * storage.length  と冱うアクセスのHに *  駅ず  getLength()  が柵ばれる  */  function getLength() {  var length = 0;  for (var p in storage)  length++;  return length;  }
onpropertychange  イベント onpropertychange  イベント element  オブジェクトのプロパティにする筝が佩われたHにk諮  (fire)  します Storage  オブジェクトを  script  勣殆にして addBehavior()  したオブジェクトで燕Fしているので、 onpropertychange  イベントで  storage.foo = ^blah ̄  のような旗秘をイベントハンドラで俺彌できる これをもって  storage  への郡啌、さらに  storage  イベントのk諮を佩うことが竃栖る
Ex DOM Storage Known Issue storage  イベントが揖匯  host  な  window  畠てにして宥岑竃栖ていない なる  window  gでの宥佚はどうやる document.cookie  ならO協したら軸恙に慌嗤される setInterval  でOする sessionStorage  が  window  ごとにユニ`クになっていない window.name  なら  window  ごとにユニ`クで、w卞しても、魃3屬珪Aける ここに  uuid  でも融っzんで、それをキ`にして  userData  にきzむ
まとめ DOM Storage  はもうすぐクロスブラウザな室g IE8, Fx2, Fx3, Safari 4  で屡に聞える室g Ex DOM Storage  が頼撹業互くなると  IE6+  になる Opera たん。。。。。 Known Issue  な何蛍はまだ隆g廾 coderepos  にソ`スあるんで、d龍ある繁はコミットしてホスィなと。 HTML Component  中易いよ ちょっとやればすぐに蛍かるので、 IE  で  CSS  の咾プギャ`とかあったらいてみるのといいかも Pathtraq  でも匯何聞ってるw  (XBL  も )

More Related Content

Client Side Cache

  • 1. Introduction DOM Storage and Inside Ex DOM Storage library Toru Yamaguchi id:ZIGOROu <zigorou@cpan.org>
  • 2. アジェンダ DOM Storage ってなんだよ localStorage と sessionStorage Cookie との`い Inside Ex DOM Storage Behavior の児A岑R userData Behavior HTML Component Behavior onpropertychange Ex DOM Storage のこれから
  • 3. DOM Storage とは DOM Storage とは採か DOM Storage とは JavaScript から夛晒されたデ`タをクライアントサイドに隠贋する室gで HTML 5 でカ┐気譴討い http://www.whatwg.org/specs/web-apps/current-work/#structured-client-side-storage Fr泣では IE8, Fx2, Fx3, Safari 4 などで旋喘竃栖る DOM Storage には喟Aデ`タ隠贋喘の localStorage とセッションデ`タ隠贋喘の sessionStorage がある 慌に key-value 侘塀でデ`タを String として隠贋竃栖る
  • 4. localStorage localStorage host g了 で嗤燭篇西A議なクライアントサイドキャッシュです if (localStorage.foo) { // 2 指朕參週のアクセス console.log(localStorage.foo); } else { // 兜指のアクセス localStorage.foo = ^bar ̄; }
  • 5. sessionStorage sessionStorage host g了で嗤燭如▲屮薀Ε兇鱸]じるとえます また sessionStorage は window オブジェクトごとに護り輝てられます
  • 6. Storage interface Storage interface interface Storage { readonly attribute unsigned long length ; [IndexGetter] DOMString key (in unsigned long index); [NameGetter] DOMString getItem (in DOMString key); [NameSetter] void setItem (in DOMString key, in DOMString data); [XXX] void removeItem (in DOMString key); void clear (); };
  • 7. StorageEvent interface Storage interface interface Storage { readonly attribute unsigned long length ; [IndexGetter] DOMString key (in unsigned long index); [NameGetter] DOMString getItem (in DOMString key); [NameSetter] void setItem (in DOMString key, in DOMString data); [XXX] void removeItem (in DOMString key); void clear (); };
  • 8. Storage interface Storage interface interface StorageEvent : Event { readonly attribute DOMString key ; readonly attribute DOMString oldValue ; readonly attribute DOMString newValue; readonly attribute DOMString url ; readonly attribute Window source ; void initStorageEvent ( in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString urlArg, in Window sourceArg); void initStorageEventNS ( in DOMString namespaceURI, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString urlArg, in Window sourceArg); };
  • 9. Storage event (1) Storage event setItem(), removeItem() 犁韻I尖がg佩された栽に storage イベントがk伏します。 鵑箸覆辰 key 式び、仟症の、 event オブジェクトに秘ってます clear() メソッドがg佩された栽も storage イベントがk伏します。 event.key, event.oldValue, event.newValue プロパティは null になっている localStorage の栽は、揖匯ホストで慌嗤されるので、 storage イベントはg鏡の window だけに宥岑されるのではなく、vSする畠ての window に fire されます。 event.source プロパティに localStorage への筝を佩った window オブジェクトが秘ります
  • 10. Storage event (2) sample var l = function (evt) { console.log(^key:  ̄ + evt.key); console.log(^oldValue:  ̄ + evt.oldValue); console.log(^newValue: ^ + evt.newValue); } ; window .addEventListener( &quot;storage&quot; , l, false );
  • 11. Cookie vs DOM Storage (1) 嗤親斛 Cookie は expire を峺協すれば販吭の豚gまで峺協でき、峺協しない栽はブラウザを]じるとえる localStorage は苧幣議にさない泙衽西A議。 sessionStorage はブラウザを]じるとえる。 つまり峺協r震でえるような Storage を聞いたければ localStorage を採らかの圭隈で砿尖する駅勣がある
  • 12. Cookie vs DOM Storage (2) 否楚 IE の栽、 Cookie は 4096 byte までしか隠贋竃栖ず、また key-value のペアは 20 が貧沺 IE の栽、 DOM Storage には 10MB ほど隠贋できる API Cookie は document.cookie プロパティを喘いるが getter/setter の咾Oめてキモイ DOM Storage は宥械の Object をハッシュのようにQうのと揖じように ( つまりプロパティ旗秘が ) 聞えるし、またきちんとメソッド (getItem, setItem, removeItem, clear) U喇でも荷恬竃栖る
  • 13. Cookie vs DOM Storage (3) 軆發之屬る Cookie vs DOM Storage の慌嗤 same host ( domain, path はO協してない彜B ) Window 1 Window 2 Window 3 Window 4 Window 5 localStorage / Cookie sessionStorage
  • 14. IE6, 7 で聞えないEx DOM Storage で竃栖るよ Ex DOM Storage IE6, IE7 で聞える DOM Storage ライブラリ 彎恬です http://coderepos.org/share/wiki/ExDOMStorage 書晩のメインの Inside Ex DOM Storage }泣と書瘁について
  • 15. Ex DOM Storage の嶄附の古待 Ex DOM Storage で旋喘しているニッチ室gの古勣 userData Behavior HTML Component Behavior onpropertychange による旗秘奮
  • 16. Behavior の児A岑R Behavior とは採か 瘁から販吭の勣殆にプロパティ、メソッド、イベントやイベントハンドラを弖紗できるMみを DHTML Behavior と冱う 屡にラつかの Behavior Library がMみzまれている #default#userData #default#VML カスタムの Behavior を HTML Component と冱う Mozilla の XBL (XML Binding Language) は HTC のパクリ
  • 17. userData Behavior (1) userData Behavior とは IE にデフォルトで原いてくる Behavior ライブラリの匯つ もろにクライアントサイドストレ`ジ、聞い圭も階g element.addBehavior( &quot;#default#userData&quot; ); element.load( ^my Storage  ̄ ); // iみzみ element.setAttribute( ^myData ̄ , ^blah blah ̄ ); // 、淋O協 element.save( ^my Storage  ̄ ); // きzみ
  • 18. userData Behavior (2) userData Behavior の嗤森 host g了で隠贋されるので DOM Storage と揖じ。 key-value のO協 恷兜は attribute として key を燕Fしようと房ったのだが、 userData Behavior をm喘した element の栽、 attribute の双い貧返く佩かない ( 碧っぽぃ ) JSON で融っzむ並に。
  • 19. userData Behavior (3) Lock 竃栖ない Window (1) Window (2) load(skey) setAttribute(key, value) save(skey) load(skey) このr泣で、 value には JSON デ`タが秘る。 { foo: ^blah ̄ } とかそういう。 Window (1) の load() 念のデ`タが函れてしまう。參和待升
  • 20. HTML Component Behavior (1) HTC のサンプル <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot;?> <public:component xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:public=&quot;urn:HTMLComponent&quot;> <script type=&quot;text/javascript^ src=/slideshow/client-side-cache-presentation/826166/^/path/to/src.jp ̄></script> <public:attach event=&quot;oncontentready&quot; onevent=&quot;handlers.contentready(event);^ for=&quot;element&quot; /> <public:attach event=&quot;onresize^ onevent=&quot;handlers.resize(event);^ for=&quot;window&quot; /> </public:component>
  • 21. HTC Component Behavior (2) HTC の旋泣 勣殆の咾魃否^議徭喇にQめる並が竃栖る 峺協した width を富なくとも_隠するような咾箸 (c.f. min-width) 販吭のメソッドを伏やしたり あるいは property にする getter/setter を蒙協の JavaScript メソッドに護り輝てたり IE は defineGetter, defineSetter が贋壓しない readonly のプロパティが恬れ、さらに麻Y惚などを卦せる length プロパティとかに聞える
  • 22. HTML Component Behavior (3) HTC の塘佚rの廣吭 HTC は text/x-component で塘佚 AddType text/x-component .htc HTC のロ`ド - 3 N PI 凋綜として <?import namespace=^svg ̄ implementation=^svg.htc ̄ ?> element.addBehavior(/slideshow/client-side-cache-presentation/826166/^foo.htc ̄) CSS として div.foo { behavior: url(/slideshow/client-side-cache-presentation/826166/^foo.htc ̄); }
  • 23. HTML Component Behavior (4) localStorage, sessionStorage オブジェクトの燕F gは script 勣殆を 屈つ document.createElement() で恬撹して、 head 勣殆坪に appendChild() して、この script 勣殆に HTC を element.addBehavior() している。 尖喇は屈つ property への getter/setter を聞いたいから onpropertychange を localStorage.foo = ^blah ̄ のような旗秘猟の奮に聞いたいから
  • 24. Ex DOM Storage の HTC ファイル (1) Ex DOM Storage の HTC <!DOCTYPE html> <public:component xmlns=&quot;http://www.w3.org/1999/xhtml^ xmlns:public=&quot;urn:HTMLComponent&quot;> <public:property name=&quot;length&quot; get=&quot;getLength&quot; /> <public:property name=&quot;remainingSpace&quot; get=&quot;getRemainingSpace&quot; /> <public:method name=&quot;clear&quot; /> <public:method name=&quot;getItem&quot; /> <public:method name=&quot;key&quot; /> <public:method name=&quot;removeItem&quot; /> <public:method name=&quot;setItem&quot; /> <public:attach event=&quot;onreadystatechange&quot; for=&quot;element&quot; onevent=&quot;initialize();&quot; /> <public:attach event=&quot;onpropertychange&quot; for=&quot;element&quot; onevent=&quot;syncronize(window.event);&quot; /> <script type=&quot;text/javascript&quot; src=/slideshow/client-side-cache-presentation/826166/&quot;../src/json2.js&quot;></script> <script type=&quot;text/javascript&quot; src=&quot;../src/exdomstorage_impl.js&quot;></script> </public:component>
  • 25. Ex DOM Storage の HTC ファイル (2) ちなみに丹^にあった DOCTYPE 傚冱 document.compatMode が HTC にも贋壓する DOCTYPE 傚冱や xml 傚冱に唹される CSS1Compat じゃないと札Qモ`ドなので、 DOM 荷恬に弼?屶嬾が竃る なので HTC は XML 侘塀ですが HTML として DOCTYPE 傚冱を秘れると耳
  • 26. Ex DOM Storage の HTC g廾何 g廾何 /* * Implementation Storage Interface * storage.length と冱うアクセスのHに * 駅ず getLength() が柵ばれる */ function getLength() { var length = 0; for (var p in storage) length++; return length; }
  • 27. onpropertychange イベント onpropertychange イベント element オブジェクトのプロパティにする筝が佩われたHにk諮 (fire) します Storage オブジェクトを script 勣殆にして addBehavior() したオブジェクトで燕Fしているので、 onpropertychange イベントで storage.foo = ^blah ̄ のような旗秘をイベントハンドラで俺彌できる これをもって storage への郡啌、さらに storage イベントのk諮を佩うことが竃栖る
  • 28. Ex DOM Storage Known Issue storage イベントが揖匯 host な window 畠てにして宥岑竃栖ていない なる window gでの宥佚はどうやる document.cookie ならO協したら軸恙に慌嗤される setInterval でOする sessionStorage が window ごとにユニ`クになっていない window.name なら window ごとにユニ`クで、w卞しても、魃3屬珪Aける ここに uuid でも融っzんで、それをキ`にして userData にきzむ
  • 29. まとめ DOM Storage はもうすぐクロスブラウザな室g IE8, Fx2, Fx3, Safari 4 で屡に聞える室g Ex DOM Storage が頼撹業互くなると IE6+ になる Opera たん。。。。。 Known Issue な何蛍はまだ隆g廾 coderepos にソ`スあるんで、d龍ある繁はコミットしてホスィなと。 HTML Component 中易いよ ちょっとやればすぐに蛍かるので、 IE で CSS の咾プギャ`とかあったらいてみるのといいかも Pathtraq でも匯何聞ってるw (XBL も )