• ベストアンサー

フォーム入力チェックの効率のよいソース

こんにちは、おせわになります。 アンケートを作っています。 内容が何項目かあり、そのうちの多くがラジオボタンによるものです。 入力チェックを行う際に下記のような形で行っておりますが、 ひとつの項目につき、ラジオボタンが10個ほど用意されてるものもあり、 10個分 document.forms.reason[0].checked==false) && と付け足していくのは効率が悪いとおもいます。 簡潔にソースを書くにはこの部分をどう書けばいいか教えてください。 多分forを使うのかなとは思いますが よくわかりません。 それと念のため補足ですが、ひとつの関数の中にすべてのチェックを入れたいので 性別のラジオボタン分の関数、年代のラジオボタン分の関数のように 分けずに書いています。 function aaa() { if ((document.forms.reason[0].checked==false) && (document.forms.reason[1].checked==false)){ alert("ボタンが未選択です"); return false ; } if ((document.forms.sei[0].checked==false) && (document.forms.sei[1].checked==false)){ alert("ボタンが未選択です"); return false ; } if ((document.forms.age[0].checked==false) && (document.forms.age[1].checked==false)&& (document.forms.age[2].checked==false)&& (document.forms.age[3].checked==false)){ alert("ボタンが未選択です"); return false ; } ・・・・・・・・・・・・・・・つづく } //--> </script> よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

記載のソースは問題があります。 obj[f[i].id]=true; としていますが、idは排他的な属性なので、 ラジオボタンなどグループを指定することができないはず。 今回の件については、日本語をHTML側に埋め込む場合と、 スクリプト側に埋め込む場合があります。 わかりやすいのはHTML側でTITLEを設定してしまうこと。(aaa) ただし若干複雑になるので理解度がひくいとはまる可能性があります。 そうでないなら、2番目のようにあらかじめアラート用のリストを つくっておく。(bbb) もっと個別に調整したいなら、一つ一つを手で書く。(ccc) それぞれ見比べて、よさそうなのをつかってください。 <script language="javascript"> function aaa(f) { obj=new Object(); for(var i=0;i<f.length;i++){ if (f[i].type=="radio" || f[i].type=="checkbox"){ if(typeof(obj[f[i].name])=="undefined") obj[f[i].name]=new Object(); if(f[i].checked){ obj[f[i].name].flg=true; }else if(obj[f[i].name].flg!=true){ obj[f[i].name].title=f[i].title; obj[f[i].name].flg=false; } } } for(var i in obj){ if(!obj[i].flg){ alert(obj[i].title+"がチェックされていない"); return false ; } } } function bbb(f) { var obj=new Object(); var namelist=new Object(); namelist["reason"]="理由"; namelist["sei"]="性別"; namelist["age"]="年齢"; for(var i=0;i<f.length;i++){ if (f[i].type=="radio" || f[i].type=="checkbox"){ if(f[i].checked){ obj[f[i].name]=true; }else if(obj[f[i].name]!=true){ obj[f[i].name]=false; } } } for(var i in obj){ if(!obj[i]){ alert(namelist[i]+"がチェックされていない"); return false ; } } } function ccc(f) { var obj=new Object(); var namelist=new Object(); for(var i=0;i<f.length;i++){ if (f[i].type=="radio" || f[i].type=="checkbox"){ if(f[i].checked){ obj[f[i].name]=true; }else if(obj[f[i].name]!=true){ obj[f[i].name]=false; } } } if(!obj["reason"]){ alert("理由がチェックされていない"); return false ; } if(!obj["sei"]){ alert("年齢がチェックされていない"); return false ; } if(!obj["age"]){ alert("年齢がチェックされていない"); return false ; } } </script> <form onSubmit="return aaa(this)"> reason: <input type="radio" name="reason" value="0" title="理由">0 <input type="radio" name="reason" value="1" title="理由">1<br> sei: <input type="radio" name="sei" value="0" title="性別">0 <input type="radio" name="sei" value="1" title="性別">1<br> age: <input type="radio" name="age" value="0" title="年齢">0 <input type="radio" name="age" value="1" title="年齢">1 <input type="radio" name="age" value="2" title="年齢">2 <input type="radio" name="age" value="3" title="年齢">3 <input type="submit" value="実行"> </form> <hr> reason: <form onSubmit="return bbb(this)"> <input type="radio" name="reason" value="0">0 <input type="radio" name="reason" value="1">1<br> sei: <input type="radio" name="sei" value="0">0 <input type="radio" name="sei" value="1">1<br> age: <input type="radio" name="age" value="0">0 <input type="radio" name="age" value="1">1 <input type="radio" name="age" value="2">2 <input type="radio" name="age" value="3">3 <input type="submit" value="実行"> </form> <hr> reason: <form onSubmit="return ccc(this)"> <input type="radio" name="reason" value="0">0 <input type="radio" name="reason" value="1">1<br> sei: <input type="radio" name="sei" value="0">0 <input type="radio" name="sei" value="1">1<br> age: <input type="radio" name="age" value="0">0 <input type="radio" name="age" value="1">1 <input type="radio" name="age" value="2">2 <input type="radio" name="age" value="3">3 <input type="submit" value="実行"> </form>

