WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:エラーを消すには

0:[投稿] ルンメニゲ [2005/07/26 11:16 ][環境:IE6,WINXP Linux,Apache,CGI,perl ]

次のHTML(スクリプト部分)でエラーになってしまいます。
(エラー:'length'はNullまたはオブジェクトではありません)
どうすればエラーを消せるか。どなたか、ご教授ください。お願いします。

<HTML>
<HEAD>
<TITLE>テスト</TITLE>
<SCRIPT TYPE="text/javascript">
<!--
function sub1() {
  if (document.form.omise.selectedIndex == 0 && document.form.syurui.selectedIndex == 0) {
      window.alert("お店と種類を選択");
      return false;
  } else if (document.form.omise.selectedIndex == 0) {
      window.alert("お店を選択");
      return false;
  } else if (document.form.syurui.selectedIndex == 0) {
      window.alert("種類を選択");
      return false;
  } else if (document.form.guramu.selectedIndex == 0) {
      window.alert("グラムを選択");
      return false;
  } else {
      return true;
  }
}

function main(a) {
  if (document.form.omise.selectedIndex == 0) {
      document.form.syurui.length = 1;
      document.form.syurui.selectedIndex = 0;
      document.form.basyo.length = 1;
      document.form.basyo.selectedIndex = 0;
      document.form.guramu.selectedIndex = 0;
  } else {
      if (a) {
          document.form.syurui.length = 1;
          document.form.syurui.selectedIndex = 0;
           document.form.basyo.length = 1;
          document.form.basyo.selectedIndex = 0;
          document.form.guramu.selectedIndex = 0;
      }
      var syurui = syuruis[document.form.omise.options[document.form.omise.selectedIndex].value];
      var n_syurui = n_syuruis[document.form.omise.options[document.form.omise.selectedIndex].value];
      document.form.syurui.length = syurui.length + 1;
      for (var i = 0; i < syurui.length; i++) {
          document.form.syurui.options[i+1].value = n_syurui[i];
          document.form.syurui.options[i+1].text = syurui[i];
      }
      var basyo = basyos[document.form.syurui.options[document.form.syurui.selectedIndex].value];
      var n_basyo = n_basyos[document.form.syurui.options[document.form.syurui.selectedIndex].value];
      document.form.basyo.length = n_basyo.length + 1; ←ここでエラー表示します
      for (var i = 0; i < n_basyo.length; i++) {
          document.form.basyo.options[i+1].value = n_basyo[i];
          document.form.basyo.options[i+1].text = basyo[i];
      }
  }
}
function sub2(a) {
  if (document.form.syurui.selectedIndex == 0) {
      document.form.basyo.length = 1;
      document.form.basyo.selectedIndex = 0;
  } else {
      if (a) {
          document.form.basyo.length = 1;
          document.form.basyo.selectedIndex = 0;
      }
      var basyo = basyos[document.form.syurui.options[document.form.syurui.selectedIndex].value];
      var n_basyo = n_basyos[document.form.syurui.options[document.form.syurui.selectedIndex].value];
      document.form.basyo.length = basyo.length + 1;
      for (var i = 0; i < basyo.length; i++) {
          document.form.basyo.options[i+1].value = n_basyo[i];
          document.form.basyo.options[i+1].text = basyo[i];
      }
  }
}

var omises = new Array("A店","B店");
var syuruis = new Array();
            syuruis[1] = new Array("牛肉","豚肉","鶏肉");
            syuruis[2] = new Array("マグロ","カツオ");
var n_syuruis = new Array();
            n_syuruis[1] = new Array("1","2","3");
            n_syuruis[2] = new Array("4","5");
var basyos = new Array();
            basyos[1] = new Array("ヒレ","サーロイン");
            basyos[2] = new Array("バラ","ロース");
            basyos[3] = new Array("ムネ","モモ");
            basyos[4] = new Array("大トロ","中トロ");
            basyos[5] = new Array("タタキ","アカミ");
var n_basyos = new Array();
            n_basyos[1] = new Array("1","2");
            n_basyos[2] = new Array("3","4");
            n_basyos[3] = new Array("5","6");
            n_basyos[4] = new Array("7","8");
            n_basyos[5] = new Array("9","10");
