人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javascriptで、下のようなスクリプトを組みました。
どうしても親ノードの下の子ノードの数さえ取得できません。
list[0].bblength.length;
これが無効になってしまいます。
ほかにも
list.item(0).bblength.length;
も試しましたが、取得できません。
なにが悪いのか、さっぱりで、ネットでもいろいろ検索したのですが解決できませんでした。
なにが問題なのか、どなたかわかりませんか? お教えください。
-------------------------------
<html><head> <title> </title>
<script type="text/javascript">
function web(){
var oyanode =document.getElementsByClassName('oya');
var bbnode = document.getElementsByName("bb");
var oyaLength=oyanode.length;
var bblength=bbnode.length;
var ans;
var ans=list[0].bblength.length;
document.getElementById("crt").innerHTML="oyaノードの数="+oyaLength+"<br>bbノードの数="+bblength+"<br>1つ目のoyaノードの中のbbノードの数="+ans;
}
</script>
</head>
<body>


<div class="oya">
<div name="bb"></div>
<div name="bb"></div>
<div name="bb"></div>
<div name="bb"></div>

</div>

<div class="oya">
<div name="bb"></div>
<div name="bb"></div>
<div name="bb"></div>
<div name="bb"></div>

</div>
<button onclick="web()">クリック</button><br>
<span id="crt"></span>
</body></html>

●質問者: maniad1
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

スクリプトに間違いがありました。正しくは以下の通りです。
var ans=list[0].bbnode.length;
この部分でエラー停止してしまいます。
function web(){ var oyanode =document.getElementsByClassName('oya'); var bbnode = document.getElementsByName("bb"); var oyaLength=oyanode.length; var bblength=bbnode.length; var ans; var ans=list[0].bbnode.length; document.getElementById("crt").innerHTML="oyaノードの数="+oyaLength+"<br>bbノードの数="+bblength+"<br>1つ目のoyaノードの中のbbノードの数="+ans;}</script>


1 ● ku__ra__ge
ベストアンサー

var ans=list[0].bbnode.length;がエラーになる原因は、listが定義されていないからです。
未定義オブジェクトは"0"メンバを持ちません。

こういうことがやりたいのでしょうか?

var ans=oyanode[0].children.length;

それともこう?

var ans=Array.filter(oyanode[0].children, function(i) i.getAttribute("name")=="bb").length;

追記:
「親ノードの下の特定のnameの子ノードごとに異なったデータを表示させたい」というのはこういったコードで実現できます。

for (var i=0; i<oyanode[0].children.length; i++) {
 var el = oyanode[0].children[i];
 if (el.getAttribute("name") == "bb") {
 el.innerHTML = i;
 }
}

maniad1さんのコメント
質問にさえエラーがあるほど、愚かですいません。 var ans=list[0].bbnode.lengthではなく var ans=oyanode[0].bbnode.lengthです。 この場合undefinedが返ってきます。私の期待では4であるはずなのですが。

maniad1さんのコメント
私のしたいのは、親ノードの下の特定のnameの子ノードごとに異なったデータを表示させたいのです。それで、for文の入れ子を用いてそれを実現しようと思っているのですが、このままでは、特定の子ノードにデータを指定するどころか、特定名の子ノードの数すら取得できないというわけです。お分かりいただけましたでしょうか。

ku__ra__geさんのコメント
回答に追記をしましたがこれで求める回答になっているでしょうか?

maniad1さんのコメント
ありがとうございます。 おそらく、このような方法が堅実なんだと思います。 しかし、なんで a=document.getElementsByName("oya"); b=document.getElementsByName("bb"); a[0].b.lengthが成立しないのでしょうか。 それができればご紹介いただいたような長々としたコードは必要ないような気がしていろいろやってみたんですが。

ku__ra__geさんのコメント
なぜならば『a[0].b』は、 変数「a」が示すオブジェクトに属しているのメンバ「0」、…が示すオブジェクトに属しているメンバ「b」 という意味だからです。 それは単なる変数「b」とは全く関係ない別物です。

maniad1さんのコメント
大変参考になりました。 ご丁寧な解説をいただきありがとうございます。 よくわかりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