HTML のテキスト入力欄の入力値の一部を置換する ― 2021年12月23日 23時48分
この記事は HTML アドベントカレンダーの 23 日目の分、兼 JavaScript アドベントカレンダーの 23 日目の分です。
HTML のテキスト入力欄 (<input type="text">
要素や textarea
要素など) で選択範囲の文字列を置換したいとき、一昔前は JavaScript で以下のように書く必要がありました。
// 引数 field には HTMLInputElement オブジェクトまたは HTMLTextAreaElement オブジェクトを、
// 引数 newText には文字列を、それぞれ受け取る。
function replaceSelectionText(field, newText) {
var start = field.selectionStart;
var end = field.selectionEnd;
var text = field.value;
field.value = text.substring(0, start) + newText + text.substring(end);
field.setSelectionRange(start, start + newText.length);
}
(さらに大昔は IE 向けに TextRange
オブジェクトを使う必要がありました。)
今は HTML 標準で setRangeText
メソッドが定義されているため、以下のように書けます。
function replaceSelectionText(field, newText) {
field.setRangeText(newText);
}
setRangeText
メソッドには置換する範囲を指定することもできます。テキスト入力欄 field
の入力値が abcde
のとき、以下のコードを実行すると入力値が axde
になります。
field.setRangeText('x', 1, 3);
このとき、元の入力値において改行は \n
に正規化され、1 文字として数えられます。また、「1 文字」というのが Unicode の符号位置ではなく UTF-16 の符号単位を表すことに注意が必要です。
置換する範囲を指定して setRangeText
メソッドを呼び出したとき、選択範囲はメソッド呼び出しの前後であまり変化しないように調整されます。この挙動は、第 4 引数に select
、start
、end
、preserve
のいずれかの値を指定することで変更できます (省略時は preserve
)。以下の例ではメソッド呼び出し後に部分文字列 x
が選択されます。
field.setRangeText('x', 1, 3, 'select');
コメント
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2021/12/23/9450331/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。