function incheckの中に、5つほどifを重ねてみました。条件に合わないとアラーとをだします。選択はラジオボタンで行っています。
条件に合わないと各々それに応じたアラートがでるところまではなんとか出来ましたが、
2回目に選択しなおして、かつそれが再度すべての条件にあっていないにもかかわらず、OKとされてしまいます。
一度ひとつのif条件にあったことをしてしまうと、そのif条件は2度目からチェックしてくれません。
どうすれば、つどつど全部のif条件をチェックしてくれるでしょうか?
尚、こちらにタグを貼ろうとしたら、質問の欄は文字制限があるようで、ちょっとオーバーしてしまいました。
どなたかが回答してくださったら、すぐに補足欄にはらさせていただきます。
あいまいな質問で申し訳ないのですが、どなたかよろしくご指導願います。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ひとつづつ必ず選んで、順位付けをするようにするのでしょうか。


それで、一度りんごを1位にして、みかんを1位に選びなおすとりんごの未チェックが判定できない。ということでしょうか。
これは、チェックが外れたときにfalseにならないせいですね。
それだと、このようにしてはいかがですか。
----
<p>りんご
<input type="radio" name="R1" value="りんご" onclick="f11=true,f12=false,f13=false">
<input type="radio" name="R2" value="りんご" onclick="f21=true,f22=false,f23=false">
<input type="radio" name="R3" value="りんご" onclick="f31=true,f32=false,f33=false"></p>
<p>みかん
<input type="radio" name="R1" value="みかん" onclick="f11=false,f12=true,f13=false">
<input type="radio" name="R2" value="みかん" onclick="f21=false,f22=true,f23=false">
<input type="radio" name="R3" value="みかん" onclick="f31=false,f32=true,f33=false"> </p>
<p>いちご
<input type="radio" name="R1" value="いちご" onclick="f11=false,f12=false,f13=true">
<input type="radio" name="R2" value="いちご" onclick="f21=false,f22=false,f23=true">
<input type="radio" name="R3" value="いちご" onclick="f31=false,f32=false,f33=true"> </p>
---
他のラジオボタンが押されたときに、その他のフラグ情報をfalseにします。
もっとスマートな方法があるかもしれませんが、とりあえずお試しください。

この回答への補足

>ひとつづつ必ず選んで、順位付けをするようにするのでしょうか。
>それで、一度りんごを1位にして、みかんを1位に選びなおすとりんごの未チェック>が判定できない。ということでしょうか。
そうです。まさにそうです。

>これは、チェックが外れたときにfalseにならないせいですね。
そうか!そうすればいいのかー。

>それだと、このようにしてはいかがですか。
はい、さっそくやってみたいのですが、退社時間がきてしまいました。
自宅に帰ってから、再度挑戦いたします。
ひょっとしたらお礼が月曜になってしまうかもしれませんが、
申し訳ないのですが、少々お待ちくださいませ。

本当にありがとうございました。やってみまーす!

補足日時:2002/02/01 19:56
    • good
    • 0
この回答へのお礼

でけました。ありがとうございました。
とてもわかりやすかったです。
遅い時間にすばやく対応頂きまして助かりました。
ありがとうございました。

お礼日時:2002/02/04 11:07

チェックが外れた時に、変数をfalseにしてないのが原因、というのは madman さんの回答の通りですね。



ラジオボタン1個ごとに変数を作って真偽値で判断されてますが、1位は今何で、2位は何で、ということを管理した方が、プログラムがすっきりしますよ。
以下、参考程度に

# スクリプト部
<SCRIPT><!--
f1 = f2 = f3 = 0;
RINGO = 1;
MIKAN = 2;
ITIGO = 3;

// 入力ミスの判別
function incheck() {
  var err = '';
  err += fcheck(RINGO, "りんご", err);
  err += fcheck(MIKAN, "みかん", err);
  err += fcheck(ITIGO, "いちご", err);
  if (err) {
    alert(err + "が選択されていません。");
    return false;
  }
  return true;
}
// くだものの選択チェック
function fcheck(code, name, err) {
  if (f1 != code && f2 != code && f3 != code)
    return (err ? 'と' : '') + name;
  return '';
}
//--></SCRIPT>