2pola4
質問者

お礼

なんどもありかどうございます! bbbのパターンを使い、正常に動きました。 おかげさまで締め切りに間に合いそうです。 本当にありがとうございました。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

#2です >今回の内容もbbbに含めた上で書きたいのですが可能でしょうか? 可能だと思いますが、やってみてだめだったらいってください。 他のものも一括でチェックするなら、こんな感じですかね。 見てわかると思いますが、ラジオだけ構造的な問題で 2段階でチェックしています <script language=javascript> function aaa(f){ var obj=new Object(); for(var i=0;i<f.length;i++){ switch(f[i].type){ case "text": //テキストボックス if (f[i].value==""){ alert(f[i].name+"が入力されていない"); f[i].focus(); return false; } break; case "select-one": //テキストボックス if (f[i].value==""){ alert(f[i].name+"が選ばれていない"); f[i].focus(); return false; } break; case "checkbox": //チェックボックス if (f[i].checked==false){ alert(f[i].name+"にチェックがない"); f[i].focus(); return false; } break; case "radio": //ラジオボタン if (f[i].type=="radio"){ if(f[i].checked){ obj[f[i].name]=true; }else if(obj[f[i].name]!=true){ obj[f[i].name]=false; } } break; } } for(var i in obj){ if(!obj[i]){ alert(i+"がチェックされていない"); return false ; } } return true; } </script> <form method="get" action="hoge.htm" onSubmit="return aaa(this)"> radio1: <input type="radio" name="radio1" value="0">0 <input type="radio" name="radio1" value="1">1<br> radio2: <input type="radio" name="radio2" value="0">0 <input type="radio" name="radio2" value="1">1<br> <hr> select1: <select name="select1"> <option value="">選んでください</option> <option value="1">回答1</option> <option value="2">回答2</option> <option value="3">回答3</option> </select><br> select2: <select name="select2"> <option value="">選んでください</option> <option value="1">回答1</option> <option value="2">回答2</option> <option value="3">回答3</option> </select><br> <hr> text1:<input type="text" name="text1" value=""><br> text2:<input type="text" name="text2" value=""><br> <hr> checkbox1:<input type="checkbox" name="checkbox1" value="1"><br> checkbox2:<input type="checkbox" name="checkbox2" value="1"><br> <hr> <input type="submit" value="実行"> </form> ちなみにチェックボックスはどういうコンセプトで チェックをするかわかりません。別に選ばなくても 成立するはずですから・・・ (いちおう今回は選ばないとエラーにしてありますが こんなケースはあまり意味がないかも)

2pola4
質問者

補足

すばやいお返事、ありがとうございます。 今回のも勉強になりました。 試したのですがこれですと、ご指摘の通りチェックボックスについてはすべてを選ばないとアラートになってしまい・・・、(最低一個のみ選んでいればよいのですが・・) そこでいろいろ試したのですが、#2で教えていただいたコードに書き足してみたところ、大丈夫なようなのですがこれでよいのでしょうか。またアラート時にname+"を選んでください"と出るのですがこれを日本語の項目名にしたいときは下記のようにidでよいのでしょうか。(今回nameの名前はプログラム上変えてはいけない為) function aaa(f) { var obj=new Object(); for(var i=0;i<f.length;i++){ if ((f[i].type=="radio")||(f[i].type=="checkbox")){ if(f[i].checked){ obj[f[i].id]=true; }else if(obj[f[i].id]!=true){ obj[f[i].id]=false; } } } for(var i in obj){ if(!obj[i]){ alert(i+"がチェックされていない"); return false ; } } if (document.forms.age.value==""){ window.alert("年を入力!"); return false; } (中略) return true; } すみませんがどうぞよろしくお願いいたします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

