フォームの入力内容をループさせてチェックするには?

[上に] [前に] [次に]
1999/09/20(月) 10:37:07
フォームの入力内容について、チェックを行うため、
Check()という関数を作り、ボタンを押したら
ループさせて呼び出すように
onClick="JavaScript:In_Click()"とし、
Javaスクリプトで、
function In_Click() {
for(i in document.Lay1.document.Frm1.elements) {
if(!Check(document.Lay1.document.Frm1.elements)) {
return false;
}
return true;
}
(Lay1はレイヤー名、Frm1はフォーム名です)
としています。しかし、
falseを返すときは正常に動いているのですが、
すべて問題なくループを抜けてtrueを返すはずの時には、
JavaScript errorが出ます。
forの中を
i=0; i<document.Lay1.document.Frm1.elements.length; i++
としても見たのですが、まったく動きませんでした。
どうしたらよいでしょうか?
OSはWindowsNT、ブラウザはNC4.51です。
よろしくお願いします。

ばかぼん 1999/09/20(月) 10:56:26
elementsは配列要素ですよね。
>i=0; i<document.Lay1.document.]
AGENT = [ Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) ]
FROM  = [ http://www.yahoo.co.jp/Computers_and_Internet/Internet/World_Wide_Web/CGI___Common_Gateway_Interface/ ]

COUNT = [ 1266964 ]
ADDR  = [ 202.33.128.141 ]
AGENT = [ Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) ]
FROM  = [ http://www.xjam.net/~bigmoro/sabobabi/link.html ]

COUNT = [ 1266965 ]
ADDR  = [ 143.90.237.56 ]
AGENT = [ Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) ]

COUNT = [ 1266966 ]
ADDR  = [ 203.141.111.174 ]
AGENT = [ Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) ]
FROM  = [ http://moyashi.system.to/kikaku/ ]

COUNT = [ 1266967 ]
ADDR  = [ 210.251.139.185 ]
AGENT = [ Mozilla/4.51 [ja_JP.EUC] (X11; I; FreeBSD 3.2-RELEASE i386; Nav) ]
FROM  = [ file:/opt/home/takeshi/html3/index.html ]

COUNT = [ 1266968 ]
ADDR  = [ 210.165.174.16 ]
AGENT = [ Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) ]
FROM  = [ http://faculty.web.waseda.ac.jp/funaki/syumi.html ]

COUNT = [ 1266969 ]
ADDR  = [ 210.147.107.112 ]
AGミスなのだとは思うけど、括弧"{}"の数が
合わないきがする。

ばかぼん 1999/09/20(月) 14:06:14
追加です。
やっぱり括弧の数が合ってないのでは?
>すべて問題なくループを抜けてtrueを返すはずの時には、
>JavaScript errorが出ます。
とか、
>ためしに for(i=0; i<5; i++) と数を固定で入れてみましたが、
>他のボタンを押したときのイベントも起こらなくなってしまいます。
の原因も説明がつくんですけど...

無責任官庁 1999/09/20(月) 15:20:45
このプログラム、よくよくみると必ずループ1回目で終了するのですが、
大丈夫なのでしょうか?(^_^;)

for(i=0; i<document.Lay1.document.Frm1.elements.length; i++) {
 if(!Check(document.Lay1.document.Frm1.elements[i])) {
  return false;
 }
 return true;
}

↑これではループせずに1回で終わりますよねぇ・・・?
(1回目で必ずどちらかのreturnに入る為)
ループの中ではチェックだけして、ループの外でreturn
しないと・・・

(例)
ret = 0;
for(i=0; i<document.Lay1.document.Frm1.elements.length; i++) {
 if(!Check(document.Lay1.document.Frm1.elements[i])) {
  ret = 1;
 }
}
if(ret == 1){
 return false;
}else{
 return true;
}

1999/09/20(月) 16:43:23
間違えまくってしまってごめんなさい。
function In_Click() {
for(i in document.Lay1.document.Frm1.elements) {
if(!Check(document.Lay1.document.Frm1.elements)) {
return false;
}
}
return true;
}
というように書いています。
alertを途中に入れて調べたところ、forの中を
>i=0; i<document.Lay1.document.Frm1.elements.length; i++
とすると、無限ループに入っているようなのです。
同じようなフォームが他にもあり、
ほぼ同じことをしているはずなのですが、
>i in document.Lay1.document.Frm1.elements
として、ループを通るごとにalert(i)とすると、
要素分の数値が表示された後、
length, name, elements, method, action, encoding, target
と順番に表示され、正常に終了できました。
なぜでしょう?

ばかぼん 1999/09/20(月) 17:35:14
>i=0; i<document.Lay1.document.Frm1.elements.length; i++
これって、Frm1というフォームのエレメント数を参照したいんですよね?
さっきも書いたんですけど、
>i=0; i<document.Lay1.document.Frm1.length; i++
じゃないのかなぁ〜。
ひょっとして、私がいままで間違って覚えていたんだろうか...
だとしたら恥ずかしい...

1999/09/20(月) 18:19:07
[[解決]]
すみません。
出来なかったのは、for文で i を使っていたからのようです。
呼び出している関数でも使っていたので、
i が正常にプラスされていかず、無限ループに陥っていたようです。
i を違う名前の変数にしたら、正常に動きました。
ちなみに、NC4.51では、
>i=0; i<document.Lay1.document.Frm1.elements.length; i++
>i=0; i<document.Lay1.document.Frm1.length; i++
どちらでも同じ動きをしました。両方とも間違いではないと思います。
本当にお騒がせしました。ありがとうございました。

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