function hissuCheck(form) {
var paramArray = Array("…24個");
var alrtArray = Array("…24個");
var len = paramArray.length;
for(i=0; i<len; i++) {
var obj = form.elements[paramArray[i]];
if(obj.type == "text") {
if(obj.value == "") {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
} else if(obj.type == "select-one" || obj.type == "select-multi") {
for(varSelected=0, j=0; j<obj.options.length; j++) {
if(obj.options[j].selected)varSelected+=obj.options[j].value;
}
if(varSelected == 0) {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
} else {
for(varChecked=0, k=0; k<obj.length; k++) {
if(obj[k].type == "checkbox") {
if(obj[k].checked)varChecked++;
}
}
if(varChecked == 0) {
alert(alrtArray[i]+"は必須入力です");
return false;
}
}
}
return true;
}
必須チェックですが、最後のチェックボックスだけがチェックしても「…は必須です」とアラートが表示されてしまいます。どうか宜しくお願いします
No.5ベストアンサー
- 回答日時:
ANo.2です。
ANo.2で書いた事もありますが、決定的な誤りがあります。
ANo.3の回答へのお礼で、以下のように仰っています。
>又、elseの後にalert(obj.length)と入れると[undefined]と表示されました。for文の条件分内の
>obj.lengthはだめなのでしょうか?checkboxの数を数えるために何かいいプロパティがあれば
>いいのですが…obj.valueは適切な名前が表示されましたが、for分内の条件文がスルーされてるので
>obj[k].value等は確認できませんでした。
下記は、ソースのループ部分全体を抜き出したものです。
for(i=0; i<len; i++) { // element単位でループ
var obj = form.elements[paramArray[i]];
if(obj.type == "text") {
if(obj.value == "") {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
} else if(obj.type == "select-one" || obj.type == "select-multi") {
for(varSelected=0, j=0; j<obj.options.length; j++) {
if(obj.options[j].selected)varSelected+=obj.options[j].value;
}
if(varSelected == 0) {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
} else {
for(varChecked=0, k=0; k<obj.length; k++) { // ※
if(obj[k].type == "checkbox") {
if(obj[k].checked)varChecked++;
}
}
if(varChecked == 0) {
alert(alrtArray[i]+"は必須入力です");
return false;
}
}
}
※の箇所で、element単位--つまり一個毎のcheckboxをチェックしているループの中で、更に
それのlengthを取得しようとしています。
つまり、単数のものに複数のつもりで、個数を問うのでundefinedになるのです。
当然 for(varChecked=0, k=0; k<obj.length; k++) は回らず、常にvarChecked=0だけが設定
されるので、alert文がでます。
修正するとしたら、
// 入力項目チェック
function checkItem(form) {
var paramArray =
[ "input01", "input02", "input03", "chkbox01", "chkbox02", "chkbox03", "select01", "select02", "select03" ];
var alrtArray =
[ "入力項目1", "入力項目2","入力項目3","チェック", "チェック", "チェック", "リスト1", "リスト2", "リスト3" ];
var len = paramArray.length;
for(i=0,varChecked=0; i<len; i++) {
var obj = form.elements[paramArray[i]];
if(obj.type == "text") {
if(obj.value == "") {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
} else if(obj.type == "select-one" || obj.type == "select-multi") {
for(varSelected=0, j=0; j<obj.options.length; j++) {
if(obj.options[j].selected)varSelected+=obj.options[j].value;
}
if(varSelected == 0) {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
} else if(obj.type == "checkbox") {
if(obj.checked)varChecked++;
}
}
if(varChecked == 0) {
alert(alrtArray[4]+"は必須入力です");
return false;
}
form.submit();
}
一応、勝手にHTMLを作成して確認したので動作はすると思います。
それと、ANo.4の方の回答だと、
>}else if(obj.type == "checkbox"){
> if(obj[k].checked) varChecked++;
>}
のkが不定になってしまいます。
追記:
わたしも自前で自分の書き方でソースを起こしましたが、字数制限にひっかかるので公開は控えます。
大分、上記の書き方とは違いますが...
No.4
- 回答日時:
#1です。
初心者という特権を行使せずもうちょい努力して欲しかった・・・
function hissuCheck(form) {
var paramArray = Array("…24個");
var alrtArray = Array("…24個");
var len = paramArray.length;
var varChecked=0;
for(i=0; i<len; i++) {
var obj = form.elements[paramArray[i]];
if(obj.type == "text") {
if(obj.value == "") {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
}else if(obj.type == "select-one" || obj.type == "select-multi") {
for(varSelected=0, j=0; j<obj.options.length; j++) {
if(obj.options[j].selected)varSelected+=obj.options[j].value;
}
if(varSelected == 0) {
alert(alrtArray[i]+"は必須入力です");
form.elements[paramArray[i]].focus();
return false;
}
}else if(obj.type == "checkbox"){
if(obj[k].checked) varChecked++;
}
}
if(varChecked == 0) {
alert(alrtArray[i]+"は必須入力です");
return false;
}
return true;
}
かっこの数には自信がありませんが
iの中のforではcheckが1回でもチェックされるのをカウントして
そのループがおわってからcheckが1回もされていなければ
入力必須をアラーとするという考えです。
(って、#1書いたまんまなんですけど・・・)
No.3
- 回答日時:
とりあえずソースコードを読んでみましたが、
HTMLや一部必要なコードが省略されているため、全部を確認することが出来ませんが、
> var obj = form.elements[paramArray[i]];
> if(obj.type == "text") {
> (略)
> } else if(obj.type == "select-one" || obj.type == "select-multi") > {
> (略)
> } else {
のあと、
> for(varChecked=0, k=0; k<obj.length; k++) {
> if(obj[k].type == "checkbox") {
> if(obj[k].checked)varChecked++;
> }
> }
の部分ですが、obj(=form.elements[paramArray[i]])は何が入ってるのでしょうか?
(checkboxでなければ obj[k].checked が真になることはありません)
alert(k+':'+obj[k].name + ':'+obj[k].value);
などとしてループが何回回っているかとか、objの内容を見てみて下さい。
この仕様だったらelseの中で改めてcheckboxだけループするのではなく、
textやselect-one|select-multiと同じレベルでチェックした方が良いと思いますが。。。
ご回答ありがとうございます。
> } else {
> for(varChecked=0, k=0; k<obj.length; k++) {
> if(obj[k].type == "checkbox") {
> if(obj[k].checked)varChecked++;
> }
> }
の箇所ですが、elseの後に alert(obj.type) とやると"checkbox"というアラートが表示されました。
ですがfor文の中にこれを入れると見事にスルーされて
if(varChecked == 0) {
alert(alrtArray[i]+"は必須入力です");
return false;
}
のところまで飛びました…ループ内のことは全く無視されてるようです。又、elseの後にalert(obj.length)と入れると[undefined]と表示されました。for文の条件分内のobj.lengthはだめなのでしょうか?checkboxの数を数えるために何かいいプロパティがあればいいのですが…obj.valueは適切な名前が表示されましたが、for分内の条件文がスルーされてるのでobj[k].value等は確認できませんでした。
No.2
- 回答日時:
通常<form>~</form>には、
<input>タグとしてBUTTON | CHECKBOX | FILE | HIDDEN | IMAGE | PASSWORD | RADIO | RESET | SUBMIT | TEXT
が記述できます。
また、提示されたソースでは、<input>タグのtype=text、<select>タグのselect-multiple/select-one 、その他の
3種類をチェックしています。
ところで、<form>タグですから<input type=submit>が必須のはずです。
これはオブジェクト的にはform.elementsの最後の方にくるでしょう。
つまり、
for(i=0; i<len; i++) { // ループA
var obj = form.elements[paramArray[i]];
:
} else {
for(varChecked=0, k=0; k<obj.length; k++) { // ループB
if(obj[k].type == "checkbox") {
if(obj[k].checked)varChecked++;
}
}
if(varChecked == 0) { // チェックC
alert(alrtArray[i]+"は必須入力です");
return false;
}
}
}
において、<input type=submit>がelse節に入る。しかもそのelse節はcheckboxを前提としているので、
checkboxのchecked以外はチェック(カウント)しない。
即ち、<input type=submit>が、varChecked=0としたまま、ループBを抜けるので、チェックCに必ず
ひっかかるということではないでしょうか?
必須チェックであれば、入力、選択のあるものだけを厳密に対象として、typeで振り分け、それぞれの
チェック方法を採ればいいと思われます。
入力、選択のないものが必須チェックの中に紛れ込まないようにする必要があります。
丁寧な回答ありがとうございます。
せっかく説明していただいたのに申し訳ないのですが、
何度も見直したのですがどこが悪いのかよくわかりません…
考え方の根本が間違っているのでしょうか…
dennou2000さんならどういう書き方をしますか?
質問が重複してしまってすいませんが宜しくお願いします。
No.1
- 回答日時:
文字数制限のためでしょうけど、中途半端なソースなので
テストができず明確なエラー状況がわかりかねますが、
フローでみるかぎりcheckboxをforでまわしている箇所がいけないと
思います。
checkbox自体は長さをもたないですから。
あくまでもひとつずつ評価していく必要がありそうですね。
iでまわしているforの中ではvarCheckedをインクリメントするだけで
そのループの外側でvarChecked == 0をチェックするのが妥当かと
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
slickのレスポンシブ > center...
-
return trueとreturn falseの用...
-
Javascriptの"return "について
-
COBOLの数字チェック
-
至急!GetElementById でtdの...
-
クリックされた罫表セルの行番...
-
フォームの値が0だったら空白...
-
自動的に連番生成したURLにリン...
-
ドロップダウンリストの値の足...
-
XMLHttpRequestを利用してPHPへ...
-
チェックボックスにチェックが...
-
FormのonsubmitでJavaスクリプ...
-
フィールドを有効(enabled?)に...
-
objectのindex値って取れますか?
-
プルダウン4つ連動+α
-
CSVファイルを読みこみ、プルダ...
-
VBScriptでHTMLのセレクトボッ...
-
フォームの指定
-
プルダウン 項目が多いので先頭...
-
初心者です。一つのformで2つの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
return trueとreturn falseの用...
-
slickのレスポンシブ > center...
-
COBOLの数字チェック
-
コピペを禁止するtextarea
-
JavaScriptde途中で、「exit」...
-
未入力のラジオボタンに、alert...
-
ラジオボタンのNullチェック
-
テキストボックスに数字しか入...
-
数式から不要なカッコを取り除...
-
半角英数字のみの入力にエラー...
-
フォームの入力チェックをする...
-
変数の値によってsubmit後の動...
-
ツリービューのチェックボック...
-
ドロップダウンリストボックス...
-
ドラッグ&ドロップ禁止について
-
テキストボックスをEnterキーで...
-
入力された日付の正規表現の仕...
-
Visual Studioのデザインでの非...
-
正規表現で複数マッチ条件で悩...
-
度胸試しのJavaScript
おすすめ情報