HOME>WEBプログラム覚書>[jQuery Mobile]初期化イベントメモ

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

mobileinit

jQuery Mobileがロードされた時に真っ先に発生するイベント。jQuery Mobileを読み込む前に記述しておくか読み込む。 主にjQuery Mobileの各種設定を変更したりする場所。

jQuery.ready()よりも前なのでDOMの操作はおこなえないっぽい。

javascript

  1. $(document).live('mobileinit',function(event){
  2.      $('.test ul').attr('data-role', 'listview');
  3. });
  4.  
  1. <div class="test" data-role="page">
  2.     <ul>
  3.     <li><a href="#">りすと1</a></li>
  4.     <li><a href="#">りすと2</a></li>
  5.     <li><a href="#">りすと3</a></li>
  6.     </ul>
  7. </div>
  8.  

このイベントと次のpagebeforecreateの間にjQuery Mobileは何をやっているのだろうか・・・。

pagebeforecreate

DOMの拡張前に発生するイベント。動的にdata属性を与えたい場合などここに記述する。 このイベントが完了した時点でのHTMLマークアップに基づいてjQeury Mobileがclassつけたり要素をラップしたりすると思われる。

javascript

  1. $(document).live('pagebeforecreate',function(event){
  2.     $('.test ul').attr('data-role', 'listview');
  3. });
  4.  
  1. <div class="test" data-role="page">
  2.     <ul>
  3.     <li><a href="#">りすと1</a></li>
  4.     <li><a href="#">りすと2</a></li>
  5.     <li><a href="#">りすと3</a></li>
  6.     </ul>
  7. </div>
  8.  

pagecreate

jQuery Mobileによるマークアップの拡張、ウィジェット化完了後に発生するイベント?

ベータ2より前は、jQuery Mobileにより拡張された後のページやウィジェットのマークアップを操作したい場合は pagecreate イベントにバインドすることが推奨されていました。しかしベータ2で内部的に大きな変更があり、各ウィジェットの初期化がが pagecreate イベントでバインディングされることで分離されました。jQuery UI ウィジェットファクトリーのライフサイクルに準拠すれば、初期化メソッドは create メソッドの 後に 呼ばれるべきです。そのため、拡張が行われたDOMやJavaScriptオブジェクトを操作するには pageinit イベントが最適なタイミングです。端的に言えば、以前 pagecreate を使ってページ表示前に拡張されたマークアップを操作していたならば、ほとんどの場合は pageinit に移してしまうべきです。

pageCreate() vs pageinit()

たぶんあんまり使わなそう。とりあえずこの時点でdata属性を与えてもスタイルは反映されない。

javascript

  1. $(document).bind('pagecreate',function(event){
  2.     $('.bt1').attr('data-role', 'button');
  3.     $('.bt2').button({inline: true, icon: 'plus'});
  4. });
  5.  
  1. <div data-role="page">
  2.     <a href="#" class="bt1">ボタン1</a>
  3.     <a href="#" class="bt2">ボタン2</a>
  4. </div>
  5.  

ただ.live()を利用すると効果あり。

javascript

  1. $(':jqmData(role="page")').live('pagecreate',function(event){
  2.     $('.bt1').attr('data-role', 'button');
  3.     $('.bt2').button({inline: true, icon: 'plus'});
  4. });
  5.  
  1. <div data-role="page">
  2.     <a href="#" class="bt1">ボタン1</a>
  3.     <a href="#" class="bt2">ボタン2</a>
  4. </div>
  5.  

pageinit

jQuery Mobileにおける$(document).ready()。このイベントが発生したときjQuery Mobileは初期化の仕事は終えているはず。

ajaxで要素を追加した場合、スタイルが反映される。

javascript

  1. $('#StartPage').live('pageinit',function(event){
  2.     $("#ListPage").load("/codes/jqm/uldata.php ul");
  3. });
  4.  
  1. <div data-role="page" id="StartPage">
  2.     <a href="#ListPage">移動</a>
  3. </div>
  4.  
  5. <div data-role="page" id="ListPage">
  6. </div>
  7.  

けどjavascriptでdata属性を追加した場合、スタイルは反映されない。

javascript

  1. $('#ListPage').live('pageinit',function(event){
  2.     $("#ListPage ul").attr('data-role', 'listview');
  3. });
  4.  
  1. <div data-role="page" id="StartPage">
  2.     <a href="#ListPage">移動</a>
  3. </div>
  4.  
  5. <div data-role="page" id="ListPage">
  6.     <ul>
  7.     <li><a href="#">りすと1</a></li>
  8.     <li><a href="#">りすと2</a></li>
  9.     <li><a href="#">りすと3</a></li>
  10.     </ul>
  11. </div>
  12.  

なんか混乱してきた。

とりあえずそれぞれのイベント発生時にDOMがどんな状態になっているのか(いつマークアップの拡張が終わって、いつウィジェット化されてんのか)がわかっていないということがわかった。

投稿日 2012年2月 1日 12:18
カテゴリ JavaScript
タグ jQuery | jQuery Mobile
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1262

コメント

コメントする
Name
Email Address
URL