Skip to content

API

このページは TextInputGuard の利用者向け API リファレンスです。
基本的な使い方は Getting Started、実際の挙動は Demo を先に見ると理解しやすくなります。

インポート

js
import { attach, attachAll, autoAttach, rules } from "text-input-guard";

エントリーポイント

attach()

ts
/**
 * @param {HTMLInputElement|HTMLTextAreaElement} element
 * @param {AttachOptions} [options]
 * @returns {Guard}
 */
declare function attach(element, options = {}): Guard;

単一の要素にガードを適用します。 戻り値は Guard オブジェクトです。

js
const guard = attach(input, {
	rules: [
		rules.numeric({ allowFullWidth: true, allowMinus: true, allowDecimal: true }),
		rules.digits({ int: 8, frac: 2 }),
		rules.comma()
	]
});

attachAll()

ts
/**
 * @param {Iterable<HTMLInputElement|HTMLTextAreaElement>} elements
 * @param {AttachOptions} [options]
 * @returns {GuardGroup}
 */
declare function attachAll(
	elements: Iterable<HTMLInputElement | HTMLTextAreaElement>,
	options?: AttachOptions
): GuardGroup;

複数要素へ同一設定をまとめて適用します。 戻り値は GuardGroup オブジェクトです。

js
const group = attachAll(document.querySelectorAll(".price"), {
	rules: [
		rules.numeric({ allowFullWidth: true, allowMinus: true, allowDecimal: true }),
		rules.digits({ int: 8, frac: 2 }),
		rules.comma()
	]
});
const guard = group.getGuards()[0];

autoAttach()

ts
/**
 * @param {Document|DocumentFragment|ShadowRoot|Element} [root=document]
 * @returns {GuardGroup}
 */
declare function autoAttach(root?: HTMLElement | Document): GuardGroup;

HTML の data-tig-* 属性からルールを読み取り、自動的に適用します。 戻り値は GuardGroup オブジェクトです。

html
<input
	id="price"
	type="text"
	inputmode="decimal"
	style="text-align: right"
	data-tig-rules-numeric
	data-tig-rules-numeric-allow-full-width="true"
	data-tig-rules-numeric-allow-minus="true"
	data-tig-rules-numeric-allow-decimal="true"
/>
js
const guards = autoAttach();
const guard = guards.getGuards()[0];

戻り値/引数の詳細

AttachOptions

attach() に渡す設定オプションです。
入力のルール・エラー表示・コールバックなどを指定できます。

optiontypedefault説明
rulesRule[][]適用するルール配列。配列の順番が各フェーズ内での実行順になります。
warnbooleantrue非対応ルールや不正な設定があった場合に console.warn を出力するかどうか。
invalidClassstring"is-invalid"エラーが存在する場合に displayElement に付与される CSS クラス名。
onValidate(result: ValidateResult) => void-バリデーション評価が完了した際に呼び出されるコールバック。入力中 (input) と確定時 (commit) の両方で呼ばれます。

Guard

attach() が返す Guard の公開メソッドです。

detach()

ts
detach(): void

ガードを解除します。

  • イベントリスナーを削除
  • swap モード時は元の状態に復元
js
guard.detach();

isValid()

ts
isValid(): boolean

現在エラーが無い場合は true を返します。

js
guard.isValid();

getErrors()

ts
getErrors(): TigError[]

現在のエラー一覧を返します。 返却値はコピーであり、外部から直接変更できません。

js
guard.getErrors();

getRawValue()

ts
getRawValue(): string

送信用の値(正規化済み値)を取得します。

  • swap モード時は hidden 側の値
  • 通常モード時は表示要素の値
js
guard.getRawValue();

getDisplayValue()

ts
getDisplayValue(): string

ユーザーが実際に操作している要素の値を取得します。

js
guard.getDisplayValue();

getRawElement()

ts
getRawElement(): HTMLInputElement | HTMLTextAreaElement

送信用の要素を取得します。

  • swap モード時は hidden 要素
  • 通常モード時は元の要素
js
guard.getRawElement();

