列車時刻表(11) – 乗車予定登録の見直し

引き続き列車時刻表を作成していく。

  • 画面遷移の変更
    これまで、乗車予定の登録は、
    ・列車時刻表画面(#pgTTTrain)で、乗車駅を選択したとき(下図)
    ・駅時刻表画面(#pgTTStation)で、乗車列車を選択したとき
    にダイアログを表示し、OKであれば乗車駅・列車を登録し、その後「乗車予定一覧画面」に遷移していた。
    mttview06_b01
    これを「列車時刻表画面」に遷移するように変更する。(‘乗車’アクションの次に行うのは、乗車した列車から’下車’するのが自然と思われるため。)
  • 列車時刻表画面の変更
    列車時刻表画面からは、
    ・駅時刻表画面(各項目の左ブロッククリック時)
    ・乗車/下車画面(各項目の右ブロッククリック時)
    に遷移することが可能だったが、上記の変更に伴い、現在のステータスが乗車中の場合は、下車アクションしか実行できないようにする。(リンクを無効にするとともに、アイコンを変更する。)
    また、乗車駅よりも後続の駅でしか下車できないようにする
  • 画面イメージ
    列車時刻表画面。この画面からは駅時刻表画面と乗車(右)画面に遷移可能。「乗車」アイコンもsigninアイコンを使ってそれらしくしてみた。
    mttview06_b02
    「大宮駅」から乗車する。
    mttview06_b03
    次画面はまた(同じ列車の)「列車時刻表画面」。ただし、駅時刻表画面へのリンクは無効になっている。また大宮以降の駅でしか「下車」アクションが起こせないようになっている。(先の画面と異なり、signoutアイコンを使って下車することを表わしている。)
    mttview06_b04

コードは次の記事で。

カテゴリー: Development | タグ: , , | 1件のコメント

jQuery Mobileの listview要素を ‘disable’ にする

あまり必要性はないかもしれないが、jQuery Mobileの listview要素を ‘disable’ にする、つまりリストには表示されるが、グレーアウトしてクリックなどの操作をできないようにする方法。

結論から言うと、jQuery Mobileで定義されている class=”ui-disabled” を指定するとうまくいく。li要素に指定する(item 2)と周りの枠線も灰色になってしまうが、a要素に指定する(item 4)と枠線はそのままで中の文字がグレーアウトされる。ただしリンクであることを示すアイコンは元のままになってしまう。いずれの場合でも操作はできなくなる。(item 4も見た目はクリックできそうだが、実際はできない。)

<!-- HTML -->
<ul data-role="listview" data-inset="true">
  <li><a href="#pgTestJqm">item 1</a></li>
  
  <!-- li要素に指定 -->
  <li class="ui-disabled"><a href="#pgTestJqm">item 2</a></li>
  
  <li><a href="#pgTestJqm">item 3</a></li>
  
  <!-- a要素に指定 -->
  <li><a href="#pgTestJqm" class="ui-disabled">item 4</a></li>
  
  <li><a href="#pgTestJqm">item 5</a></li>
</ul>

mtestjqm_c01

カテゴリー: Tips | タグ: | コメントする

jQuery Mobileでカスタムアイコンを使う(2)

jQuery Mobileで使えるアイコンを探していたら、’jQuery Mobile Icon Pack‘ を見つけた。

jQuery Mobile Icon Pack

使い方は以下のとおり。

  • GitHubから一括ダウンロードする
    アイコンファイルは以下。(スプライト方式なので、1つのファイルに複数のアイコンが格納されている。)
    ajax-loader.png
    icons-18-black-pack.png
    icons-18-white-pack.png
    icons-36-black-pack.png
    icons-36-white-pack.png
  • アイコンファイルを配置する
    上記のアイコンファイルをjQuery Mobileと同じ’images’フォルダに配置する(場所に特段の縛りはない)。またアイコンパックのCSSファイルを適宜配置する。

    <!-- HTML -->
    <link rel="stylesheet" href="/XXX/jqm-icon-pack-3.0.0-fa.css" />
    
  • フォントファイルを配置する
  • アイコンを利用する
    <!-- HTML -->
    <button data-icon="cloud-download">cloud-download</button>
    <button data-icon="coffee">coffee</button>
    <button data-icon="food">food</button>
    
  • 実行例
    mtestjqm_b02
カテゴリー: Tips | タグ: | コメントする

jQuery Mobileでカスタムアイコンを使う(1)

jQuery Mobileで標準アイコン以外のアイコンを利用する方法。通常では、以下のように名前(例:’arrow-r’)を指定して表示するアイコンを指定する。

<!-- HTML -->
<a href="#" data-role="button" data-icon="arrow-r" data-iconpos="right">hoge</a>

自前でアイコンを用意する場合は以下の手順に従う。

  • アイコンを用意/配置する
    アイコンのサイズは18x18にするのが基本。
  • CSSを記述する
    アイコンの名前を他と重複しないように決め、CSSを記述する。既存のCSSファイル、あるいはjQuery MobileのCSSファイルに追記してもよいが、新規に作成してもOK。以下の例では、’myiconride‘という名前をつけている。

    .ui-icon-myiconride { background : url("/images/icon-jqm/tt_ride_s.png")
      no-repeat rgba(0, 0, 0, 0.4) !important; }
    

    rgba(0, 0, 0, 0.4) で、jQuery Mobileが定義しているui-iconクラスのbackgroundと同じ透過度を指定している。

  • HTMLでマークアップする
    <!-- HTML -->
    <button data-icon="myiconride">ride</button>
    
  • CSSを使わず直接記述する場合
    CSSファイルを使わずimg要素を使って、直接アイコン画像を指定することもできる。

    <!-- HTML -->
    <!-- リンクボタンの場合 ui-btn-iconクラスを指定-->
    <a href="#" data-role="button" data-iconpos="left">
      <img src="/images/icon-jqm/tt_station.png" class="ui-btn-icon" />station
    </a>
    
    <!-- リストビューの場合 ui-li-iconクラスを指定 -->
    <ul data-role="listview" data-inset="true">
      <li>
        <a href="#">
          <img src="/images/icon-jqm/tt_station.png" class="ui-li-icon" />station
        </a>
      </li>
      <li>
        <a href="#">
          <img src="/images/icon-jqm/tt_train.png" class="ui-li-icon" />train
        </a>
      </li>
    </ul>
    
  • 実行例
    mtestjqm_b01
カテゴリー: Tips | タグ: | コメントする

列車時刻表(10) – 乗車予定リストをアコーディオン表示する

列車時刻表の作成を継続する。これまで、保存した乗車予定は listview を使って一覧を表示してきたが、項目が多くなりそうなので、accordion で表示するように変更する。

各折り畳みブロックのヘッダ(‘h3′)部分に「区間・時刻」「路線名」を、ボディ部分(‘p’)に「列車詳細」「変更ボタン」を表示する。ボタンなどのコンテンツを動的に追加した場合は、

$(selectore).trigger('create');

として表示を更新する。以下のコードでは、各ブロックに共通のクラス名(clsColRideList)をセットしておき、最後にまとめて create している。

// JavaScript
for (var i=0; i < rides.length; i++ ){
  // 各ブロックの組み立て
  // 区間・時刻 
  _section = rides[i].on_stname + ' (' + rides[i].on_time + ') - ' 
    + rides[i].off_stname + ' (' + rides[i].off_time + ')';
  // 路線名
  _lnname = rides[i].ln_name_s;

  colItem += '<div data-role="collapsible" class="clsColRideList">'
  + '<h3>' + _section + '<span class="ui-li-aside">' + _lnname + '</span></h3>'
  + '<p>' + _trinfo
  + '<button data-role="button" data-icon="check">列車変更</button>'
  + '<button data-role="button" data-icon="check">乗車駅変更</button>'
  + '<button data-role="button" data-icon="check">下車駅変更</button>'
  + '<button data-role="button" data-icon="delete">削除</button>' 
  + '</p></div>';
}
$('#colTTRideList').append(colItem);
$('#colTTRideList').collapsibleset('refresh');
$('.clsColRideList').trigger('create');

実行例

  • 初期状態
    mttview06_a01
  • 3番目の項目を開いたところ
    mttview06_a03
  • 1番目の項目を開いたところ
    mttview06_a02
カテゴリー: Development | タグ: , , | 1件のコメント

jQuery Mobileのアコーディオン(collapsible set)に動的に項目を追加する

jQuery Mobileのアコーディオンを使う際の注意点。リストビューと同様、項目追加が完了したタイミングで、表示を更新する必要がある。アコーディオンでは、以下の2つの要素に対して更新を行う。collapsible は refresh ではうまく更新されない。

$(selector_col_set).collapsibleset('refresh'); // collapsible setの更新
$(selector_col).trigger('create'); // collapsibleの更新

例えば、以下のように collapsible set をマークアップしておく。

<!-- HTML -->
<div data-role="collapsible-set" id="colTTRideList"></div>

これに、コードでcollapsible 要素を追加していく。

// JavaScript
var _section, _lnname;

for (var i=0; i < rides.length; i++ ){
  // 各ブロックの組み立て
  // 区間・時刻 
  _section = rides[i].on_stname + ' (' + rides[i].on_time + ') - ' 
    + rides[i].off_stname + ' (' + rides[i].off_time + ')';
  // 路線名
  _lnname = rides[i].ln_name_s;

  colItem += '<div data-role="collapsible" class="clsColRideList">'
  + '<h3>' + _section + '<span class="ui-li-aside">' + _lnname + '</span></h3>'
  + '<p>' + _trinfo + '</p></div>';
}
$('#colTTRideList').append(colItem);
$('#colTTRideList').collapsibleset('refresh');
$('.clsColRideList').trigger('create');
カテゴリー: Tips | タグ: | コメントする

jQuery Mobileのアコーディオンを使う

jQuery Mobileのアコーディオン(開閉可能なブロック)を使ってみる。

  • 基本的な使い方
    各ブロックを’collapsible’で指定し、閉じたときのタイトルをヘッダ要素(h1..h6)で記述する。

    <div data-role="collapsible"><h3>section 1</h3><p>contents 1</p></div>
    

    さらに各ブロックを’collapsible-set’で囲むと、ひとかたまりのコンテンツが生成される。(あるブロックを開くと、別のブロックは自動的に閉じる。)

    <div data-role="collapsible-set">
      <div data-role="collapsible"><h3>section 1</h3><p>contents 1</p></div>
      <div data-role="collapsible"><h3>section 2</h3><p>contents 2</p></div>
      <div data-role="collapsible"><h3>section 3</h3><p>contents 3</p></div>
    </div>
    

    これを開くと以下の画面が生成される。
    mtestjqm_a01
    真ん中のアイテムを開くと以下のようになる。
    mtestjqm_a02
    ヘッダ部分の文字を右寄せにするには、’span class=”ui-li-aside”‘を使う。(ただし高さが少し不揃いになるようだ。)

  • アイコンを指定する
    閉じたときのアイコンを’data-collapsed-icon’で、開いたときのアイコンを’data-expanded-icon’で指定する。

    <div data-role="collapsible" data-collapsed-icon="gear" data-expanded-icon="delete">
      <h3>icon gear</h3>
    </div>
    

    閉じた状態
    mtestjqm_a03
    開いた状態
    mtestjqm_a04

  • アイコンの位置を指定する
    アイコンの位置は’data-iconpos=”right”‘のように指定する。
  • ブロックの角を丸くしない
    ‘data-corners=”false”‘を指定することで、先頭と最後のブロックの角が丸くならない。
  • ミニサイズにする
    data-mini=”true”を指定することで、ミニサイズのブロックになる。
  • 実行例
    mtestjqm_a05
カテゴリー: Tips | タグ: | コメントする

列車時刻表(9) – データストアに保存した乗車予定を表示する

前記事に引き続いて列車時刻表を作成する。これまで、検索した結果(乗車予定)をメモリ上に保持してきたが、GAE(Google App Engine)のデータストアに保存するようにし、あとで確認する画面を用意する。

  • 乗車予定をデータストアに保存する
    乗/下車駅・時刻や列車番号などをプロパティとしてデータストアに保存する。また「乗車日」をあわせて指定できるようにし、あとで検索する際に使う。
    mttview05_a01
    乗車確認ダイアログに「Setting」画面へのリンクボタンを追加する。
    mttview05_a02
    Setting画面で日付を指定できるようにする。
  • 乗車予定一覧表示画面を作成する
    <!-- HTML -->
    <!-- 表示する乗車予定日付 -->
    <select id="selRideDate"></select>
    <!-- 乗車予定データ -->
    <ul data-role="listview" id="lvTTRideList" data-inset="true"></ul>
    
  • イベントハンドラを定義する
    var gRides = []; // 乗車予定(データストアの内容全て)
    
    // 画面表示時
    function pgTTRideListPagebeforeshow(){
      // 乗車予定をデータストアからロードする(全ての予定データをロード)
      loadRideAll(function(){
        // セレクトメニューに「使用されている全ての日付」をセットする
        showRideDates($('#selRideDate'));
        // 対象日付の乗車予定リストを初期表示する
        $('#selRideDate').trigger('change');
      });
    }
    
    // 日付変更時
    $(this).on('change', '#selRideDate', function(){
      // 日付変更時に表示を更新する
      showRideList($('#lvTTRideList'), gRides, $('#selRideDate').val());
    });
    
  • 乗車予定一覧を表示する
    
    var gCurRides = []; // 表示した乗車予定を保持するオブジェクト配列
    
    function showRideList($lv, rides, dateStr){
      var lvItem = '';
      $lv.empty(); // リストビューをクリアする
      gCurRides.length = 0; // 表示データをクリアする
    
      for (var i=0; i < rides.length; i++ ){
        if (rides[i].ride_date == dateStr){ // 指定された乗車日付のデータのみ表示
          lvItem += '<li data-idxride="' + i + '">' +
            rides[i].on_stname + ' (' + rides[i].on_time + ') - ' + 
            rides[i].off_stname + ' (' + rides[i].off_time + ')' +
            '<span class="ui-li-aside">' + rides[i].on_trno + '</span>';
          gCurRides.push(rides[i]); // 表示したデータを保持
        }
      }
      $lv.append(lvItem); 
      $lv.listview('refresh');
    }
    
  • 実行例
    mttview05_a03
    日付を変えると表示が更新される。
    mttview05_a04
カテゴリー: Development | タグ: , , | コメントする

jQuery Mobileでセレクトメニューを使う

jQuery Mobileでセレクトメニューを使う方法。HTML標準のselect要素は
自動的に jQuery Mobileのインターフェースに変換される。

  • 基本的な使用法
    <!-- HTML -->
    <select id="selSample1">
      <option value="1">The 1st Option</option>
      <option value="2">The 2nd Option</option>
      <option value="3">The 3rd Option</option>
    </select>
    

    標準HTMLのselect要素を記述すると以下のような画面になる。
    mtestjqm_s01
    ラベルをつけるにはlabel要素を使い、さらにfieldcontainで囲めばOK。

    <div data-role="fieldcontain">
    <label for="selSample1">Sample 1:</label>
    
  • 要素を動的に追加する
    <!-- HTML -->
    <select id="selRideDate"></select>
    
    // JavaScript
    var rideDates = ['2013/05/24', '2013/05/25', '2013/05/17'];
    var optItem = '';
    for (var i = 0; i < rideDates.length; i++) {
      optItem += 
        '<option value="' + rideDates[i] + '">' + rideDates[i] + '</option>';
    }
    $('#selRideDate').append(optItem);
    // 先頭の要素を選択状態にする
    $('#selRideDate').val(rideDates[0]);
    // 表示を更新する
    $('#selRideDate').selectmenu('refresh',true);
    

    listviewと同様、要素を追加した場合はrefreshしないと表示が更新されない。

  • 値の取得/設定
    // JavaScript
    $('#selRideDate').val();             // 値の取得
    $('#selRideDate').val(rideDates[0]); // 値の設定
    $('#selRideDate').selectmenu('refresh');
    
カテゴリー: Tips | タグ: | コメントする

配列を逆順(降順)にソートする(JavaScript)

JavaScriptで配列をソートするには、Array.sort() を使うが、逆順(降順)にソートするには、sort() の引数に関数を記述すればよい。

// JavaScript
// 
var rideDates = ['2013/01/01', '2013/01/02', '2013/01/04', '2013/01/03'];
rideDates.sort(function(a,b){
  return(b-a);
});
// 処理結果
// rideDates = ['2013/01/04', '2013/01/03', '2013/01/02', '2013/01/01'];

sort()の引数に「降順になっていたら正の値を返す」関数を指定することで、適用結果が「降順」になる。

カテゴリー: Tips | タグ: | コメントする