onsubmitの戻り値をfalseにしてsubmitを実行しない(中断させる)方法
JavaScriptで、onsubmitの戻り値をfalseにしてフォームのsubmitを中断させる(実行しない)方法を紹介します。
1.onsubmitイベントとは
onsubmitイベントは、フォームの送信ボタン(type属性がsubmitのボタン)がクリックされた時に発生するイベントです。
<form method="post" action="foo.cgi" onsubmit="foo();">
<input type="text" value="" />
<input type="submit" value="送信" />
</form>
2.submitを中断する(=フォームを送信しない)方法
onsubmitイベントを使ってsubmitを中断するケースとして、送信時にJavaScriptでフォームのチェックをして、フォームデータに未入力の項目がある場合、「return false;」で送信を中止するというパターンがあると思いますが、中止したはずのに送信が実行されてしまうということがあります。
次のソースコードはその例で、未入力の項目がある場合に「return false」を行ってますが、送信は中断されません。
<script type="text/javascript">
function check() {
for(i = 0; i < document.foo.length; i++) {
if (document.foo.elements[i].type == "text") {
if (document.foo.elements[i].value == '') {
alert("未入力の項目があります。");
return false;
}
}
}
}
</script>
<form name="foo" action="foo.cgi" onsubmit="check();">
<input type="text" id="a" value="" />
<input type="text" id="b" value="" />
<input type="submit" value="送信" />
</form>
原因は、赤色で示したform要素のonsubmit属性の記述が誤っているためです。
送信を中止するためには、onsubmit属性で起動した関数の返却値(false)をさらに返却する必要があります。つまり、
onsubmit="関数名"
ではなく、
onsubmit="return 関数名"
としなければなりません。
また、常に送信を中止したい場合は、
onsubmit="関数名; return false;"
と書けばよいでしょう。
先程のサンプルでは、次の青色部分のように修正すれば送信を中止します。
<script type="text/javascript">
function check() {
for(i = 0; i < document.foo.length; i++) {
if (document.foo.elements[i].type == "text") {
if (document.foo.elements[i].value == '') {
alert("未入力の項目があります。");
return false;
}
}
}
}
</script>
<form name="foo" action="foo.cgi" onsubmit="return check();">
<input type="text" id="a" value="" />
<input type="text" id="b" value="" />
<input type="submit" value="送信" />
</form>
「true」はonsubmitイベントのデフォルト返却値なので、OKの場合に「return true;」を明示的に記述する必要はないと思います。
3.jQueryでの記述
jQueryで記述する場合は、次のようになるみたいです。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script>
$(function(){
$('#foo').submit(function(){
var flag = 0;
// フォームチェック
$(this).find('input[type=text]').each(function(){
if ($(this).val() == '') {
// NGの場合
flag = 1;
return false; // break
}
});
if (flag) {
return false; // return
}
});
});
</script>
<form id="foo" action="foo.cgi">
<input type="text" id="a" value="" />
<input type="text" id="b" value="" />
<input type="submit" value="送信" />
</form>
青色で示した、submit()ブロック内で「return false;」をすればフォームの送信を中止するようです。
each()ブロック内の赤色で示した「return false;」は、each()のループを脱出しているだけなので、間違えないように注意しましょう。
- 複数の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の正規表現で文字列を抜き出す「グループ化」