getDisplayElement()

ts
getDisplayElement(): HTMLInputElement | HTMLTextAreaElement

ユーザーが操作している表示用要素を取得します。

js
guard.getDisplayElement();

evaluate()

ts
evaluate(): void

入力中評価を手動実行します。

実行フェーズ:

  1. normalizeChar
  2. normalizeStructure
  3. validate

通常は入力中、IME確定時に実行されます。

js
guard.evaluate();

commit()

ts
commit(): void

確定評価を手動実行します。

実行フェーズ:

  1. normalizeChar
  2. normalizeStructure
  3. validate
  4. fix
  5. validate(再評価)
  6. format

通常は blur 時に自動実行されます。

setValue()

ts
setValue(value: string | number | null | undefined, mode?: "evaluate" | "commit"): void

値をプログラムから設定します。

  • valuestring | number | null | undefined

  • mode(省略可) "none" | "input" | "commit"(既定値 "commit"

nullundefined は空文字として扱われます。 NaNInfinity は空文字に変換されます。

js
guard.setValue(1234);
guard.setValue("0012", "input");
guard.setValue("", "none");

GuardGroup

attachAll() / autoAttach() が返す GuardGroup の公開メソッドです。

js
/**
 * @typedef {Object} GuardGroup
 * @property {() => void} detach - 全部 detach
 * @property {() => boolean} isValid - 全部 valid なら true
 * @property {() => TigError[]} getErrors - 全部のエラーを集約
 * @property {() => Guard[]} getGuards - 個別Guard配列
 */

onValidate

onValidate は評価完了時に呼び出され、現在のエラー状態を受け取ることができます。
エラーが存在しない場合でも呼び出されます。

コールバックには ValidateResult が渡されます。

propertytype説明
guardGuardこの結果を発生させた Guard インスタンス
source"input" | "commit"評価が実行されたタイミング
errorsTigError[]発生しているエラー一覧
isValidbooleanエラーが存在しない場合 true

TigError

バリデーションエラーを表すオブジェクトです。
ルールの評価中に制約違反が発生した場合に生成されます。

エラーは以下の方法で取得できます。

  • guard.getErrors()
  • onValidate コールバック

構造

propertytype説明
codestringエラー識別子
rulestringエラーを発生させたルール名
phasePhaseNameエラーが発生したフェーズ
detailanyエラーの追加情報(制限値など)

code

code"rule.reason" 形式の文字列です。

code説明
length.max_overflow最大文字数を超えている
width.max_overflow表示幅の制限を超えている
bytes.max_overflowバイト数の制限を超えている
digits.int_overflow整数部の桁数を超えている
digits.frac_overflow小数部の桁数を超えている
filter.invalid_char許可されていない文字が含まれている

phase

エラーが発生した処理フェーズを表します。 通常バリデーションで発生します。

phase説明
normalizeChar文字単位の正規化
normalizeStructure構造の正規化
validateバリデーション
fix確定時の補正
format表示フォーマット

detail

detail にはエラーの追加情報が格納されます。

文字数制限系

制限エラーでは以下の形式になります。

propertytype説明
limitnumber設定されている制限値
actualnumber実際の値

json
{
	"code": "length.max_overflow",
	"rule": "length",
	"phase": "validate",
	"detail": {
		"limit": 10,
		"actual": 12
	}
}
filter

filter.invalid_char の場合は以下の情報が含まれます。

propertytype説明
countnumber不正文字の総数
charsstring[]検出された不正文字
categorystring[]許可カテゴリ
hasAllowbooleanallow オプションが指定されているか
hasDenybooleandeny オプションが指定されているか

Rules

公開されているルール生成関数 rules.xxx(...) の仕様(オプション・挙動)をまとめます。 ルールは 配列順に実行 されます。

推奨の並び順

  • 数値入力: numeric()digits()comma()prefix() / suffix()
  • 文字列入力: ascii() / kana() / trim()filter()

表示整形系(comma / prefix / suffix)は、基本的に最後に置くのを推奨します。

文字列系

氏名・コード・メモなど「文字列として扱う入力」に使用します。

kana()

かな文字の正規化を行います。

js
rules.kana({
	target: "katakana-full"
});

オプション

optiontypedefault説明
target"katakana-full" | "katakana-half" | "hiragana""katakana-full"統一先
nfkcbooleantrue事前に Unicode NFKC 正規化を行う(合体文字などを正規化)

imeOff()

ASCII入力欄に日本語IMEで入った文字を、IMEオフ入力相当の ASCII 文字へ寄せます。

主に次のような文字を変換します。

  • ,
  • .
  • [
  • ]
  • \
  • 全角ASCII (ABC123! など) → 半角ASCII

js
rules.imeOff();

補足

  • 単なる「半角化」ではなく、日本語IME入力で入りやすい文字を ASCII 入力向けに矯正するルールです。
  • IMEのデフォルトをOFFにする inputmode="url" と併用することを推奨します。

ascii()

ASCII範囲へ正規化します(カナは対象外)。 全角英数字・全角記号・全角スペースなどを半角ASCIIへ正規化し、必要に応じて英字の大文字/小文字を統一します。

js
rules.ascii();

オプション

optiontypedefault説明
case"none" | "upper" | "lower""none"統一先

補足

  • ascii() は ASCII 相当文字の半角化・英字統一を行うルールです。
  • などは ascii() だけでは ASCII の ,. になりません。これらも半角にしたい場合、先に imeOff() で ASCII 入力相当に寄せ、その後に ascii() を適用する組み合わせをおすすめします。

filter()

許可/禁止文字の制御を行います。

js
rules.filter({
	category: ["digits"],
	mode: "error"
});

オプション

optiontypedefault説明
categoryFilterCategory[]-許可カテゴリ(配列)
mode"drop" | "error""drop"不許可文字の扱い(drop: 削除 / error: 削除せずエラーを積む)
allowRegExp | string-追加で許可する正規表現(1文字にマッチさせる想定)
allowFlagsstring-allow が文字列のときの flags("iu" など。g / y は無視)
denyRegExp | string-除外する正規表現(1文字にマッチさせる想定)
denyFlagsstring-deny が文字列のときの flags("iu" など。g / y は無視)

補足

category で指定できる値は次の通りです。

  • "digits" : ASCII 数字 (0-9)
  • "alpha-upper" : ASCII 英字大文字 (A-Z)
  • "alpha-lower" : ASCII 英字小文字 (a-z)
  • "ascii" : ASCII 可視文字 + スペース含む (U+0020–U+007E)
  • "hiragana" : ひらがな (U+3040–U+309F)
  • "katakana-full" : 全角カタカナ (U+30A0–U+30FF)
  • "katakana-half" : 半角カタカナ (U+FF65–U+FF9F)
  • "bmp-only" : BMP のみ許可(U+0000–U+FFFF、サロゲートペア禁止、補助平面禁止)
  • "sjis-only" : 正規 Shift_JIS(JIS X 0208 + 1バイト領域)のみ許可
  • "cp932-only" : Windows-31J (CP932) でエンコード可能な文字のみ許可
  • "single-codepoint-only" : 単一コードポイントのみ許可(結合文字や異体字セレクタを含まない)

運用上の注意

  • allow / deny は「1文字にマッチさせる想定」です。長さをまたぐパターンを入れると意図とズレる可能性があります。
  • allow / deny を文字列で渡す場合に、flags を分けて指定したいときは allowFlags / denyFlags を使います(g / y は無視されます)。

trim()

前後の空白を削除します。

js
rules.trim();

length()

入力値の最大長を制御します。単位は「グラフェム」「UTF-16コード単位」「UTF-32コード単位」から選べます。

js
rules.length({
	max: 10,
	mode: "block",
	unit: "grapheme"
});

オプション

optiontypedefault説明
maxnumber-最大長。未指定なら制限なし
mode"block" | "error""block"最大長を超えたときの挙動(block: 超過分を入力時にカット / error: 変更せずエラー扱い)
unit"grapheme" | "utf-16" | "utf-32""grapheme"長さの単位

補足

  • "grapheme": 見た目の「1文字」単位に近い数え方(結合文字や絵文字シーケンスをまとめて扱う想定)
  • "utf-16": UTF-16コード単位で数えます。サロゲートペアは 2 として数えられます。
  • "utf-32": コードポイント単位(例:"é" は 2 になる)

運用上の注意

  • "utf-16" は JavaScript の string.length と同じ数え方であり、HTML の maxlength 属性と実質的に同じ動作になります。既存の maxlength と揃えたい場合は "utf-16" を選ぶと挙動が一致します。
  • "utf-16" を選ぶと、絵文字などのサロゲートペアは「2」としてカウントされます。
  • "utf-32" は結合文字(ダイアクリティカルマーク等)や異体字セレクタを含むと 2 以上になりやすいです。
  • ユーザー体験を優先するなら "grapheme"、既存Web仕様との互換性を優先するなら "utf-16"、コードポイント単位で厳密に制御したい場合は "utf-32" が向いています。

width()

入力値の最大幅を制御します。半角は 1、全角は 2 として数えます(0幅要素も考慮)。

js
rules.width({
	max: 20,
	mode: "block"
});

オプション

optiontypedefault説明
maxnumber-最大幅(半角=1、全角=2)。未指定なら制限なし
mode"block" | "error""block"最大幅を超えたときの挙動(block: 超過分を入力時にカット / error: 変更せずエラー扱い)

補足

数え方のルール

  • 0幅: グラフェムを構成する要素(結合文字、異体字セレクタ、スキントーン修飾子、Tag Sequence 構成文字、ZWSP / ZWNJ / ZWJ / WJ など)
  • 1幅: ASCII 文字、半角カタカナ、Regional Indicator(単体)
  • 2幅: 上記以外

※ 目的が Shift_JIS 時代の半角全角に近いため、Unicode 公式の EastAsianWidth.txt は使っていません。

運用上の注意

  • width() は「見た目の横幅」をざっくり揃える用途(氏名・住所・品名の“見た目の桁揃え”など)に向いています。
  • 絵文字や異体字セレクタなどは 0幅要素を含むため、「見た目は 1 文字でも内部要素が複数」になりがちです。length(unit: "grapheme") と目的が近いですが、width() は半角全角の混在を強く意識したカウントになります。
  • 「見た目を揃えたい」なら width()、「文字数を揃えたい」なら length() を選ぶのが基本です。

bytes()

入力値の最大サイズ(バイト数)を制御します。単位は "utf-8" | "utf-16" | "utf-32" | "sjis" | "cp932" から選べます。

js
rules.bytes({
	max: 64,
	mode: "block",
	unit: "utf-8"
});

オプション

optiontypedefault説明
maxnumber-最大サイズ(バイト数)。未指定なら制限なし
mode"block" | "error""block"最大サイズを超えたときの挙動(block: 超過分を入力時にカット / error: 変更せずエラー扱い)
unit"utf-8" | "utf-16" | "utf-32" | "sjis" | "cp932""utf-8"サイズの単位(バイト数の数え方)

補足

  • "utf-8": UTF-8 にエンコードしたときのバイト数(ASCII=1、ひらがな/漢字は多くが 3、絵文字は 4 など)
  • "utf-16": UTF-16 のコードユニット数 × 2(サロゲートペアは 4 bytes)
  • "utf-32": コードポイント数 × 4(例:"é" は 8 bytes)
  • "sjis" / "cp932": Shift_JIS(Windows-31J 系)にエンコードしたときのバイト数
    • 「旧Windows互換」「Shift_JIS 前提の外部I/F」などに合わせる用途です。エンコード不能になるので、 filter()"sjis-only" / "cp932-only" など)とセットで使用してください。

