問い合わせフォームに「書きかけ」が届くのは、変換確定の Enter が原因 | GH Media
URLがコピーされました

問い合わせフォームに「書きかけ」が届くのは、変換確定の Enter が原因

URLがコピーされました
問い合わせフォームに「書きかけ」が届くのは、変換確定の Enter が原因

問い合わせの通知メールに、こういうものが混ざることがあります。会社名が「株式会」で切れている。本文が「はじめまして」だけ。同じ人から3分後にもう一通、今度は最後まで書かれたものが届く。

送信者が不注意なのではありません。 日本語を入力して変換を確定しようと Enter を押した瞬間に、フォームが送信されています。書いている側には、送るつもりの操作をした自覚がありません。「送信ボタンを押していないのに送られた」ので、驚いて書き直してもう一度送る。 通知だけを見ていると、二重送信の多いフォームにしか見えません。

犯人は Enter ではなく「変換確定の Enter」

日本語入力では、Enter が2つの役割を持ちます。変換候補を確定する Enter と、確定後に押す Enter です。ブラウザ側から見ると、どちらも同じキーが押されたイベントとして流れてきます。

これを区別するために用意されているのが KeyboardEventisComposing です。IME が変換処理中であれば true、確定後なら false を返します。素直に読めば、isComposingtrue のときだけ弾けば済みそうに見えます。

実際、多くのフォームはこれで直ります。問題は、直りきらないブラウザがあることです。

isComposing だけでは足りない理由

Safari では、変換を確定するための Enter を押した時点で isComposingfalse になっているケースが報告されています。この状態では、確定の Enter と、確定後の「送信するつもりの Enter」を isComposing で区別できません。ガードを入れたのに Safari だけ直らない、という相談はほぼこれです。

もう1つ、環境によっては変換確定の Enter が keyCode 229 として届きます。 keyCode は仕様上は非推奨のプロパティですが、IME 由来のイベントを弾くフォールバックとしては今も有効です。

そこで実装は二段構えにします。

const input = document.querySelector('#message');
let composingEndedAt = 0;

input.addEventListener('compositionend', () => {
  composingEndedAt = performance.now();
});

input.addEventListener('keydown', (e) => {
  if (e.key !== 'Enter') return;

  // 1段目: 変換処理中の Enter を弾く
  if (e.isComposing || e.keyCode === 229) return;

  // 2段目: 変換確定の直後に届いた Enter を弾く(Safari 対策)
  if (performance.now() - composingEndedAt < 50) return;

  // ここまで来たものだけを「送信の意思がある Enter」として扱う
  e.preventDefault();
  submit();
});

2段目のしきい値は 50 ミリ秒程度が目安です。人間が変換を確定してから、次に意識して Enter を押し直すまでに 50 ミリ秒しかかからないことはありません。 逆に、確定と同時に発生する Enter はこの窓に収まります。

keypress イベントは使いません。すでに非推奨で、IME 絡みの挙動もブラウザ間で揃いません。判定は keydown に寄せます。

そもそも Enter で送らない、という選択

技術的な回避策の話をしましたが、問い合わせフォームに限れば、いちばん確実なのは「Enter では送らない」ことです。

HTML のフォームには暗黙の送信(implicit submission)という仕組みがあり、テキスト入力欄にフォーカスがある状態で Enter を押すと、送信ボタンを押したのと同じ扱いになります。これは仕様どおりの動作なので、JavaScript を書かなければ「Enter で送られない」状態にはなりません。

用途別に整理すると、こうなります。

入力欄の種類Enter に持たせる役割
問い合わせフォームの各項目何も起こさない(送信はボタンのみ)
検索ボックス検索を実行(1項目のみなので誤送信の実害が小さい)
チャット・コメントの入力欄改行。送信は修飾キー(Ctrl / ⌘ + Enter)か送信ボタン

チャット UI で Enter を送信に割り当てるかどうかは長く議論のある論点ですが、日本語入力を前提にするなら、送信に修飾キーを要求するほうが事故は確実に減ります。 送信が1操作増えることを嫌う声は出ますが、書きかけが飛ぶコストのほうが大きいのが普通です。

変換確定の Enter が送信を発火させる経路と、isComposing・compositionend 直後判定の二段ガードで止める位置を示した図

検収でどう確かめるか

制作会社に依頼している場合、この不具合は成果物を見ても分かりません。 英数字だけで入力テストをすると再現しないためです。受け入れ確認では、次の手順を明示的に入れてください。

  1. 日本語 IME をオンにして、変換が必要な文字列を入力する。 「かぶしきがいしゃ」のように、一度で確定しない語を選びます
  2. 変換候補が出ている状態で Enter を押す。 ここでフォームが送信されたら不具合です
  3. Chrome と Safari の両方で試す。 Chrome だけ直っていて Safari で再現する、が最も多いパターンです
  4. スマートフォンでも試す。 iOS / Android の日本語キーボードは PC と挙動が異なります

この4つは、フォーム最適化(EFO)の観点で入力項目を削る話とは別軸のチェックです。項目数を減らしても、送信のタイミングが暴発する問題は残ります。あわせて、入力エラーの文言をどう書くかキーボード操作とフォーカス移動の設計も、同じ受け入れ確認の中で見ておくと二度手間になりません。

次にやること

まず、直近3ヶ月の問い合わせ通知を見返して、本文が極端に短いもの・同一人物からの連続送信を数えてください。 そこに一定数あるなら、フォームは動いているが取りこぼしている状態です。件数が出れば、改修を後回しにする理由がなくなります。

そのうえで、自社のフォームを IME をオンにして自分で送ってみてください。 変換候補が出ている状態の Enter で送信されるなら、それが今この瞬間も起きていることです。

問い合わせフォームの改修、入力体験の見直し、リード取りこぼしの調査については、グリームハブの HP 制作・リニューアル相談で承っています。既存サイトの構成によって最短の直し方が変わるため、個別にご相談ください。お問い合わせからどうぞ。

Sources

無料ダウンロード

Web制作 費用・発注・集客 完全ガイド【2026年版】

費用相場・制作会社の選び方・集客戦略まで、中小企業のWeb担当者が知っておくべき全知識をPDFにまとめました。

メルマガにも登録されます。いつでも解除可能です。

URLがコピーされました

グリームハブ株式会社は、変化の激しい時代において、アイデアを形にし、人がもっと自由に、もっと創造的に生きられる世界を目指しています。

記事を書いた人

鈴木 翔

鈴木 翔

技術の可能性に魅了され、学生時代からプログラミングとデジタルアートの分野に深い関心を持つ

関連記事

「WEB」の記事一覧を見る