この文あってますか?

[上に] [前に] [次に]
ばーばぱぱ 1999/06/03(木) 16:04:01
ボタンを押したとき、テーブルの行の背景色が黄色なら、
白にして他のテキストにフォーカスをセットし、
それ以外は、一番上の行の背景色を黄色にする処理を
作成したのですが、それ以外の場合がうまくいきません。
スクリプトを載せますので、おかしなところがあれば教えてください。

<script language="javascript">
<!--
function idou(){

for(i=0;i<parent.No2.document.all.length;i++){
if((parent.No2.document.all[i].tagName=='TD')&&(parent.No2.document.all[i].parentElement.style.backgroundColor=='yellow')){
parent.No2.document.all[i].parentElement.style.backgroundColor='white';

parent.No1.document.FORM1.RNen.focus();
}

else{
if((parent.No2.document.all[0].tagName=='TD')&&(parent.No2.document.all[0].className=='sentaku')){
parent.No2.document.all[0].parentElement.style.backgroundColor='yellow';
}
}
}
}
// -->
</script>

よろしくお願いします。

Tmb 1999/06/03(木) 16:38:20
全体像が見えないので,何ともいいがたいのですが,おそらくは
else以下のdocument.allの引数が[0]になってることがいちばん
の原因でしょう。これは[i]の間違いでは?

それが単なるミスタイプであれば,同じくelse以下の条件の
.className=='sentaku'の意味が気になります。

どういうときにこれが成り立つようプログラミングしてるかは
判りませんが,やりたいことから推測すると,この条件が両方の
if文に必要か,両方ともに不要のどちらかではないですか?

ばーばぱぱ 1999/06/03(木) 16:56:06
else以下のdocument.allの引数が[0]
これは一番上の行にしたいからこのように書いたのですが・・・
やっぱり駄目ですか。

className=='sentaku'はテーブルがいくつもあるので
クラスをつけてそのテーブルのみ対応するようにしています。

className=='sentaku'を消してやっても駄目ですし、
引数を[i]にしても駄目なので困っていたのです。
改めてアドバイスお願いします。

Tmb 1999/06/03(木) 18:36:02
if文の条件式の中がdocument.all[0]だから,ループの回数だけまったく同じ処理(常に[0]でチェック)してますよね?
こういう処理が出てくるのは,明らかに違和感を感じるもので指摘しましたが。
#やるなら,条件式の中は[i]でチェックします。条件を満たした
#ときに'yellow'にするelementの引数は0でもかまいませんが。

ただ,
parent.No2.document.all[0].parentElement.style.backgroundColor='yellow';
だけを実行したときに本当に「一番上の行の背景色を黄色にする処理」が
出来ていますか?
これだと常に,document.all[0].parentElementに当たるものが変わるだけでは?
もしclassNameが'sentaku'のTABLEを対象にするのなら引数は0ではない可能性もあるかと。

あと考え方としてもちょっと変なことをしているような・・・。
要はforループですべてのオブジェクトをチェックして,背景色が黄色のTDが
あれば白になおしてフォーカスを移動し,「背景色が黄色のTDが一つもなけれ
ば」どっか(いちばん上ですか?)の背景色を黄色に変えたい,ということ
なのですよね?

だったら「背景色が黄色のTDが一つもない」ことは,全部のオブジェクトをチェックした
後でしか判らないわけで。こういう場合は「フラグを立てる」,for文の前に例えば
hogehoge = false;
なんて変数を作っておき,forループ内で1つ目のif文の条件を満たしたら,hogehogeを
trueにしてやり(2つ目のif文はいらない),ループを出た後にこのhogehogeがfalse
なら「背景が黄色のTDは一つもなかった」というわけで,それなりの処理をしてやる,
という感じのアルゴリズムにすればよいかと。

#ソースを示せば早いんだろうけど,手元の環境はMac+NN3ですし確認ができない。
#それにそれでは,いつまでたっても学習できないかもしれませんから。

ばーばぱぱ 1999/06/04(金) 12:40:10
背景色を変えることはできたが、
全行黄色に変わってしまう。
1行だけ色を変えることができない。
なにか良い方法ありませんか?

flag=false;
for(i=0;i<parent.No2.document.all.length;i++){
if((parent.No2.document.all[i].tagName=='TD')&&(parent.No2.document.all[i].parentElement.style.backgroundColor=='yellow')){
parent.No2.document.all[i].parentElement.style.backgroundColor='white';

parent.No1.document.FORM1.RNen.focus();
flag=true;
}
}
if(flag==false){
for(i=0;i<parent.No2.document.all.length;i++){
if((parent.No2.document.all[i].tagName=='TD')&&(parent.No2.document.all[i].className=='sentaku')){
parent.No2.document.all[i].parentElement.style.backgroundColor='yellow';
}
}
}
}

Tmb 1999/06/04(金) 13:32:02
2回目のループでは,'sakusei'の'TD'ならすべてifの条件を満たしますよね?
色を変えたいのが最初の行だけなのですから,そのための条件が必要でしょう。
ここでもフラグを立てておくのが有効です。

考え方としては前回同様にflag2=falseというのを2回目のループ前において,
ループ内の条件式に「flag2=falseなら」という条件を追加し,条件を満たせば
flag2=trueにする,というやり方で「一応動作する」ようにはなるでしょう。

けど,このやり方だと同じ範囲をカバーするループを2回も行うわけで,きれいな
プログラムとはいえないと思います。
そこでフラグの応用として,1つ目のループの中で「sentakuの最初の行の引数」
も得るようにしてみてはどうでしょう。
1つ目のループのflag=falseの次にflag_2=-1というのを付け,
ループの中に「'sentaku'かつ'TD'かつflag_2=-1のとき,flag_2=iにする」
というif文を追加。
ループの外ではflag=falseならall[flag_2]を書き換えるようにするわけです。
flag_2を最初-1にしてるのは,検出されても出てこないような数値にしてる
だけです。

ただ,まぁもとから'sentaku'の最初の行の引数が完全に固定されてるなら,何も
それを検出するためのルーチンは不要なのです。

#個人的にはもっと全体を見通したプログラミングをする方がいいと思う・・・。
#こういった値はどうせ他のルーチンでも使い回すのでしょうし,グローバルな変数に
#しておく方が。

ばーばぱぱ 1999/06/04(金) 14:12:30
[[解決]]
Tmbさん、ありがとうございました。
無事解決できました。
また困ったことがあったら助けてください。
よろしくお願いします。

[上に] [前に] [次に]