※ ライブラリ内部では Shift_JIS で算出します(sjis/cp932 の差異はフィルタ側の許可範囲で制御する想定)

運用上の注意

  • DB カラムのバイト制限(例:VARCHAR2(XX BYTE) 相当)や、外部システムの「○○ bytes まで」制約に合わせたいときは bytes() が向いています。
  • "utf-8" は実運用で一番遭遇しやすいバイト制限(API/DB/ログ/外部I/F)なので、迷ったらまず "utf-8" が無難です。
  • 「ユーザー体験優先で自然に“文字数っぽく”止めたい」なら length(unit: "grapheme")、 「見た目の桁揃え」なら width()、 「外部制約(bytes)」に合わせたいなら bytes()、という棲み分けがしやすいです。

数値系

金額・数量など「数値として扱う入力」に使用します。

numeric()

数値入力の土台となるルールです。 全角→半角変換や、- / . の構造整理を行います。

js
rules.numeric({
	allowFullWidth: true,
	allowMinus: true,
	allowDecimal: true
});

オプション

optiontypedefault説明
allowFullWidthbooleantrue全角数字・記号を許可し半角へ正規化
allowMinusbooleanfalse- を許可(先頭のみ)
allowDecimalbooleanfalse. を許可(1つのみ)
allowEmptybooleantrue空文字を許可する

