自前で作ったメニュー表示/画面スライドをJQueryMobileで作り直したものです。
デモサイト
日本語/英語の言語切り替え付きもあります。
メインメニュー/サブメニュー/コンテンツといった多階層の画面遷移を組み込んでいます。
メニューのlistviewをjsonデータからjavascriptで動的に生成し、コンテンツ表示部分は各項目で共有し、コンテンツはiframeに外部のhtmlを読み込む構成になっています。
これにより画面遷移に関わる部分のhtmlがシンプルになり、コンテンツのメンテナンスも容易になります。
iframeを使っているため、backボタンの動作に手を加えています。これが最善かどうかはわかりませんが、ともかくも期待通りに動作しています。
HTML一式ダウンロードできます。
<body onload="init();"> <div data-role="page" id="topPage"> <div data-role="header"> <h1 class="headerText">ホームページ</h1> </div> <!-- メインメニューを埋め込むdiv --> <div id="topMenu"></div> <div data-role="footer" class="footer"> <h6 class="footerText">Footer Text</h6> </div> </div> <!-- メインメニューのページ1をタップしときに遷移するpage。サブメニューを表示する。 --> <div data-role="page" id="subMenuPage"> <div data-role="header" data-add-back-btn="true" data-back-btn-text="戻る" onclick="return backClicked(this);"> <h1 class="headerText">subMenuPage</h1> </div> <!-- サブメニューを埋め込むdiv --> <div id="subMenu"></div> <div data-role="footer" class="footer"> <h6 class="footerText">Footer Text</h6> </div> </div> <!-- コンテンツ表示。メインメニューのページ3、およびサブメニューをタップしときに遷移しコンテンツを表示するpage。 --> <div data-role="page" id="contentPage" > <div data-role="header" data-add-back-btn="true" data-back-btn-text="戻る" onclick="return backClicked(this);"> <h1 class="headerText">contentPage</h1> </div> <div data-role="main" class="ui-content" id="iframeDiv"> <!-- コンテンツをロードするiframe --> <iframe id="iframe"></iframe> </div> <div data-role="footer" class="footer"> <h6 class="footerText">Footer Text</h6> </div> </div> </body>
index.htmlのonloadイベントハンドラ
//body.onloadで呼ばれる。iframeのheight設定。 //ブラウザのreloadボタンクリック時はindex.htmlをリロードする。 function init() { if (document.getElementById("topMenuList") == null || $('#topMenuList').length == 0) { location = "index.html"; } else { var h = $(window).height() - 20; $('#iframe').css("height", h + "px"); } }
メインメニューを生成するjavascript
//メインメニューのデータ。 //text: リスト表示名 //page: 遷移先ページ ID //src: iframeにロードするhtml、またはサブメニューのjson変数名。 var topMenuList = [ {"text":"ページ1 - サブメニュー", "page":"#subMenuPage", "src":"subMenuList1"}, {"text":"ページ2 - サブメニュー", "page":"#subMenuPage", "src":"subMenuList2"}, {"text":"ページ3 - コンテンツ", "page":"#contentPage", "src":"Contents/page3.html"} ]; //index.htmlロード時に呼ばれ、メインメニューを生成。 $(document).on('pagebeforeshow', '#topPage', function(){ if ($('#topMenuList').length == 0) { var ul = $('<ul>').attr({'id':'topMenuList','data-role':'listview'}).appendTo('#topMenu'); for(var i=0; i < topMenuList.length; i++) { var li = $('<li>').appendTo('#topMenuList'); var item = topMenuList[i]; $('<a data-transition="slide" href="' + item.page + '">') .attr('onclick', 'linkClicked("' + item.page + '","' + item.text + '","' + item.src + '")') .text(item.text).appendTo(li); } $('#topMenuList').listview().listview('refresh'); } });
メインメニュータップ/クリックで呼ばれサブメニューを生成するjavascript
//サブメニューのデータ。項目はメインメニューと同じ。 var subMenuList1 = [ {"text":"1. 項目11", "page":"#contentPage", "src":"Contents/item11.html"}, {"text":"2. 項目12", "page":"#contentPage", "src":"Contents/item12.html"}, {"text":"3. 項目13", "page":"#contentPage", "src":"Contents/item13.html"} ]; //サブメニューのデータ。項目はメインメニューと同じ。 var subMenuList2 = [ {"text":"1. 項目21", "page":"#contentPage", "src":"Contents/item21.html"}, {"text":"2. 項目22", "page":"#contentPage", "src":"Contents/item22.html"}, {"text":"3. 項目23", "page":"#contentPage", "src":"Contents/item23.html"} ]; //サブメニュー生成。異なるサブメニューで同じDIV構成を共用するため、表示のたびにlistviewを作り直す。 function setMenu(name) { var ul = $('#subMenuList'); if (ul.length > 0) { ul.empty(); } else { ul = $('<ul>').attr({'id':'subMenuList','data-role':'listview'}).appendTo('#subMenu'); } var menuList = eval(name); for(var i=0; i < menuList.length; i++) { var li = $('<li>').appendTo('#subMenuList'); var item = menuList[i]; $('<a data-transition="slide" href="' + item.page + '">') .attr('onclick', 'linkClicked("' + item.page + '","' + item.text + '","' + item.src + '")') .text(item.text).appendTo(li); } $('#subMenuList').listview().listview('refresh'); }
メニュー項目タップ/クリックで呼ばれ画面遷移を行うjavascript
//サブメニューのデータ。項目はメインメニューと同じ。 //画面遷移の履歴。 //iframeを使用するとBackボタンを二度クリック/タップしないと画面遷移しなくなるため、独自に履歴を管理する。 var pageArray = new Array(""); //listviewの項目がクリック/タップされたときに呼ばれる。 //遷移先のヘッダのタイトル設定。現在のページをpageArrayにpushする。 function linkClicked(page, title, src, backTo) { if (page == "#subMenuPage") { setMenu(src); } else if (src.length > 0) { $('#iframe').attr('src', src); } $(page).find('.headerText').text(title); pageArray.push(findParentPage($(event.srcElement))); } //paretnElementを辿り、data-role="page"の要素を返す。見つからない場合はnullを返す。 function findParentPage(elm) { if (elm == null || elm.attr('data-role') == 'page') return elm; return findParentPage(elm.parent()); }
戻るボタンで画面遷移を行うjavascript
//Backボタンタップ/クリック。 //戻り先pageIdがあればchangePageをよびfalseを返す。さもなけばtrueを返し、frameworkに任せる。 function backClicked(elm) { var page = pageArray.pop(); if (page == null) return true; var pageId = page.attr('id'); if (pageId.length == 0) return true; $.mobile.changePage('#'+pageId, { transition: "slide", changeHash: true, reverse: true } ); return false; }
参照
JQueryMobile listview サンプル 言語切り替え付き
HTML5+JavaScriptで画面をスライドさせて切り替える方法
0 件のコメント:
コメントを投稿