# BODY部
<P>
 りんご
 <INPUT type="radio" name="R1" value="りんご" onclick="f1=RINGO">
 <INPUT type="radio" name="R2" value="りんご" onclick="f2=RINGO">
 <INPUT type="radio" name="R3" value="りんご" onclick="f3=RINGO">
</P>
<P>
 みかん
 <INPUT type="radio" name="R1" value="みかん" onclick="f1=MIKAN">
 <INPUT type="radio" name="R2" value="みかん" onclick="f2=MIKAN">
 <INPUT type="radio" name="R3" value="みかん" onclick="f3=MIKAN">
</P>
<P>
 いちご
 <INPUT type="radio" name="R1" value="いちご" onclick="f1=ITIGO">
 <INPUT type="radio" name="R2" value="いちご" onclick="f2=ITIGO">
 <INPUT type="radio" name="R3" value="いちご" onclick="f3=ITIGO">
</P>

ちなみに、送信ボタンの onClick での入力チェックは不要です。
送信ボタンを押しても、FORM の onSubmit が動いて、チェックをしてくれます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
せっかく私にあったJavaさんを書いていただいたのですが、
まだJavaを始めて1週間の私にはちょっと難しかったです。
今回はmadmanさんの方を参考にさせていただきますが、
今後の課題としてleazさんのがわかるようになりたいです。
ありがとうございました

お礼日時:2002/02/04 11:20

回答できるかわかりませんが、とりあえずソースを見せてください。

この回答への補足

<script language="JavaScript">
<!--
f11=false;
f21=false;
f31=false;
f12=false;
f22=false;
f32=false;
f13=false;
f23=false;
f33=false;

//入力ミスの判別
function incheck() {
if (f11==false && f21==false && f31==false){
window.alert("りんごが選ばれていません");
return false;}
   if (f12==false && f22==false && f32==false){
window.alert("みかんが選ばれていません");
return false;}
if (f13==false && f23==false && f33==false){
window.alert("いちごが選ばれていません");
return false;}
}
//--->
</script>

<form action="http://www.altoworld.com/form2/post.cgi"
method="POST" onsubmit="return incheck();">
<p>りんご<input type="radio" name="R1" value="りんご"
onclick="f11=true"> <input type="radio" name="R2"
value="りんご" onclick="f21=true"> <input type="radio"
name="R3" value="りんご" onclick="f31=true"></p>
<p>みかん<input type="radio" name="R1" value="みかん"
onclick="f12=true"> <input type="radio" name="R2"
value="みかん" onclick="f22=true"> <input type="radio"
name="R3" value="みかん" onclick="f32=true"></p>
<p>いちご<input type="radio" name="R1" value="いちご"
onclick="f13=true"> <input type="radio" name="R2"
value="いちご" onclick="f23=true"> <input type="radio"
name="R3" value="いちご" onclick="f33=true"></p>
<p>左から順に1位・2位・3位と考えてください。</p>
<p><input type="submit" name="B1" value="送信"
 onclick="return incheck()"> </p>
</form>

こんなのです。よろしくおねがいします。。。。(ちゃんと動くかな???)

補足日時:2002/02/01 19:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q複数の入力欄についての入力チェック

JAVAScriptを勉強し始めたものです。
よろしくお願いします。

1つのページに複数のフォームと入力欄があります。

それぞれの入力欄は数字を入力することになっていて、その数字が1~90の間にあるかどうかをチェックしたいと考えています。

下記のようなページを見ると、一つ一つの入力欄について、IF文でチェックしているのですが、一括してチェックするようなことは可能ですか?

http://www.tagindex.com/javascript/form/check1.html


-----------------------------------------
【以下に、やりたいことの例を示します】


<script type="text/javascript">
<!--
function matchNum() {
n=eval(document.myFORM1.myTEXT1.value); // ←この行の「myFORM1」と「myTEXT1」をすべてを網羅するように書き換えられないか?
if ( n < 1 || n > 90 ) {
alert("入力できるのは、1~90の値です。");
}
}
// -->
</script>