補足

  • allowEmpty: false の場合、確定時(blur)に空文字が 0 へ補正される想定です(numeric の fix フェーズ)。
  • 整数入力の inputmode="numeric" 又は実数入力の inputmode="decimal" と併用することを推奨します。

digits()

桁数制限・丸め・入力超過時の挙動を制御します。

js
rules.digits({
	int: 8,
	frac: 2,
	modeInt: "block",
	modeFrac: "block",
	fixFracOnBlur: "round",
	forceFracOnBlur: true
});

オプション

optiontypedefault説明
intnumber-整数部の最大桁数(省略可)
fracnumber-小数部の最大桁数(省略可)
countLeadingZerosbooleanfalse整数部の先頭ゼロを桁数に含める
modeInt"block" | "error""block"入力中:整数部が最大桁を超える入力の挙動
modeFrac"block" | "error""block"入力中:小数部が最大桁を超える入力の挙動
fixIntOnBlur"none" | "truncateLeft" | "truncateRight" | "clamp""none"blur時の整数部補正
fixFracOnBlur"none" | "truncate" | "round""none"blur時の小数部補正
forceFracOnBlurbooleanfalseblur時に小数部を必ず表示(frac 桁まで0埋め)

補足

  • forceFracOnBlur: true は、frac が指定されていることを前提に、小数部を frac 桁まで 0 埋めして表示する用途です。

