サイトの概要は前の質問を参照して下さい。
以下のようなスクリプト、
function createChildOptions2A(frmObj)
{
// 親ジャンルを変数pObjに格納
var pObj2A=frmObj.elements["2productA"].options;
var pObj2AValue=frmObj.elements["2productA"].value;
中略
};
};
}
を
<SELECT name="productA" id="productA" onchange="createChildOptionsA(this.form);createChildOptions2A(this.form)">というタグから呼びだそうでしているのですが、
var pObj2A=frmObj.elements["2productA"].options;
の部分で、
未定義または NULL 参照のプロパティ 'options' は取得できません
となってしまいます。
createChildOptionsA(this.form)は問題なく実行できました。
変数の定義やスコープの問題だとは思うのですが、JavaScript初心者で急な用のためここで質問させていただきます。心得のある方のご回答お待ちしております。
想像ですけど、2セットの SELECT って、form が分かれてるんじゃないでしょうか?
こんなふうに。
<form> <!-- ひとつ目 --> <SELECT name="productA" id="productA" onchange="createChildOptionsA(this.form);createChildOptions2A(this.form)"> <option>...</option> </SELECT> ... </form> <form> <!-- ふたつ目 --> <SELECT name="product2A" id="product2A" onchange="createChildOptions2A(this.form)"> <option>...</option> </SELECT> ... </form>
createChildOptions2A() の引数に渡している this.form は、その SELECT が含まれている FORM なので、product2A の SELECT を選択したときには、正しく動きますけど、productA のときには product2A が含まれていない FORM が渡されるので、「見つからない」と出るのでしょう。
productA から createChildOptions2A を呼ぶときには、this.form ではなく、product2A が含まれる FORM を探して渡してあげれば良いと思います。
例えば、ふたつ目の FORM に id 属性を付けて、document.getElementById で渡してあげる、とか。
<form> <!-- ひとつ目 --> <SELECT name="productA" id="productA" onchange="...; createChildOptions2A(document.getElementById('second_form'))"> ... <form id="second_form"> <!-- ふたつ目 --> <SELECT name="product2A" id="product2A" onchange="createChildOptions2A(this.form)">
肝心の部分が見切れちゃうので、色々と省略してますが、createChildOptions2A() の引数に着目してください。
onchange="...; createChildOptions2A(document.getElementById('second_form'))"
<form id="second_form" ...>
# 想像が外れてたら、ごめんなさい。
想像ですけど、2セットの SELECT って、form が分かれてるんじゃないでしょうか?
こんなふうに。
<form> <!-- ひとつ目 --> <SELECT name="productA" id="productA" onchange="createChildOptionsA(this.form);createChildOptions2A(this.form)"> <option>...</option> </SELECT> ... </form> <form> <!-- ふたつ目 --> <SELECT name="product2A" id="product2A" onchange="createChildOptions2A(this.form)"> <option>...</option> </SELECT> ... </form>
createChildOptions2A() の引数に渡している this.form は、その SELECT が含まれている FORM なので、product2A の SELECT を選択したときには、正しく動きますけど、productA のときには product2A が含まれていない FORM が渡されるので、「見つからない」と出るのでしょう。
productA から createChildOptions2A を呼ぶときには、this.form ではなく、product2A が含まれる FORM を探して渡してあげれば良いと思います。
例えば、ふたつ目の FORM に id 属性を付けて、document.getElementById で渡してあげる、とか。
<form> <!-- ひとつ目 --> <SELECT name="productA" id="productA" onchange="...; createChildOptions2A(document.getElementById('second_form'))"> ... <form id="second_form"> <!-- ふたつ目 --> <SELECT name="product2A" id="product2A" onchange="createChildOptions2A(this.form)">
肝心の部分が見切れちゃうので、色々と省略してますが、createChildOptions2A() の引数に着目してください。
onchange="...; createChildOptions2A(document.getElementById('second_form'))"
<form id="second_form" ...>
# 想像が外れてたら、ごめんなさい。
ありがとうございました。JavaScriptの基礎的な知識不足で、勉強になりました。
onChangeで二つ関数を呼ぶのではなくて、その二つの関数を呼ぶ関数を作って、それをonChangeで呼んでやるというのはどうですか。
ご回答ありがとうございます。確かにコードが簡潔になるので選択肢の一つだと思います。
ありがとうございました。JavaScriptの基礎的な知識不足で、勉強になりました。
2014/04/20 12:26:24