リターン(Enterキー)でフォームを送信しない方法
フォームのテキスト入力中にうっかりリターン(Enterキー)を押してしまい、中途半端なフォームが送信されてしまったという経験をした人は結構多いのではないかと思います。
ということで、リターン(Enterキー)でフォームを送信しないようにする方法を紹介します。この記事の投稿時点でのGoogle Chrome・Firefoxの最新版とIE9で同じ動作になることを確認しています。
1.リターンでフォームが送信される原因
次のように、type属性が「text」のinput要素、いわゆるテキストフィールドが含まれるフォームで、テキストフィールドがアクティブなときにリターンを押すとフォームが送信されてしまいます。
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="text" name="bar" />
<input type="submit" value="送信" />
</form>
または
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="text" name="bar" />
<button type="submit">送信</button>
</form>
type属性が「password」の場合も同様です。
2.送信ボタンを書き換える
送信ボタンを赤色のように、「type="button"」のinput要素またはbutton要素に書き換えることで、リターンによる送信を回避できます。
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="text" name="bar" />
<input type="button" onclick="submit();" value="送信" />
</form>
または
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="text" name="bar" />
<button type="button" onclick="submit();">送信</button>
</form>
つまり、type属性が「submit」のinput要素またはbutton要素を作らない、ということがポイントです。
onclick属性の部分をjQueryで書き直すと、次のようになります。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script>
$(function(){
$("input[type=button]").click(function(){
$("form").submit();
});
});
</script>
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="text" name="bar" />
<input type="button" value="送信" />
</form>
なお、フォームにテキストフィールドが1つしかない場合は次の対処も併せて行う必要があります。
3.テキストフィールドがフォームに1つしかない場合
次のように、テキストフィールド(またはパスワードフィールド)がフォームに1つしかない場合、2項の対処を行っても送信されてしまいます(下)。textareaや他のtype属性のinput要素が複数存在しても挙動は同じです。
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="button" onclick="submit();" value="送信" />
</form>
このような場合はダミーのテキストフィールドのinput要素を用意して、テキストフィールドが2つある状態にします。
<form action="hoge.cgi">
<input type="text" name="foo" />
<input type="text" name="dummy" style="display:none;">
<input type="button" onclick="submit();" value="送信" />
</form>
4.押されたキーを判定して抑止する
3項まではtype属性が「submit」の要素を排除することで実現しましたが、ここでは押されたキーによって判定する方法を紹介します。
押されたキー(リターンは「13」)で判定するには次のようにします。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script>
$(function(){
$("input[type=text]").keypress(function(ev) {
if ((ev.which && ev.which === 13) ||
(ev.keyCode && ev.keyCode === 13)) {
return false;
} else {
return true;
}
});
});
</script>
<form action="hoge.cgi">
<input type="text" name="foo" onkeypress="return entsub()" />
<input type="submit" value="送信" />
</form>
この方法であればtype属性がsubmitのinput要素を使えるようです。
5.参考サイト
参考サイトは以下です。ありがとうございました。
- Netsphere Laboratories - Enterキーを打ってもsubmit(送信)しないようにするには
- xykの日記 - jQueryでENTERキーによるSubmitを防止する
- blog.nomadscafe.jp - エンターキーの押下でフォームの送信を行わないようにする
- Technical Info - 各ブラウザのenterキー押下時の動作(submit)
- 複数のsubmitボタンをonsubmitで判定する方法
- JavaScriptの時間を0パディングする方法
- JavaScriptでJSONデータを作る方法
- JavaScriptやjQueryで設定されたイベントの定義場所を調べる方法
- javascript:void(0)のまとめ
- setTimeout()やsetInterval()で引数を渡す方法
- JavaScriptのFormDataの使い方
- JavaScriptメールアドレスチェッカー
- PCのブラウザでiPhoneやAndroidのようなパスワードフォームを実現するJavaScriptライブラリ「FormTools」
- JavaScriptでフォーカスのあたっている要素を取得する「document.activeElement」
- 入力フォームの全角・半角を勝手に変換してくれるJavaScript
- JavaScriptエラーを表示・確認する方法のまとめ
- ソーシャルボタンのJavaScriptでfunctionの前に「!」がついている理由
- JavaScriptでCSSの擬似クラスを設定する方法
- JavaScriptの正規表現で文字列を抜き出す「グループ化」