<FORM METHOD="GET" name="myFORM1">
<INPUT TYPE="text" NAME="myTEXT1" onblur="matchNum()">
<INPUT TYPE="text" NAME="myTEXT2" onblur="matchNum()">
<INPUT TYPE="text" NAME="myTEXT3" onblur="matchNum()">
</FORM>
<br>
<FORM METHOD="GET" name="myFORM2">
<INPUT TYPE="text" NAME="yourTEXT1" onblur="matchNum()">
<INPUT TYPE="text" NAME="yourTEXT2" onblur="matchNum()">
<INPUT TYPE="text" NAME="yourTEXT3" onblur="matchNum()">
</FORM>
<br>
<FORM METHOD="GET" name="myFORM3">
<INPUT TYPE="text" NAME="hisTEXT1" onblur="matchNum()">
<INPUT TYPE="text" NAME="hisTEXT2" onblur="matchNum()">
<INPUT TYPE="text" NAME="hisTEXT3" onblur="matchNum()">
</FORM>
<br>
<FORM METHOD="GET" name="myFORM4">
<INPUT TYPE="text" NAME="herTEXT1" onblur="matchNum()">
<INPUT TYPE="text" NAME="herTEXT2" onblur="matchNum()">
<INPUT TYPE="text" NAME="herTEXT3" onblur="matchNum()">
</FORM>

JAVAScriptを勉強し始めたものです。
よろしくお願いします。

1つのページに複数のフォームと入力欄があります。

それぞれの入力欄は数字を入力することになっていて、その数字が1~90の間にあるかどうかをチェックしたいと考えています。

下記のようなページを見ると、一つ一つの入力欄について、IF文でチェックしているのですが、一括してチェックするようなことは可能ですか?

http://www.tagindex.com/javascript/form/check1.html


-------------------------------...続きを読む

Aベストアンサー

まとめてやる方法もあるけど、今のHTMLとスクリプトそのまま使うなら

HTMLの方の matchNum() を全部、matchNum(this) として、

function matchNum() を function matchNum(objNum) とでもして、

n = eval(document.myFORM1.myTEXT1.value) を n = eval(objNum.value)

にしたら、どう?

Qアラーと表示がうまくいきません

<SCRIPT LANGUAGE="JavaScript">
<!--
function aaa(){
if(document.a.ADD01.selectedIndex==0){
alert("カテゴリを選んで下さい。");document.a.ADD01.focus();return false;

}else if(document.a.EMAIL.value=="" &&document.a.TEL.value==""){
alert("メールアドレスか電話番を入力して下さい。");
document.a.EMAIL.focus();
return false;
}else{
return true;}
}
// -->
</SCRIPT>

上記の「メールアドレスか電話番号を入力して下さい。」のアラートを「メールアドレスを入力して下さい。」に変えたいのですが(document.a.EMAIL.value=="" && document.a.TEL.value=="")のどの部分までを消していいのか分かりません。

<SCRIPT LANGUAGE="JavaScript">
<!--
function aaa(){
if(document.a.ADD01.selectedIndex==0){
alert("カテゴリを選んで下さい。");document.a.ADD01.focus();return false;

}else if(document.a.EMAIL.value=="" &&document.a.TEL.value==""){
alert("メールアドレスか電話番を入力して下さい。");
document.a.EMAIL.focus();
return false;
}else{
return true;}
}
// -->
</SCRIPT>

上記の「メールアドレスか電話番号を入力して下さい。」のアラートを「メールアドレスを入力して下さい。...続きを読む

Aベストアンサー

アラートのメッセージ内容だけを変えたいのではなく、電話番号入力欄の入力は必須でない
 
 と解釈して回答します。
 
document.a.EMAIL.value=="" &&document.a.TEL.value==""

は「aというフォームのEMAILという(おそらく)テキストボックスの中身が空白で、かつ、aというフォームのTELというテキストボックスが空白の場合」という条件を表します。

○○=="" で○○が空白の場合、
A && B で AかつB
を表しますので、

document.a.EMAIL.value=="" と書き直せばいいのではないでしょうか。

Qネストされたチェックボックスの子孫要素にチェックを入れると、親要素にもチェックされる

