入力フォームで正しいメールアドレスが入力されたのかを確認するため、以下のようなJavaScriptを記述しましたが、動作しません。
関数FormCheckは動作するのですが、関数Checkは動作しません。
現状では、メールアドレスを入力する欄に「www」とだけ入力しても
チェックされないので、その他の入力項目がきちんと入力できていれば
メール送信されてしまいます。
どのようにすればこのCheck関数が動作するのかどなたか教えていただけないでしょうか?よろしくお願いします。
--------------------Java Script 部分---------------------------
<script language="JavaScript">
<!--
//必須項目のチェック
function FormCheck(Form) {
Error = new Array();
i = 0;
// 氏名の入力チェック
if ((Form["name"]) && (Form["name"].value == "")) {
Error[i] = "氏名は必須項目です。";
i++;
}
// メールアドレスの入力チェック
if ((Form["email"]) && (Form["email"].value == "")) {
Error[i] = "メールアドレスは必須項目です。";
i++;
}
// 質問したい支店の選択チェック
if ((Form["address"]) && (Form["address"][0].selected == true)) {
Error[i] = "質問したい支店は必須項目です。";
i++;
}
// 未入力があればアラート
if (Error.length > 0) {
ErrorText = Error.join("\n");
alert ("未入力項目があるので送信できません。\n\n"+ErrorText);
return false;
}
}
// -->
<!--
//メールアドレスチェック
var mail;
function Check(){
mail = document.myform.email1.value;
if(!mail.match(/.*@.*\..*/i)){
alert("メールアドレスが不正です。");
}
}
// -->
</script>
--------------------HTML 部分-----------------------------------
<body>
<table width="419" height="453">
<tr>
<td width="732">
<form action="./cgi/test/sendmail.cgi" name="myform" method="POST" target="_self"
onSubmit="return FormCheck(this);Check()">
<table width="481">
<!--氏名を入力 -->
<tr>
<td><strong>氏名</strong></td>
<td><input type="text" name="name" size="30" maxlength="50"></td>
</tr>
<!--メールアドレスを入力 -->
<tr>
<td><strong>メールアドレス</strong></td>
<td><input type="text" name="email" size="50" maxlength="60"></td>
</tr>
<!--支店選択 -->
<tr>
<td><strong>質問したい支店</strong></td>
<td>
<select name="address">
<option value="" selected></option>
<option value="aaa@hoemail.com">A支店</option>
<option value="bbb@hoemail.com">B支店</option>
<option value="ccc@hoemail.com">C支店</option>
</select>
</td>
</tr>
</table>
<!--送信・キャンセルボタン -->
<center>
<table>
<tr>
<td><input type="submit" name="submit" value="送 信"></td>
<td><input type="reset" name="reset" value="キャンセル"></td>
</tr>
</table>
</center>
</form>
</td>
</tr>
</table>
No.3ベストアンサー
- 回答日時:
※質問はなるべく分かりやすくしたほうが回答を得られやすいです。
・TABLEタグやCENTERタグなど、必要でないタグは省く
■どのようにすればこのCheck関数が動作するのか
Formタグにはonsubmit属性が定義されていますが、この内容だと
Check関数は値をチェックした後の事後処理に過ぎないです。
まず、FormCheck関数が値(真偽)を返した地点で、そのフォームは
値に応じて送信してしまいます。
ですので、この場合はFormCheck関数とCheck関数を一つの関数に
まとめてやる必要があります。
■なるべく元のソースを使って一つの関数にまとめてみました。
function FormCheck(Form) {
var Error = new Array();
// 氏名の入力チェック
if ((Form.name) && (Form.name.value == "")) {
Error.push("氏名は必須項目です。");
}
// メールアドレスの入力チェック
if ((Form.email) && (Form.email.value == "")) {
Error.push("メールアドレスは必須項目です。");
}
if (!document.myform.email.value.match(/.*@.*\..*/i)){
Error.push("メールアドレスが不正です。");
}
// 質問したい支店の選択チェック
if ((Form.address) && (Form.address[0].selected == true)) {
Error.push("質問したい支店は必須項目です。");
}
// 未入力があればアラート
if (Error.length > 0) {
ErrorText = Error.join("\n");
alert ("未入力項目があるので送信できません。\n\n" + ErrorText);
return false;
}
}
--------HTML---------
フォームのみ抜粋
<form action="./cgi/test/sendmail.cgi" name="myform" method="POST" target="_self"
onSubmit="return FormCheck(this);">
■スクリプトに対するアドバイス
・配列の要素の追加について
元のコードではi変数をカウンタとして要素を追加していましたね。
しかし、JavaScriptでは配列に要素を追加する関数としてpush関数が
用意されています。
非常によく使われる関数なので是非利用しましょう。
Error.push("message");
・フォーム内のエレメントへのアクセスについて
Form["email"]とするのも良いのですが、この場合は通常、
変数を利用してアクセスする場合に使用されます。
そのような用途がない場合は、普通に記述したほうが
いいです。
Form.email
・元のコード、Check関数について
var mail;
function Check(){
mail = document.myform.email1.value;
if(!mail.match(/.*@.*\..*/i)){
alert("メールアドレスが不正です。");
}
}
少し突っ込んだ話になりますが、apena2さんのためになると思うので
お話ししようと思います。
結論からいいますと、mail変数はローカル変数として宣言したほうが良いです。
この関数では、mail変数はグローバススコープすなわち、関数外で
宣言されていますよね。でも、Check関数を見る限りグローバル変数
である必要がありませんよね。
まず、これが第一の理由です。
そして、第2の理由についてですが、パフォーマンス面でのお話になります。
少しややこしくなるので、簡単に説明します。
Check関数がmail変数を参照するときに、まずCheck関数はローカルスコープ内(関数内)に
mail変数がないか探索します。そして、見つからなかった場合は、グローバルスコープ
すなわち関数外を探索することになります。。。
ということは、ローカル変数を探索するのに比べて、グローバルスコープを余分に
探索しなければならないので処理に時間がかかるのです。
このように、スコープチェーン(すみません、意味は調べてください)をたどるだけで
パフォーマンスが著しく低下してしまうのです。
ご回答ありがとうございました。
教えていただきましたように修正をしたいと思います。
プログラミング初心者なのでパフォーマンス面までは
考えがおよびませんでした。
大変助かりました。ありがとうございました。
No.2
- 回答日時:
functionは1つでいいんでないの
mail.match(/.*@.*\..*/i)ではチェックする意味ない(これだとアットマークドットだけでもOK)
--------------------Java Script 部分---------------------------
<script language="JavaScript">
<!--
//必須項目のチェック
function FormCheck(Form) {
Error = new Array();
i = 0;
// 氏名の入力チェック
if ((Form["name"]) && (Form["name"].value == "")) {
Error[i] = "氏名は必須項目です。";
i++;
}
// メールアドレスの入力チェック
if ((Form["email1"]) && (Form["email1"].value == "")) {
Error[i] = "メールアドレスは必須項目です。";
i++;
}
// 質問したい支店の選択チェック
if ((Form["address"]) && (Form["address"][0].selected == true)) {
Error[i] = "質問したい支店は必須項目です。";
i++;
}
// 未入力があればアラート
if (Error.length > 0) {
ErrorText = Error.join("\n");
alert ("未入力項目があるので送信できません。\n\n"+ErrorText);
return false;
}
var mail = document.myform.email1.value;
if(mail.match(/^[-+\w\.]+\@[-\w\.]+\.[a-z]{2,5}$/i)==null){alert("メールアドレスが不正です。");return false;}
}
// -->
</script>
--------------------HTML 部分-----------------------------------
<body>
<table width="419" height="453">
<tr>
<td width="732">
<form action="./cgi/test/sendmail.cgi" name="myform" method="POST" target="_self" onsubmit="return FormCheck(this)">
<table width="481">
<!--氏名を入力 -->
<tr>
<td><strong>氏名</strong></td>
<td><input type="text" name="name" size="30" maxlength="50"></td>
</tr>
<!--メールアドレスを入力 -->
<tr>
<td><strong>メールアドレス</strong></td>
<td><input type="text" name="email1" size="50" maxlength="60"></td>
</tr>
<!--支店選択 -->
<tr>
<td><strong>質問したい支店</strong></td>
<td>
<select name="address">
<option value="" selected></option>
<option value="aaa@hoemail.com">A支店</option>
<option value="bbb@hoemail.com">B支店</option>
<option value="ccc@hoemail.com">C支店</option>
</select>
</td>
</tr>
</table>
<!--送信・キャンセルボタン -->
<center>
<table>
<tr>
<td><input type="submit" name="submit" value="送 信"></td>
<td><input type="reset" name="reset" value="キャンセル"></td>
</tr>
</table>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javascriptの電卓で最初の何も...
-
テーブル内のチェックボックス...
-
Ifが正常に動作しない。
-
VBSでの自動ログイン
-
JavaScriptの「.querySelectorA...
-
追加したテキストボックスとテ...
-
複数のselect値で1つも選択され...
-
return trueとreturn falseの用...
-
プルダウン 項目が多いので先頭...
-
hiddenのvalueの値を変えたい
-
onchangeイベントを強制的に発...
-
チェックボックスの設定
-
javascriptでASPにデータを渡す
-
テキストエリアをenterキーでフ...
-
クリックの度に加算していくには?
-
プルダウンで選択すると、DBの...
-
【jQuery】input nameの文字列...
-
フォームで入力した値を別のフ...
-
<td>の中のonClick="location" で
-
<JavaScript>tableタグを入力不...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptの「.querySelectorA...
-
複数のselect値で1つも選択され...
-
チェックボックス付きのテーブ...
-
ラジオボタンが選択されたらテ...
-
入力チェックの外部スクリプト...
-
Javascriptの電卓で最初の何も...
-
文字数を数える際に空白、改行...
-
画面の2重起動をチェックする...
-
画面表示とともにtableの指定の...
-
jQueryで合計を出したい
-
localStorageでのcheckbox制御
-
JavaScriptによる自動計算フォーム
-
同一nameの input type="text"...
-
テーブル内のチェックボックス...
-
formで項目を連結したい
-
クリックしたラジオボタンの行...
-
Javascriptで自動計算の合計の...
-
ラジオボタンを一括で操作する...
-
送信ボタン連打を抑止したいです
-
ボタン押下すると一行テキスト...
おすすめ情報