準備
まず、HTMLにインジケータ表示範囲のdivと、ボタンを用意しましょう。
divとボタンにはidをつけてください。
<!-- インジケータ表示範囲 --> <div id="container" class="sample"> <!-- ボタン --> <input type="button" id="indicator" value="インジケータ表示"> </div>
【レシピの主な材料】 indicator
入力内容をサーバーへ送信する時など、ユーザ操作を一時的にブロックする場合は「インジケータ」を表示しましょう。
ここでは、hifiveでのインジケータの表示方法について説明します。
基本的な表示方法としてコントローラと紐つけた範囲に対してインジケータを表示してみましょう。
(function($) {
/** インジケータ表示範囲を管理するコントローラ */
var indicatorController = {
__name: 'indicatorController',
/** インジケータ表示ボタン押下イベント */
'#indicator click': function(){
//インジケータ表示
var indicator = this.indicator({
message: 'block'
}).show();
setTimeout(function() {
//インジケータ除去
indicator.hide();
}, 800);
}
};
$(function(){ h5.core.controller('#container', indicatorController)});
})(jQuery);
まず、HTMLにインジケータ表示範囲のdivと、ボタンを用意しましょう。
divとボタンにはidをつけてください。
<!-- インジケータ表示範囲 --> <div id="container" class="sample"> <!-- ボタン --> <input type="button" id="indicator" value="インジケータ表示"> </div>
ボタンのクリックイベントハンドラを記述し、その中にインジケータ表示処理を記述しましょう。
インジケータを操作するには、indicatorオブジェクトを使用します。
コントローラのindicatorメソッドを実行するindicatorオブジェクトが返り、そのshowメソッドを実行すると画面にインジケータが表示されます。
//インジケータオブジェクト取得(ここでのthisはコントローラを指します) var indicator = this.indicator(); //インジケータ表示処理 indicator.show();
以下のように一行で書くと簡単でしょう。
this.indicator().show();
indicatorオブジェクトにはオプションがいくつかあります。
targetはインジケータを表示する範囲を指定するオプションです。指定しない場合はコントローラをバインドした要素に対してインジケータを表示します。(今回はtargetを指定しなくてOKです。)
messageはスロバーの左側に表示する文字列を指定するオプションです。
スロバーとはくるくる回る部品(処理中アイコン)のことです。今回はスロバーの横に'block'とメッセージを表示しましょう。
(function($){
//コントローラ
var indicatorController = {
__name: 'indicatorController',
//クリックイベントハンドラ
'#indicator click': function(){
//インジケータ表示処理
this.indicator({
message: 'block'
}).show();
}
};
//div範囲とコントローラを紐つける
$(function(){ h5.core.controller('#container', indicatorController) });
})(jQuery);
これでボタンをクリックするとインジケータが表示さます。
インジケータを表示することでユーザは処理中であることが分かり、画面がブロックされているので操作が出来ないようになります。
2までの実装では、ボタンをクリックするとインジケータはずっと表示されたままです。
setTimeoutを使って指定時間後にインジケータを除去しましょう。
setTimeoutは、第2引数で指定したミリ秒後に第1引数の関数を呼び出すタイマー関数です。
インジケータを除去するにはindicatorのhideメソッドを使用します。
//インジケータを変数に保持する
var indicator = this.indicator({
message: 'block'
}).show();
//0.8秒後にインジケータを非表示にする
setTimeout(function() {
indicator.hide();
}, 800);
これで完成です。
さぁ めしあがれ♪
indicatorのpercentメソッドを使用するとインジケータの進捗状況をパーセント表示することが出来ます。
var progress = 0;
var id = setInterval(function(){
//100以上でインジケータを除去し、処理を停止する。
if (progress >= 100) {
indicator.hide();
clearInterval(id);
}
//進捗状況の表示
indicator.percent(progress++);
}, 70);
indicatorオブジェクトのthemeオプションを設定するとインジケータの見た目を変更することが出来ます。
//インジケータ表示
var indicator = this.indicator({
message: 'block',
theme : 'a orange-theme' //デフォルトテーマ「a」の後にCSSクラス名を指定
}).show();
indicatorオブジェクトのtargetオプションにdocument.bodyを設定すると画面全体にインジケータを表示することが出来ます。
下記のはライブデモは領域がiframeで構成されているのでライブデモ内のみインジケータが表示されますが、downloadしたコードを実行すると画面全体にインジケータが表示されます。
//インジケータ表示
var indicator = this.indicator({
message: 'block',
target :document.body
}).show();
indicatorオブジェクトのpromisesオプションにPromiseを設定すると処理が実行されている間インジケータを表示することが出来ます。
Promiseを設定した場合は、処理が完了(done または fail)になると自動的にインジケータを非表示にします。
promisesオプションに複数のPromiseを設定する場合は配列で設定します。
// Promiseを返す処理1(4秒)
var func1 = this.own(function() {
var df1 = this.deferred();
setTimeout(this.own(function() {
this._dump('処理1 end');
df1.resolve(); //resolveするとpromiseがdoneになる
}), 4000);
return df1.promise();
});
// Promiseを返す処理2(6秒)
var func2 = this.own(function() {
var df2 = this.deferred();
setTimeout(this.own(function() {
this._dump('処理2 end');
df2.resolve(); //resolveするとpromiseがdoneになる
}), 6000);
return df2.promise();
});
// func1とfunc2が終わるのを待つので、6秒待つことになる。
// promisesの配列に登録された全てのpromiseが完了(done or fail)になったタイミングでインジケータは非表示になる
var indicator = this.indicator({
target:'#container',
promises: [func1(), func2()]
}).show().message('処理中...');