comma()

整数部に3桁区切りカンマを付与します。

js
rules.comma();

補足

  • 確定時(blur)および表示整形フェーズで適用されます。
  • 数値系ルールの最後に配置してください(prefix / suffix よりは前が基本)。

prefix()

表示用の先頭文字列を付与します。

js
rules.prefix({ text: "¥" });

オプション

optiontypedefault説明
textstring必須先頭に付ける文字列
showWhenEmptybooleanfalse値が空でも表示するか

suffix()

表示用の末尾文字列を付与します。

js
rules.suffix({ text: "円" });

オプション

optiontypedefault説明
textstring必須末尾に付ける文字列
showWhenEmptybooleanfalse値が空でも表示するか

autoAttach 向け data 属性方法

autoAttach() では data-tig-rules-ルール名 から始まるデータ属性を読み取り自動で設定できます。

numeric ルールを適用したい場合、まず numeric を付けてください。 さらに各オプションを続けて allow-full-width のようにケバブケースで記載します。省略した場合はデフォルトが使用されます。

オプションの filter.category(["A", "B"]) のような文字列の配列を入れたい場合は、カンマ区切り "A, B"で入れてください。

html
<input
	data-tig-rules-numeric
	data-tig-rules-numeric-allow-full-width="true"
	data-tig-rules-numeric-allow-minus="true"
	data-tig-rules-numeric-allow-decimal="true"
	data-tig-rules-digits
	data-tig-rules-digits-int="8"
	data-tig-rules-digits-frac="2"
	data-tig-rules-comma
/>