<ul>
<li><input type="checkbox" name="A" value="">親A
<ul>
<li><input type="checkbox" name="B" value="" class="second">子A
<ul><li><input type="checkbox" name="C" value="" class="second">孫A</li>
</li>
</ul>
</li>
</ul>
<ul>
<li><input type="checkbox" name="A" value="">親B
<ul>
<li><input type="checkbox" name="B" value="" class="second">子B
<ul><li><input type="checkbox" name="C" value="" class="second">孫C</li>
</li>
</ul>
</li>
</ul>



3 階層あり、親、子や孫にチェックを入れた時に、その全てに連動してチェックされる方法は
ありますでしょうか ?
親だけチェックして子や孫もチェックされるのはできるのですが、逆ができません。
ちなみに同じつくりのものが下に続くのですが、A と B は連動せず、
ID NAMEも同じものです。

どうぞ、わかる方お願いいたします。

<ul>
<li><input type="checkbox" name="A" value="">親A
<ul>
<li><input type="checkbox" name="B" value="" class="second">子A
<ul><li><input type="checkbox" name="C" value="" class="second">孫A</li>
</li>
</ul>
</li>
</ul>
<ul>
<li><input type="checkbox" name="A" value="">親B
<ul>
<li><input type="checkbox" name="B" value="" class="second">子B
<ul><li><input type="checkbox" name="C" value="" class="second">孫C</li>
</li>
</ul>
</li>
</ul>



3 階層あり、...続きを読む

Aベストアンサー

構造さえ確定できればできないことはないと思いますが
親をチェックして、子孫にチェックがはいる仕組みなら
孫や子をチェックすると親や子にチェックがはいるとなると
常にすべて同じチェック状態になっちゃいますけどそれって意味あります?

つまり、
親をチェック→子・孫にチェックがはいる
子をチェック→親・孫にチェックがはいる
孫をチェック→親・子にチェックがはいる

つまりどこか一つのチェックで十分では?

Qifの条件式 !について

以下処理があります。

1.宣言、初期化
var A = new Array();
A[1] = A[2] = A[3] = false;

2.条件判断
if(!A[1] && !A[2] && !A[3]){
A[1] = $A[2] = A[3] = true;

}else{ 処理 }
}


質問:宣言⇒ifに処理が流れた時、条件式の内容は
・A[1]の否定⇒A1は、falseが格納されているので、否定でtrue。
・A[2]の否定⇒A1は、falseが格納されているので、否定でtrue。
・A[3]の否定⇒A1は、falseが格納されているので、否定でtrue。

よって、
if(true && true && true){
A[1] = $A[2] = A[3] = true;
}

で結果、配列の1~3は、全てfalseから、trueに変更されるという考えで間違っていないでしょうか?
よろしくお願いします。

Aベストアンサー

今回のロジックでおおむね問題ありませんが
ブラウザによってはfalseと0を同意とする場合とそうでない場合があります
もし厳密に比べたいなら!で安易に評価しないことです

