今回は、テキストフィールドウィジェットに関する紹介だ。Dijitのテキストフィールドは、入力値のチェックや入力支援、値のフォーマットといった機能を備えており、非常に機能が豊富だ。
Dojoが持つテキストフィールドウィジェットの概要
Dojoには、豊富なテキストフィールドウィジェットが存在する。目的に応じてそれらを使い分けるわけだが、通常のテキストフィールド(<input type="text">
)と比べると以下のような利点がある。
- 入力値の自動的な整形機能……フォーカス喪失時に、数値、日付、金額などさまざま形式へと自動的に入力値が整形される
- 表示形式と値の分離……入力値がどのように整形されようとも、それに左右されず純粋な値を取得できる。「10,000」と表示されているフィールドから数値の10000を取得するなど。フォームを送信した際にサーバに送信される値は、NumberTextBoxやCurrencyTextBoxであれば生の数値、DateTextBoxやTimeTextBoxであればISO-8601フォーマット(例: "2008-04-11T00:00:00")の文字列で送信される
- 入力値のチェック機能……入力された値のバリデーションも自動的に行われる。数値や日付、範囲などはもちろんのこと、カスタムの正規表現を用いたり、チェック関数を自作することも可能
- その他の機能……前後の空白を除去したり、自動的に大文字/小文字に変換するなど、細かい機能をいくつもそろえる
以下に詳細なリファレンスを示す。
テキストフィールド
対応するクラス
dijit.form.TextBox
利用例
通常のテキストフィールド |
TextBox:<div dojoType="dijit.form.TextBox" lowercase="true">
説明
以降で紹介するテキストフィールドのベースとなるウィジェットだ。標準的なテキストフィールドが持つ属性に加え、入力された値を加工(前後の空白除去や大文字/小文字の変換など)する機能を備える。
属性
lowercase | trueの場合、フォーカスが外れた際に入力された文字列をすべて小文字に変換する |
---|---|
maxLength | 最大入力文字数 |
propercase | trueの場合、単語の先頭をすべて大文字に変換する |
size | テキストフィールドのサイズ |
trim | trueの場合、入力値の前後から空白を除去する |
uppercase | trueの場合、フォーカスが外れた際に入力された文字列をすべて大文字に変換する |
メソッド
getDisplayedValue() | ユーザに対して表示されている文字列を取得する。DateTextBoxやCurrencyTextBoxなどは表示上の文字列と、内部的に保持されている(サーバに送信される)値が異なるため、両者を別々に扱うことができる |
---|---|
setDisplayedValue(/*String*/ value) | ユーザに対して表示する文字列をセットする |
setValue(value, /*Boolean, optional*/ priorityChange, /*String, optional*/ formattedValue) | テキストフィールドに値をセットする。引数の説明は以下: value…セットする値 priorityChange…trueの場合、onChangeイベントが発生する(省略可) formattedValue…表示する値(省略可) |
入力値チェック可能なテキストフィールド
対応するクラス
dijit.form.ValidationTextBox
利用例1: 正規表現を用い、7桁の郵便番号のみを許容
バリデーションテキストボックス |
<div
dojoType="dijit.form.ValidationTextBox"
promptmessage="郵便番号(nnn-nnnn)"
regexp="\d{3}\-\d{4}">
</div>
利用例2: 拡張ポイントregExpGen()をオーバーライドして、7桁の郵便番号のみを許容
<div
dojoType="dijit.form.ValidationTextBox"
promptmessage="郵便番号(nnn-nnnn)"
constraint="{}">
<script type="dojo/method" event="regexpgen" args="constraint">
return "\\d{3}\\-\\d{4}";
</script>
</div>
利用例3: 拡張ポイントisValid()をオーバーライドして、7桁の郵便番号のみを許容
<div
dojoType="dijit.form.ValidationTextBox"
promptmessage="郵便番号(nnn-nnnn)">
<script type="dojo/method" event="isValid">
return this.textbox.value.match(/\d{3}\-\d{4}/);
</script>
</div>
説明
入力値のチェックを行うことができるテキストボックス。以下のテキストボックスウィジェットの親クラスとなる。
入力値のチェックは、以下の方法を用いて行うことができる。
- regExp属性に正規表現を指定
- regExpGenメソッドをオーバーライド…同メソッドは、constraint属性に指定したJavaScriptオブジェクトを引数にとり、正規表現文字列を生成して返す
- isValidメソッドをオーバーライド・・・入力値のチェック結果をtrue/falseで返す。入力された値は「this.textbox.value」にアクセスすると取得できる
属性
constraints | バリデータ関数に渡されるために使われる、ユーザ定義のオブジェクト |
---|---|
invalidMessage | 値が不正だった場合に表示されるメッセージ |
promptMessage | 入力のヒントになるメッセージ |
regExp | 入力値のバリデーションに使用される正規表現 |
required | 入力が必須かどうか(Boolean) |
拡張ポイント
displayMessage(/*String*/ message) | invalidMessageやpromptMessageを表示するためにオーバーライドできる(デフォルトではツールチップが使用される) |
---|---|
String getErrorMessage(/* Boolean*/ isFocused) | 入力エラー時に表示するメッセージを返す |
String getPromptMessage(/* Boolean*/ isFocused) | 入力のヒント(フォーカス時に表示される)になるメッセージを返す |
Boolean isValid(/* Boolean*/ isFocused) | 入力値のチェック結果をtrue/falseで返す |
String regExpGen(/* Object */constraints) | カスタムの正規表現を利用してチェックするようオーバーライドできる |
数値入力フィールド
対応するクラス
dijit.form.NumberTextBox
dijit.form.CurrencyTextBox
利用例: 10000以上、99999以下の数値を受け付けるテキストフィールド
数値入力テキストフィールド |
<div dojoType="dijit.form.NumberTextBox"
constraints="{min: 10000, max: 99999}">
</div>
説明
数値のみ入力を受け付けるテキストフィールド。フォーカス喪失時に、自動的に桁区切りなどのフォーマットが行われる。また、CurrencyTextBoxを使うと、ロケールに合わせた通貨記号を付与することも可能(currency属性を用いて、通貨記号を指定することも可能)。
上の例のように、constraints属性を用いて最小値(min)や最大値(max)を指定することも可能。また、ValidationTextBoxを継承しているため、同クラスの機能をすべて利用できる。
属性
currency | CurrencyTextBoxのみ。ISO-4217で規定されている通貨コードを利用して、通貨記号の指定を行うことができる |
---|
拡張ポイント
Integer compare(/* Object */val1, /* Object */val2) | 範囲のチェックに用いられる比較関数。オーバーライドし、独自の比較を行わせることができる。第1引数には入力値、第2引数はconstraints属性で指定したminやmaxの値が渡される |
---|---|
Boolean isInRange(/* Boolean*/ isFocused) | 独自の範囲チェックを行うためにオーバーライドすることができる |
日付/時刻入力フィールド
対応するクラス
dijit.form.DateTextBox
dijit.form.TimeTextBox
利用例: 日付入力フィールド
日付入力フィールド |
DateTextBox:<div dojoType="dijit.form.DateTextBox"></div>
利用例: 時刻入力フィールド
時刻入力フィールド |
TimeTextBox:
<div dojoType="dijit.form.TimeTextBox" constraints="{formatLength: 'full'}">
</div>
説明
日付や時刻の入力用フィールドで、フォーカスすると画像のように入力支援用のカレンダーが表示される。内部的には値をDate型で保持しているほか、サーバに送信される値はISO-8601フォーマット(例:"2008-04-11T00:00:00")が使用される。
これらのクラスは、ValidationTextBoxを継承しているだけではなく、最小値や最大値を用いた範囲チェックも行うことができる。
また、さまざまなconstraints属性を用いて入力値のチェックや書式指定を行うことが可能だ。constraints属性については、英語になってしまうがこちらのドキュメントを参照いただきたい。
拡張ポイント
Integer compare(/* Object */val1, /* Object */val2) | 範囲のチェックに用いられる比較関数。オーバーライドし、独自の比較を行わせることができる。第1引数には入力値、第2引数はconstraints属性で指定したminやmaxの値が渡される |
---|---|
Boolean isInRange(/* Boolean*/ isFocused) | 独自の範囲チェックを行うためにオーバーライドすることができる |
まとめ
今回は、Dojoが持つさまざまなテキストフィールドウィジェットに関する説明を行った。次回は、HTMLのformタグに対応するウィジェット、dijit.form.Formに関する説明を行う。