onsubmitイベントと「return 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()のループを脱出しているだけなので、間違えないように注意しましょう。