var guramus = new Array("100","200","300");
// -->
</SCRIPT>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;">
</HEAD>
<BODY onLoad="main(false)" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<FORM NAME=form METHOD=POST ACTION="/xxx/yyy/zzz.cgi" onSubmit="return sub1()">
<TABLE BORDER="0">
<TR><TD><font size="2">お店</font></TD><TD><font size="2">種類</font></TD><TD><font size="2">場所</font></TD><TD>グラム</TD></TR>
<TR><TD>
    
<SELECT NAME="omise"  onChange="main(true)">
      <OPTION VALUE="" SELECTED>(お店を選択) </OPTION>
      <OPTION VALUE="1">A店</OPTION>
      <OPTION VALUE="2">B店</OPTION>
     
</SELECT>
</TD><TD>
<SELECT NAME="syurui" onChange="sub2(true)">
<OPTION VALUE="" SELECTED>(種類を選択)
<OPTION VALUE="">
<OPTION VALUE="">
</SELECT>
</TD><TD>
<SELECT NAME="basyo">
<OPTION VALUE="" SELECTED>(場所を選択)
<OPTION VALUE="">
<OPTION VALUE="">
</SELECT>
</TD><TD>
<SELECT NAME="guramu">
      <OPTION VALUE="" SELECTED>(グラムを選択) </OPTION>
      <OPTION VALUE="1">100</OPTION>
      <OPTION VALUE="2">200</OPTION>
      <OPTION VALUE="3">300</OPTION>
</SELECT>
</TD><TD>
<INPUT TYPE=submit VALUE="調べる">
</TD></TR>
</FORM>
</TABLE>
</BODY>
</HTML>


1:[回答] 神崎 [2005/07/26 19:58 ]

種類と場所のフォームが

<SELECT NAME="syurui" onChange="sub2(true)">
<OPTION VALUE="" SELECTED>(種類を選択)
<OPTION VALUE="">
<OPTION VALUE="">
</SELECT>

こうなってるのを、

<SELECT NAME="syurui" onChange="sub2(true)">
<OPTION VALUE="" SELECTED>(種類を選択) </OPTION>
<OPTION VALUE=""> </OPTION>
<OPTION VALUE=""> </OPTION>
</SELECT>

タグを閉じてやると、とりあえず動いたようですけど、いかがでしょうか?
(WINDOWS、IE6)


2:[質問] ルンメニゲ [2005/07/26 20:13 ]

ご回答、有難うございます。
神崎さんのおっしゃるとおり動くことは動きますが、エラーを消すには、どうしたらよいですか。


3:[回答] 神崎 [2005/07/26 22:02 ]

失礼しました。
WINDOWS+Opera7で見直してチェックしてみました。
(IEのデバッガが壊れてます○| ̄|_)

エラーが出る行の上(47行)
> var n_basyo = n_basyos[document.form.syurui.options[document.form.syurui.selectedIndex].value];
この部分で、
お店を選んだ時点では、種類はまだ未選択ですから、
document.form.syurui.selectedIndex は、0が入ります。
document.form.syurui.options[0].value
が空白になり、
var n_basyo = n_basyos[];
このように変換されて、n_basyoはundefinedになります。


項目を定義するところで
syuruis[0] = new Array();
syuruis[1] = new Array("牛肉","豚肉","鶏肉");
syuruis[2] = new Array("マグロ","カツオ");
のように、それぞれの配列の0番目にも、空配列を設定しておいて、
リストの全部にvalueを入れておくと、

<SELECT NAME="omise"  onChange="main(true)">
     <OPTION VALUE="0" SELECTED>(お店を選択) </OPTION>
     <OPTION VALUE="1">A店</OPTION>
     <OPTION VALUE="2">B店</OPTION>
     
</SELECT>
</TD><TD>
<SELECT NAME="syurui" onChange="sub2(true)">
<OPTION VALUE="0" SELECTED>(種類を選択) </OPTION>
<OPTION VALUE=""> </OPTION>
<OPTION VALUE=""> </OPTION>
</SELECT>
</TD><TD>
<SELECT NAME="basyo">
<OPTION VALUE="0" SELECTED>(場所を選択) </OPTION>
<OPTION VALUE=""> </OPTION>
<OPTION VALUE=""> </OPTION>
</SELECT>

valueが空白にならずに、配列の値を正常に取得できると思います。


4:[回答] 神崎 [2005/07/26 22:04 ]

> syuruis[0] = new Array();
空配列の定義は不要かも。。。
undefinedにならないように、保険と言うことで。


5:[完了] ルンメニゲ [2005/07/27 12:04 ]

問題解決しました。
神崎さん、誠に誠に有難うございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World