フォームの入力に全角スペースが混ざると、検索のヒット漏れやデータの不揃いの原因になります。送信時に全角スペースを半角スペースに変換しておくと、入力データを正規化できます。
submit イベントで、入力値に replace(/ /g, " ") を適用します。複数の入力欄はループでまとめて変換。英数字も含めて全角→半角にしたいなら normalize("NFKC") が便利です。基本:送信時に全角スペースを半角に変換
フォームの submit イベントで、対象の入力欄の値に対してreplace(/ /g, " ") を実行します。正規表現の は全角スペース(U+3000)です。
<form id="myForm" action="submit.php" method="post"> <input type="text" name="keyword" placeholder="キーワード"> <button type="submit">送信</button> </form>
const form = document.getElementById("myForm");
form.addEventListener("submit", () => {
const input = form.querySelector('input[name="keyword"]');
// 全角スペース( )を半角スペースに置換
input.value = input.value.replace(/ /g, " ");
// このまま送信が続行される
});
すべての入力欄をまとめて変換する
入力欄が複数あるフォームでは、1つずつ書くのは大変です。querySelectorAll で対象をまとめて取得し、ループで一括変換します。
form.addEventListener("submit", () => {
// テキスト系の入力欄とテキストエリアをまとめて取得
const fields = form.querySelectorAll('input[type="text"], textarea');
fields.forEach((field) => {
field.value = field.value.replace(/ /g, " ");
});
});
複数要素の取得・ループはquerySelectorAllで取得した複数要素を操作する方法も参考になります。
英数字も含めてまとめて正規化(normalize NFKC)
「全角の英数字(A12)も半角にしたい」場合は、normalize("NFKC") が便利です。全角スペースも半角スペースに変換されるため、これ1つで広く正規化できます。
const s = "A B 123";
console.log(s.replace(/ /g, " ")); // "A B 123"(スペースのみ半角)
console.log(s.normalize("NFKC")); // "A B 123"(英数字も半角に)
normalize("NFKC") は全角英数字・全角スペースだけでなく、半角カナ→全角カナや一部の記号も変換します。「スペースだけ」を変えたいなら replace(/ /g, " ")、「全角英数字も含めて広く正規化」したいなら normalize("NFKC") と使い分けましょう。全角→半角の詳しい変換は全角を半角に変換する方法で解説しています。動くデモ:replace と NFKC を見比べる
↓ 入力欄に全角まじりの文字を入力(または貼り付け)すると、2つの変換結果がその場で表示されます(空白が分かるよう引用符付きで表示):
replace(/ /g, " "): –
normalize("NFKC"): –
replace は全角スペースだけ半角になり、NFKC は全角英数字も半角になるのが一目で分かります。用途に合わせて選びましょう。
入力中にリアルタイム変換する(IME注意)
送信時ではなく入力中に変換したい場合は input イベントを使います。ただし日本語入力(IME)の変換中に書き換えると誤動作するため、変換が確定する compositionend のタイミングで処理するのが安全です。
const input = form.querySelector('input[name="keyword"]');
let composing = false;
input.addEventListener("compositionstart", () => { composing = true; });
input.addEventListener("compositionend", () => {
composing = false;
input.value = input.value.replace(/ /g, " "); // 確定後に変換
});
input.addEventListener("input", () => {
if (composing) return; // IME変換中は触らない
input.value = input.value.replace(/ /g, " ");
});
入力のリアルタイム監視はフォーム入力をリアルタイムで監視する方法で詳しく解説しています。
実務での注意点
input.value を書き換えると、カーソル(キャレット)が末尾に飛ぶことがあり、入力中だと操作しにくくなります。全角スペースの置換は送信時(submit)や入力欄から離れたとき(blur)にまとめて行う方が、入力の邪魔になりません。trim を行いましょう(クライアントとサーバーの両方で正規化するのが安全です)。よくある質問(FAQ)
submit イベントで各入力値に replace(/ /g, " ") を適用します。全角英数字も含めて変換したい場合は normalize("NFKC") や変換テーブルを使います。input イベントで値を取得して変換し、フィールドに戻します。ただしIME変換中は誤動作するため、compositionend(変換確定)のタイミングで処理するのが安全です。replace(/ /g, " ")。全角英数字も含めて広く正規化したいなら normalize("NFKC") です。NFKCは半角カナを全角にするなど変換範囲が広い点に注意します。value.replace(/ /g, " ").trim() で前後の空白を除去できます。連続する空白を1つにまとめるなら .replace(/\s+/g, " ") も併用します。まとめ
フォーム送信時の全角スペース変換は、submit イベントでvalue.replace(/ /g, " ") を実行するのが基本です。入力欄が複数あるなら querySelectorAll + forEach でまとめて変換します。
全角英数字も含めて広く正規化したいなら normalize("NFKC") が便利です(変換範囲が広い点に注意)。入力中に変換するなら、IMEに配慮してcompositionend のタイミングで処理しましょう。