こんなかんじでしょうか <script language=javascript> function aaa(f) { var obj=new Object(); for(var i=0;i<f.length;i++){ if (f[i].type=="radio"){ if(f[i].checked){ obj[f[i].name]=true; }else if(obj[f[i].name]!=true){ obj[f[i].name]=false; } } } for(var i in obj){ if(!obj[i]){ alert(i+"がチェックされていない"); return false ; } } return true; } </script> <form method="get" action="x.php" onSubmit="return aaa(this)"> reason: <input type="radio" name="reason" value="0">0 <input type="radio" name="reason" value="1">1<br> sei: <input type="radio" name="sei" value="0">0 <input type="radio" name="sei" value="1">1<br> age: <input type="radio" name="age" value="0">0 <input type="radio" name="age" value="1">1 <input type="radio" name="age" value="2">2 <input type="radio" name="age" value="3">3 <input type="submit" value="実行"> </form>

2pola4
質問者

補足

早速のご回答、ありがとうございます。 下記回答者様への補足もご覧頂きたいのですが、 今回のフォームにはひとつの関数の中に、テキストボックスやチェックボックス、ラジオボタンなどへの入力チェックを設定しています。 ですので上記方法でうまく行くことは行くのですが そうするとラジオボタンのチェックのみ行われ、他のチェックが行われません。 <form method="get" action="x.php" onSubmit="return aaa(this)">のonSubmitにはすでに違う関数(bbb)が入っており、今回の内容もbbbに含めた上で書きたいのですが可能でしょうか? 説明がうまくなくすみませんがお分かりでしたら教えてください。よろしくおねがいします。

  • KanjiTalk
  • ベストアンサー率30% (7/23)
回答No.1

for (i=0; i<document.forms.reason.length; i++) { if (document.forms.reason[i].checked == true) { return document.forms.reason[i]; break; } } としてはどうでしょうか。

2pola4
質問者

補足

