主なアイデア
URLのハッシュ値を変更することで、対応するモジュールにジャンプします。まずデフォルトのモジュールを表示し、他のモジュールを非表示にします。デフォルトのモジュールのオプションをクリックすると、同時にウィンドウ上の hashchange イベントを監視して実行します。対応するモジュールジャンプロジック処理を行います。このようにして、ブラウザの前後の動きをシミュレートでき、ユーザー エクスペリエンスが向上します。
以下で詳しく見てみましょう。選択順序は、自動車ブランド -> 自動車モデル -> 自動車シリーズです。
まずHTML部分です。車両ブランド選択リストはデフォルトで表示され、他の 2 つのモジュールは非表示になります。
<div class="wrap"> <div id="Brand"> <div>品牌</div> <ul class="mycar_hot_list"> <li> <p>大众</p> </li> </ul> </div> <div id="Type" style="display:none"> <dl> <dt>比亚迪汽车</dt> <dd>宋</dd> </dl> </div> <div id="Series" style="display:none"> <ul class="mycar_datalist"> <li> 2013年款 <li> </ul> </div> </div>
jsロジック制御部
① 3つのモジュールで選択したデータを格納する変数オブジェクトを定義し、ハッシュ値と、対応するモジュールの処理ロジック関数を定義します。
info={ brand:'', carType:'', carSeries:'', pages:['Brand','Type','Series'] }; info.selectBrand=function(){ document.title = '选择商标'; brandEvent(); } //选择车型 info.selectType=function(){ document.title = '选择车型'; document.body.scrollTop = 0; //滚到顶部 window.scrollTo(0, 0); typeEvent(); //为该模块的dom绑定事件或做其他逻辑 } //选择车系 info.selectSeries=function(){ document.title = '选择车系'; document.body.scrollTop = 0; window.scrollTo(0, 0); seriesEvent(); }
②domバインディングイベントとその他のロジック
function brandEvent(){ //绑定跳转 $('#Brand ul li').click(function(){ info.brand=$(this).find('p').text(); goPage('Type'); }) } function typeEvent(){ //绑定跳转 $('#Type dd').click(function(){ info.carType=$(this).text(); goPage('Series'); }) } function seriesEvent(){...}
③goPageロジックジャンプ制御
function goPage(tag) { if ((tag == 'Brand')&&(location.hash.indexOf('Type')!=-1)){ // 后退操作 history.back(); document.title = '选择商标'; }else if ((tag == 'Type')&&(location.hash.indexOf('Series')!=-1)){ history.back(); document.title = '选择车型'; }else { location.hash = tag; } }
④jsエントリファイル(ここではdomの選択にzepto.jsを使用)
window.onload=function(){ info.selectBrand(); //为默认显示的模块中的元素绑定相应的事件及其他逻辑 $(window).on("hashchange", function (e) { doHashChange(); }); }
⑤最も重要なハッシュ変更ロジック制御
function doHashChange(){ //获取hash的值 var hash = location.hash.split('|')[0], tag = hash.replace(/#/g, ''); if (info.pages.indexOf(tag) == -1) { tag = 'Brand'; } $('.wrap').children('div').hide(); //执行每个模块不同的方法 if(typeof(info['select' + tag]) == "function"){ info['select' + tag](); } //展示对应dom $('#' + tag).show(); }