>if(!A[1] && !A[2] && !A[3]){

if(A[1]===false && A[2]===false && A[3]===false){

Q条件分岐(IF文)の簡素化

javascript初心者です。

下記のように7つの変数を利用した組み合わせで、表示内容を変えるjavascriptを組んでいます。
IF文で組んでみたところ、下記のように18通りのIF文になってしまいました。
このjavascriptについては、変数を変えて1ページに10ケ所に配置するため、クライアントマシンは、180通りのIF文計算をすることになるため、簡素化したいと考えています。

switch文だと条件分岐を簡素化出来そうですが、例文では、変数がひとつの場合の例しか載っておらず、複数の場合の記載例がありませんでした。

もっと効率的な方法があると思うため、IF文に限らず良い方法をご指導頂きたくお願いする次第です。

宜しくお願い致します。

var a1
var a2
var a3
var a4
var a5
var a6
var a7


if (a1=="") {
document.write("1の作業"); }
else if (a2<a3*50) {
document.write("2の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6>=300) && a7="") ) {
document.write("2の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6<299) && a7="") ) {
document.write("3の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6>=300) && a7="") ) {
document.write("4の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6<299) && a7="") ) {
document.write("5の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6>=300) && a7="") ) {
document.write("6の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6<299) && a7="") ) {
document.write("7の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6>=300) && a7="") ) {
document.write("8の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6<299) && a7="") ) {
document.write("9の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6>=300) && a7="1") ) {
document.write("10の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6<299) && a7="1") ) {
document.write("11の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6>=300) && a7="1") ) {
document.write("12の作業"); }
else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6<299) && a7="1") ) {
document.write("13の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6>=300) && a7="1") ) {
document.write("14の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6<299) && a7="1") ) {
document.write("15の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6>=300) && a7="1") ) {
document.write("16の作業"); }
else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6<299) && a7="1") ) {
document.write("17の作業"); }
else {
document.write("18の作業"); }

javascript初心者です。

下記のように7つの変数を利用した組み合わせで、表示内容を変えるjavascriptを組んでいます。
IF文で組んでみたところ、下記のように18通りのIF文になってしまいました。
このjavascriptについては、変数を変えて1ページに10ケ所に配置するため、クライアントマシンは、180通りのIF文計算をすることになるため、簡素化したいと考えています。

switch文だと条件分岐を簡素化出来そうですが、例文では、変数がひとつの場合の例しか載っておらず、複数の場合の記載例がありませんでした。

...続きを読む

Aベストアンサー

現代のコンピュータは十分に高速ですので,数十人以上が同時実行するような負荷が高めのコードでないかぎり,些末な速度差にこだわってマニアックなコードを書くよりも,他の人にもロジックが分かりやすく保守しやすいコードを書くのがプログラミングの基本です。

質問者ご自身は,質問文に載せたコードに満足していらっしゃらないようですけれど,私の感想としては,冗長ではあるものの「どの条件のときに何をするか」が分かりやすくコード化されているので,回答No.2のコードよりも質問文のコードの方を好ましく思っています。

> 画像の決定表3列目に「90%がここ」と記載していますが、
> ELSE文の早い位置に(3番目など)持ってくることにより、
> ブレイクが早まり、結果 軽くなるものと思っています。

というのも,現代のプログラミングからすると発想が違うでしょう。
早いうちに分岐させてしまうコードの方が「ロジックの見通しがよくなる」からそうするのであり,些末な速度差にはこだわらなくてよいはずです。

--------
以下,回答No.2の補足で提示していただいた決定表を踏まえてサンブルコードにしてみました。
ただしこのコードは,決定表が参照資料としてすぐそばに添えられていてようやく成立するコードだと思います。決定表が添付されていないのであれば,元の質問文に載せられていたコードの方が私は好みです。

if (aa1 == true) {
作業1; }
else if (aa2 == true) {
作業2; }
else if (aa3 == true && aa4 == true) {
作業3; }
else if (aa3 == true && aa4 == false) {
if (aa5 == true) {
作業3; }
else {
if (aa7 == true) {
作業5; }
else {
作業8; }
}
}
else if (aa3 == false && aa4 == true) {
if (aa6 == true) {
作業4; }
else {
作業7; }
}
else if (aa3 == false && aa4 == false) { //★
if (aa5 == true) {
if (aa6 == true) {
作業4; }
else {
作業7; }
}
else {
if (aa8 == true) {
作業6; }
else {
作業9; }
}
}

なお,上記コード中の //★ の箇所の行は,単に else { でもよいのですが,
aa3 と aa4 の真偽の組合せ4パターンをすべてチェックしている,と明示する方が明らかに分かりやすいと判断したため,上記のようにコーディングしました。

現代のコンピュータは十分に高速ですので,数十人以上が同時実行するような負荷が高めのコードでないかぎり,些末な速度差にこだわってマニアックなコードを書くよりも,他の人にもロジックが分かりやすく保守しやすいコードを書くのがプログラミングの基本です。

質問者ご自身は,質問文に載せたコードに満足していらっしゃらないようですけれど,私の感想としては,冗長ではあるものの「どの条件のときに何をするか」が分かりやすくコード化されているので,回答No.2のコードよりも質問文のコードの方を好まし...続きを読む


人気Q&Aランキング

おすすめ情報