早速のご回答、ありがとうございます。 上記を使わせていただき、途中まではうまく行くのですがやはりうまく行きません。 function aaa(){ for (i=0; i<document.forms.reason.length; i++) { if (document.forms.reason[i].checked == true) { return document.forms.reason[i]; break; } window.alert("理由を選んでください!"); return false; ///この場合alertはどこに書いたらよいのでしょうか それとこの一文が終わると、次のチェックがあり(今回はテキストボックス) if (document.forms.age.value==""){ window.alert("年令を入力!"); return false; } ///この次はチェックボックスなどと続いていきます。お答えいただいたもので一項目目はうまくチェックできたのですが、理由のラジオボタンを選択して他の項目は未記入で送信しようとするとチェックがおこなわれません。 何度もすみませんがよろしくおねがいします。

関連するQ&A

  • フォームの入力チェックをすると既に入力した項目が消える

    実は過去のQ&Aの中でご紹介されていた ホームページを拝見させて頂いたのですが、 残念ながら私の応用力が足りず、 上手く作ることが出来ません。 下記のように書いてみたのですが、 これでは未入力のメッセージにOKを押すと その前に入力したものが全て消えてしまいます。 何方か、正しい書き方をご教示下さいますよう 宜しくお願い申し上げます。 <script language="JavaScript"> <!-- function checkForm(){ if(document.form1.chk1.checked == false && document.form1.chk2.checked == false) { alert('チェックなし'); return false; } { flag = 0; for ( i = 0 ; i < document.form1.radiobtn.length ; i++){ if (document.form1.radiobtn[i].checked){ flag = 1; } } if (!flag){ alert('ラジオなし'); return false; } if(document.form1.sel.selectedIndex == 0){ alert('メニューなし'); document.form1.sel.focus(); return false; } if(document.form1.bun.value == ""){ alert('文字なし'); document.form1.bun.focus(); return false; } } return true; } //--> </script>

  • チェックボックスの選択チェック

    ラジオボタンの選択チェック、セレクトボタンの選択チェックのあとにチェックボックスの選択チェックをしたいのですが、どのように入れればよいのでしょうか。教えてください。 ↓参考までに↓ function check() { var flag=0; if( document.form1.seibetu.length){ flag=1; var i; for(i=0; i<document.form1.seibetu.length; i++) if(document.form1.seibetu[i].checked)flag=false; } if(flag){ alert('性別が選択されていません'); return false; } if(document.form1.nenrei.value=="")flag=true; if(flag){ alert('年齢が選択されていません'); return false; } if( document.form1.Q1.length){ flag=1; var i; for(var i=0; i<document.form1.Q1.length; i++) if(document.form1.Q1[i].checked)flag=false; if(flag){ alert('Q1が選択されていません'); return false; } else {★★★ここに入れたい★★★   ;} } }

  • フォームの入力チェックについて

    下記のプログラムで、チェックボックスや、ラジオボタンの 入力チェックを行うと、 値自体は、$_POST['radio_check']にて取得できるのですが、Javascriptコンソールにて objElm has no propertiesと 出てしまいます。 外部ファイル部分 function requiredRadioCheck(objElm,strErr) { flag=false; for(i=0;i<objElm.length;i++){ if(objElm[i].checked){flag=true;} } if(!flag){ return strErr + "が入力されていません。 \r"; }else{ return ""; } } html部分 function chk(){ strErr=""; strErr+=requiredCheck(strErr+=requiredRadioCheck(document.Form.radio_check.value,"ラジオボタン"); strErr+=numberTypeCheck if(strErr==""){ return true; }else{ window.alert(strErr); return false; } }

  • ラジオボタンのチェックの確認(cgiを使用で)

    JavaScriptを使用して、ラジオボタンのチェックの確認をしたいのですが、うまくいかないので教えてください。 ○ a   ○ b というようになっていて、aかbを選択すればメッセージは出ない、どちらも選択してないときのみ 「選択してください」のようなメッセージを表示。 ラジオボタンの選択の有無は if(document.フォーム名.ラジオボタン名[0].checked == true){ のようにすればいいとききやってみました。 直接指定すれば、動作がおかしい(2回メッセージが出る)ものの、動作はしました。 cgiでファイル数を増やすことができるようにしてあるので、その分ラジオボタンも増えるので、 以下のようにしてみました。 for ($jscount = 1;$jscount<$FORM{'COUNT'}+1;$jscount++){ if(document.NYUURYOKU.SYURUI$jscount[0].checked == true){ }else if(document.NYUURYOKU.SYURUI$jscount[1].checked == true){ } else { alert('種類$jscountを選択してください'); return false; } しかしうまくいきません。 詳しい方よろしくお願いします。

  • ラジオボタンとセレクトボックスの選択チェック

    ラジオボタン、セレクトボタンの選択チェックをしたいのですが 同時にチェックする場合どうすればよいのでしょうか。 失敗策ですが、参考までに↓ function check() { var flag=0; if( document.form1.seibetu.length){ flag=1; var i; for(i=0; i<document.form1.seibetu.length; i++){ if(document.form1.seibetu[i].checked){ flag=0; break; } } } else{ if(!document.form1.seibetu.checked){ flag=1; } } if(flag){ window.alert('性別が選択されていません'); return false; } else{ return true; } if(document.form1.nenrei.options[document.form1.nenrei.selectedIndex]. value==""){ flag=1; } if(flag){ window.alert('年齢が選択されていません'); return false; } else{return true; } }

  • フォーム内のラジオボタンの数の取得

    flag = 0; for(i=0;i<document.frm.re_id.length;i++){   if (document.frm.re_id[i].checked){     flag = 1;   } } if (!flag){     alert('ラジオボタンのいずれかをご選択ください');   return false; } return true; 今はこのように記述してtrueの時にsubmitが実行されるようにしています。 ラジオボタンが2つ以上ある時はdocument.frm.re_id.lengthがきちんとラジオボタンの数を返してくるんですが、ラジオボタンが1つの場合undefindとなってしまいます。 document.フォーム名.ラジオ名.lengthはラジオボタンが1つの場合は使えないのですか?

  • メールフォームの未入力チェック ラジオボタンの場合

    メールフォームに、」ラジオボタンでA~Eの項目があります。これを仮に”koumoku”という名前をつけたとして、最初にはどこにもチェックを入れない状態で表示したいと思います。 それで、A~Eのどれかを必ず選択してもらいたいので送信前に未入力の場合にはアラーとを出したいのですが、 if(document.mail.Koumoku.value!='checked'){ window.alert('未入力個所があります。\nご確認ください。'); return false; } にすると、チェックしてもアラーとがでてきます。 また !='chekced' を =='' にすると、チェックが無くても通ってしまいます。 どうしたら良いのでしょうか?

  • 複数のラジオボタンの選択チェック

    Q1とQ2の2問があり、ラジオボタンで回答を選択するようにしていますが、 ラジオボタンを選択しなかった場合、選択を促すようメッセージを表示させるようJavaScriptで以下のように作成してみましたがうまくいきません。 Q1とQ2の両方を選択しなかった場合、「Q1が選択されていません」とメッセージが表示されますが、Q1だけを選択してQ2を選択しなかった場合はメッセージが表示されません。 いろいろ調べてみたのですが、function checkの使い方に問題があるのでしょうか? function check(){ var flag = 0; if(document.form1.Q1.length) { flag = 1; var i; for(i = 0; i < document.form1.Q1.length; i ++){ if(document.form1.Q1[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q1が選択されていません'); return false; } else{ return true; } var flag = 0; if(document.form1.Q2.length) { flag = 1; var i; for(i = 0; i < document.form1.Q2.length; i ++){ if(document.form1.Q2[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q2が選択されていません'); return false; } else{ return true; } }

  • フォームのチェックについて

    今、フォームの送信ボタンを押すとチェックする 関数を作成しております。 function restChar() { if(10000 < document.F1.ご質問内容.value.length) window.alert("ご質問内容は全角5,000字以内でお願いします"); } function check(){ var flag = 0; if(document.F1.name.value == ""){ // 「お名前」の入力をチェック flag = 1; } else if(document.F1.kana.value == ""){ // 「パスワード」の入力をチェック flag = 2; } else if(document.F1.mail.value == ""){ // 「コメント」の入力をチェック flag = 3; }      else if(document.F1.ご質問内容.value == ""){ // 「コメント」の入力をチェック flag = 4; } if(flag == 1){ window.alert('お名前を入力してください'); // 入力漏れがあれば警告ダイアログを表示 return false; // 送信を中止 } if(flag == 2){ window.alert('フリガナを入力してください'); // 入力漏れがあれば警告ダイアログを表示 return false; // 送信を中止 } if(flag == 3){ window.alert('メールアドレスを入力してください'); // 入力漏れがあれば警告ダイアログを表示 return false; // 送信を中止 }      if(flag == 4){ window.alert('ご質問内容を入力して下さい'); // 入力漏れがあれば警告ダイアログを表示 return false; // 送信を中止 } fOBJ = document.F1.mail.value; check = /.+@.+\..+/; if (!fOBJ.match(check)){ window.alert("メールアドレスが正しくありません"); return false; // 送信を中止 } fOBJ = document.F1.ご質問内容.value.length; if(10000 < fOBJ){ window.alert("ご質問内容は全角5,000字以内でお願いします"); return false; // 送信を中止 } return true; // 送信を実行 } こんな感じです。 1-4のチェックは問題ないのですが、 アドレスと文字数のチェックは、一度は ダイアログがでますが、連続で押すと通ってしまいます。 何がわるいのでしょうか?

    • ベストアンサー
    • Java
  • フォームPOST後「戻る」時のチェック値の取得

    フォームでPOSTをしたあと、history.backや戻るボタンで戻ったときに、POST時に選択したラジオボタンのcheckedもfalseになってしまうのですが、チェックされているものを取得することはできるのでしょうか。 ■form部分 <form name="form1" method="post" action="..."> <input type="radio" name="radio1" value="1">1<br /> <input type="radio" name="radio1" value="2">2<br /> <input type="radio" name="radio1" value="3">3<br /> </form> ■JavaScript部分 var radio1 = document.form1.radio; for(var i=0;i<radio1.length;i++) { if (radio1[i].checked) { alert(i); } } このようなコードで、選択してPOST後、「戻る」で入力ページ表示時にJavaScriptを実行しても、 radio1[i].checkedは全てfalseになってしまいます。 また選択→POST→戻る→そのままPOSTとすると、選択したvalue値は正しくサーバーに送られます。 「戻る」でのページ表示時に選択したものを取得する方法があれば教示いただけますか。

専門家に質問してみよう