2009年3月25日水曜日

onSubmitで,戻り値がfalseなのにsubmitが実行されてしまう

cgiとJavaScriptを使ってweb siteをいじっている。その中ではformを使って同じcgiにPOSTでいろんな情報を投げている。その際,入力値が複数あるのだが,入力値の間違い等をformを飛ばした後(submitした後)に判断をするんじゃなくて,飛ぶ前(submitした直後で次のプロセスの直前)に判断をさせたいと思った。どうするか?webで検索すると,
<form action="http://xxxx.xxxx.xxx/yyy.cgi" method="post" onSubmit="zzz();">
を使うとでてくる。ここで zzz() はJavaScriptで書かせた関数。この関数 zzz() の戻り値を false にすると,submitがキャンセルされる,と書いてある。なので、zzz() の中で入力値の判断を行い、最後に false を返せば、submitされずに入力画面のままとなるはず。これはいい,と思ってさっそくJavaScriptを書いてみた。
 ところがやってみるとこれがうまくいかない。確かに zzz() って処理をしているが,submitがキャンセルされない。なんで??いろんなサイトを見てもその点については書いてくれてない。困った。実は1ヶ月ほど前にも似たような状況になって,あきらめて処理を変更した,というケースがあった。今回もあかんかな?と思ったら,ブログサイトでその件について書いてあるところがあった。でも,そのサイト忘れちゃった。その内容はというと,
<form action="http://xxxx.xxxx.xxx/yyy.cgi" method="post" onSubmit="zzz(); return false;">
のように,onSubmitで実行する関数のところに,return false; ってのを書いておく,って作戦。そうしないとzzz()から戻ってきた時に,submitが実行されてしまうらしい。return false; ってのを入れておくと確かにうまくいった。ちゃんと submit がキャンセルされて、入力画面のままになった。他の onSubmit について書いてるサイトではこの記述を見なかったけど,みんな苦労してないのかなぁ??それともそのようなトラブルにあった事ないのかなぁ?
 そういえば,上記のようにするとreturn false;で戻った時に確かにsubmitはキャンセルされるが,困ったことに今度はsubmitがうまくいかなくなった。その時どうしたかというと,xxx()の処理の最後に
document.yyyyy.submit(); return false;
ってのを入れておいた。そしたらOKの時にはちゃんとsubmitして,途中でreturn false;で戻った時にはちゃんとsubmitがキャンセルされてた。よかったよかった。

1 件のコメント:

Unknown さんのコメント...

onSubmit="return zzz()" で大丈夫かと…。