JavaScriptのlengthが読めない理由とは?

このQ&Aのポイント
  • JavaScriptのlengthが読めない理由を知りたいです。
  • コードを実行すると、forのところでchildNodes.lengthが読めないとエラーになります。
  • divsの中身があるのに読めない理由を教えてください。また、他につっこみたいこともあれば教えてください。
回答を見る
  • ベストアンサー

lengthが読めない理由が分からない

lengthが読めない理由が分からない var divs = document.getElementsByTagName("div"); alert(divs); for(var i=0; i < divs.childNodes.length; ++i){   if(divs.childNodes[i].tagName == "h2"){     a.push = divs[i];     b.push = divs[i].h2.nodeValue;     divs[i].style.display = "none";   } } JavaScriptです。 こんなコードを実行すると、forのとこのchildNodes.lengthが読めないとエラーになります。 divsの中身はあるはずだから、読めるんじゃないかと思うのですが。 ちゃんと[object NodeList]と表示されます。 htmlの方には、divは5つぐらいかいてあります。 JavaScriptの挙動がよく分からない……。 chromeでやってますが、firefoxでも動きませんでした。 理由を教えていただけるとうれしいです。 なんか他につっこみたいこともあれば……。 h2をあんな読み方できない、とか。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>divs.childNodes divs[0]~divs[n]がchildeNodesをもっているだけで、 divsはオブジェクトを集合したがただの配列なのでchildNodesを もっていませんね フロー的にはh2を含むdivを隠す? であればh2を拾った方がはやくないですか? <script> function hide(){ var h2s = document.getElementsByTagName("h2"); for(var i=0; i < h2s.length; i++){ var n=h2s[i]; var a=new Array(); var b=new Array(); while(n=n.parentNode){ if(n.nodeName=="DIV"){ a.push(n); b.push(h2s[i].firstChild.nodeValue); n.style.display = "none"; break; } } } alert(a[0]); alert(b[0]); } </script> <div><h2>test1</h2></div> <div>hogehoge</div> <div><h2>test2</h2></div> <div><hr><h2>test3</h2></hr></div> <input type="button" value="hide" onclick="hide()">

mayacrow
質問者

お礼

h2からたどれば早かった……orz 思いつきませんでした。 なるほど、です。 ありがとうございました。

その他の回答 (5)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.6

lengthの件は他の方の回答どおりで。 これがHTML文章で、tagNameを「比較」するなら大文字じゃないとダメかも。 ~.tagName == 'h2' ↓ ~.tagName == 'H2' XMLなら大文字小文字を区別してそのまま格納されるけどHTMLだと常に大文字で格納されてます。 http://www.doraneko.org/misc/dom10/19981001/level-one-core.html#attribute-tagName

mayacrow
質問者

お礼

そうなんですか。 大文字で書くように気をつけます。 ありがとうございます。

回答No.5

++i, i++ まじすかっ!?

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

divsは配列(コレクションノード)だから、 divs[n].childNodes.length のように個別指定するか、each構文(普通のjavascriptにはない) にしなければ、.... それと何故i++じゃなく++iなのか、[0]の要素は絶対無視できるんですか?

mayacrow
質問者

お礼

divsは配列なのにそのままchildNodes使えるはずがなかったんですね。 わかりやすい指摘です。 forの中で使う分には、i++も++iも同じ動きだと認識しているのですが、間違ってますか? 別に++iでも[0]要素は無視されてないと思います。 普段はC#とかを使ってますが、問題になったことはないです。 JavaScriptは分かりませんが……。 ありがとうございました。

回答No.2

var a = [ ], b = [ ]; var divs = document.getElementsByTagName("div"); for( var i=0; i < divs.length; ++i) {  for( var j=0; j< divs[i].childNodes.length; ++j) {   if( divs[i].childNodes[j].nodeName == "H2"){    a.push( divs[i].childNodes[j] );    b.push( divs[i].childNodes[j].firstChild.nodeValue );    divs[i].childNodes[j].style.display = "none";   }  } } ためしてないけど //@cc_on var a = [ ], b = [ ]; var divs = document.getElementsByTagName("div"); for( var c1 = 0, tgt1, h2; tgt1 = divs[ c++ ]; ) {  h2 = tgt1.getElemensByTagName( 'h2' );  for( var c2 = 0, tgt2; tgt2 = h2[ c2++ ]; ) {   a.push( tgt2 );   b.push( tgt2./*@if(1) innerText @else@*/ textContent /*@end@*/ );//ちょっとちがう   tgt2.style.display = 'none';  } }

mayacrow
質問者

お礼

なるほど、やり方が分かりました。 ありがとうございます。

noname#108428
noname#108428
回答No.1

単純に divs.length で取得できませんか?

mayacrow
質問者

お礼

なるほど。 エラーはでなくなりました。 となると、forは2ついるんだ……。 ありがとうございます。

関連するQ&A

  • content scriptについて質問です

    閲覧ありがとうございます。 あるサイトで拾ったグーーグルクロームのcontent scriptを実行したいのですが、なかなか動いてくれません。 内容は、 モバゲーのゲーム神撃のバハムートでのバザーで勝手に最安値のアイテムを買ってくれるというscriptです。 それがこちらです。 var divs = document.getElementsByTagName("div"); var forms; for(var i=0; i < divs.length; i++) {   if(/キュアウォータ\([100-110]{0,2}\)/.test(divs.innerText)){     forms = divs[i].parentNode.getElementsByTagName("form");     if(forms.length !== 0) inputs[0].submit();   } } これをそのままjsファイルにして、作ったマニフェストファイルと一緒にパッケージ化しました。 ミス出品を拾わないように少し数字はいじりましたが、関係ないようです。 何がおかしいのでしょうか?ご指摘よろしくお願いします

  • JavaScriptのdiv.style属性の変更が反映されない:最後

    JavaScriptのdiv.style属性の変更が反映されない:最後のDivタグを除いたすべてのDivタグに改ページ属性を有効にするようJavaScriptで制御したいと考えています。しかし、以下のようなプログラムでは、スタイル属性が更新されず改ページが実行されてしまうため、1枚真っ白な紙が印刷されることになってしまいます。こちらの意図したように動作させるにはどうしたらよいでしょうか。 <html> <head> <style> div.test { page-break-after:always; color:black; } </style> <script type="text/javascript"> window.onload = function() { var divs = document.getElementsByTagName('div'); for(i = divs.length - 1; i >= 0; i--){ if(divs[i].className == "test"){ divs[i].style.pageBreakAfter = ""; break; } } }; </script> </head> <body> <div class="test">テスト</div> <div class="test">テスト</div> <div class="test">テスト</div> </body> </html>

  • javascriptでxmlデータの取得

    googleガジェットでamazonAPIを使ったものを作ろうと思うのですが[FormattedPrice]のデータが取得できません。 + <Item> - <OfferSummary> - <LowestNewPrice> <Amount>2359</Amount> <CurrencyCode>JPY</CurrencyCode> <FormattedPrice>¥ 2,359</FormattedPrice> </LowestUsedPrice> </OfferSummary> </Item> こうなっている中で<FormattedPrice>の値を取り出すにはどうすればいいのでしょうか? var entryElements = doc.getElementsByTagName('Item');  for (var i = 0; i < entryElements.length; ++i) {   var entry = entryElements[i];   var entryData = {};   entryData['price'] = entry.getElementsByTagName('FormattedPrice')[0].childNodes[0].nodeValue; } とやっても駄目でした。

  • DOMを使ったテキストノードの繰り返し書き換え方法

    pタグにtestという文字を入れるようにしたいのですが、ブラウザがかたまってしまいます。 考え方としては間違っていないと思うのですが、なぜでしょうか。 <html lang="ja"> <head> <title></title> </head> <body> <div id="aaa"> <p></p> <p></p> <p></p> </div> <script> var pels = document.getElementById("aaa"); var pp = pels.childNodes; for(i=0; i=pp.length; i++){ //i%2==0で空白テキストノードを除く if(i%2 == 0){ pels.childNodes.item(i).nodeValue = "test"; } } </script> </body> </html>

  • スクロール領域の再読み込み OR 更新

    xmlファイルから<item>(rss)を取得し、marqueeでスクロールさせています。 xmlファイルは定期的にファイルを更新し記事が増えていきます。 画面上でも定期的にxmlファイルを取得し最新記事を表示できるのですが、 最後までスクロールされず、途中で先頭からスクロールしはじめてしまいます。スクロール領域が最初に表示された記事の長さで固定になってしまっています。 画面を更新すれば、スクロール領域は直ります。 全体の更新しないで、部分的な更新はできますでしょうか? このRSSを表示している部分だけの更新をしたいです。 もし、部分的な更新が出来れば <marquee id="" direction="left" loop="1" onFinish="更新"> でループさせ、最新記事を取り、スクロールし続けることは可能でしょうか? もしくは、marquee スクロール領域を再度読み直す方法はありますでしょうか? お分かりの方いらっしゃいましたら、教えてください。 宜しくお願い致します。 下記ソースは、RSSを表示し定期的に最新記事を追加しているものです。 <script type='text/javascript'> var title=''; var description=''; var hoge=''; var xmlDoc=loadXML('sample.rss'); var cNodes = xmlDoc.getElementsByTagName("item"); for(j=0;j<cNodes.length;j++) { title = cNodes[j].getElementsByTagName("title")[0].childNodes[0].nodeValue; description = cNodes[j].getElementsByTagName("description")[0].childNodes[0].nodeValue; hoge += '<font '; hoge += 'face="IPAMonaPGothic"'; hoge += 'color="#e8edf2"'; hoge += 'style="font-size:20px;">&nbsp;&nbsp;'; hoge += title; hoge += description; hoge += '</font>'; } $("document").ready(function() { $('test').append(hoge); }) setInterval('update()', 60000); function update(){ var title=''; var description=''; var hoge=''; var xmlDoc=loadXML('sample.rss'); var cNodes = xmlDoc.getElementsByTagName("item"); for(j=0;j<cNodes.length;j++) { title = cNodes[j].getElementsByTagName("title")[0].childNodes[0].nodeValue; description = cNodes[j].getElementsByTagName("description")[0].childNodes[0].nodeValue; hoge += '<font '; hoge += 'face="IPAMonaPGothic"'; hoge += 'color="#e8edf2"'; hoge += 'style="font-size:20px;">&nbsp;&nbsp;'; hoge += title; hoge += description; hoge += '</font>'; } $('test').empty(); $('test').append(hoge); } </script> <div id='test'> </div>

  • オブジェクトの番号

    お世話になります。 JavaScriptでオブジェクトプロパティを取得する。 例えば var obj=document.getElementsByTagName("*"); var len = obj.length; for (var i=0;i<len;i++){   if(obj[i].tagName.match(img)){   ・・・・・・ このときiに入る値は、そのオブジェクトの番号が入っていると思うのですが、 この番号自体のみをあるオブジェクトから取得することはできないものなのでしょうか。 具体的に <img src="・・・" onclick="getObjNo(this)"> function getObjNo(obj){  var objNo=?????  //ここで、imgオブジェクトの番号を取得したいのですが。その方法がわかりません。 } よろしくお願いいたします。

  • nullまたはオブジェクトではありません

    どなたかよろしくお願いします。 以下のスクリプトで動作確認中にエラーが表示されます。 13行目「'src'はnullまたはオブジェクトではありません」とでます どうやって直したら良いのかわかりません。 IEの「スクリプトのエラーを表示しない」をすれば 一応希望通りに動くので、問題ないとは思うのですが気になります。 どうすれば解消できるでしょうか。 function setLinkListener () { var links = document.links; for (var i = 0; i < links.length; i++) { var link = links [i]; if (link.linkees) { link.onmouseover = function () { for (var i = 0; i < this.linkees.length; i++) { var linkee = this.linkees [i]; // changePseudoLinkClassName (linkee); if (linkee.tagName == "IMG") changeImage (linkee, linkee.src.replace ("_over.gif", ".gif").replace (".gif", "_over.gif")); if (linkee.tagName == "TD") { var image = linkee.getElementsByTagName ("img")[2]; changeImage (image, image.src.replace ("_over.gif", ".gif").replace (".gif", "_over.gif")); } } }; link.onmouseout = function () { for (var i = 0; i < this.linkees.length; i++) { var linkee = this.linkees [i]; // restorePseudoLinkClassName (linkee); if (linkee.tagName == "IMG") restoreImage (linkee); if (linkee.tagName == "TD") restoreImage (linkee.getElementsByTagName ("img")[2]); } }; } } }

  • ボタンを押せば、画面が切り替わる方法が知りたい

    このプログラムをラジオボタンで画面が切り替わる方法ではなく、普通のsubmitボタンで切り替えれる方法にしたいです。 最初は、<input type="radio"をinput type="submit"にしたのですが、これでは、たぶん変わってるんだとは思うんですけど一瞬しか画面が変わりません。 これを、次のボタンを押すまで、ずーと同じ画面になる方法が知りたいです。 <html> <head> <style type="text/css"> #contents2,#contents3,#contents4{ display:none; } </style> <script language=javascript> function view(divId,divClass){ var divs=document.getElementsByTagName('div'); for(var i=0;i<divs.length;i++){ if(divs[i].className==divClass){ if(divs[i].id==divId) divs[i].style.display="block"; else divs[i].style.display="none"; } } } </script> </head> <body> <form> <input type="radio" name="category" id="category1" onClick="view('contents1','contensGroup')" checked><label for="category1">エリア1</label> <input type="radio" name="category" id="category2" onClick="view('contents2','contensGroup')"><label for="category2">エリア2</label> <input type="radio" name="category" id="category3" onClick="view('contents3','contensGroup')"><label for="category3">エリア3</label> <input type="radio" name="category" id="category4" onClick="view('contents4','contensGroup')"><label for="category4">エリア4</label> </form> <div id="contents1" class="contensGroup">内容1</div> <div id="contents2" class="contensGroup">内容2</div> <div id="contents3" class="contensGroup">内容3</div> <div id="contents4" class="contensGroup">内容4</div> </body> </html>

  • VBscriptでXMLデータの抽出に関する質問

    教えて下さい。以下のようなXMLファイルがあります。 <?xml version="1.0" encoding="Shift-JIS"?> <ROOT> <INFO> <NO>0001</NO> <NAME>ABC</NAME> <COMMENT> </COMMENT> <AGE>30</AGE> </INFO> </ROOT> これを以下のようにVBScriptにてデータを取り出したいです。 Dim DOM, docRoot, node, nodeList, i, m Dim objADO, objADO2 Dim objRS Dim sqlstmt, strSQL Dim no, comment 'DOMオブジェクト生成 Set DOM = CreateObject("Microsoft.XMLDOM") '同期モード DOM.async = True 'XMLを読み込む DOM.load("11.xml") 'ルートセット Set docRoot = DOM.documentElement 'ノードの設定 Set nodeList = docRoot.selectNodes("/ROOT/INFO") 'ループ For Each node In nodeList For i = 0 to node.ChildNodes.length - 1 Select case node.childNodes(i).nodeName case "NO" no = node.childNodes(i).firstChild.nodeValue case "COMMENT" comment = node.childNodes(i).firstChild.nodeValue End select Next Next ところがCOMMENTタグのようにデータが空のものがあると 「オブジェクトがありません」とエラーになります。 if Not IsNull(node.childNodes(i).firstChild.nodeValue) then というようにもやってみましたが、これでも同じエラーとなってしまいます。 何か方法はないでしょうか?アドバイスを宜しくお願いします。

    • ベストアンサー
    • XML
  • XMLの空白要素をJavascriptのif文で条件分けする

    JavascriptもXMLも始めたばかりの者です。 分からないことがあり、皆様にご教授頂ければと思い投稿しました。 XMLで生成したファイルから各要素を取り出してHTMLに置き換えるスクリプトをJavascriptで作ろうと思います。 ~XMLファイル~宣言省略 <links> <link> <url>http://www.○○○.com/</url> <title>○○○~</title> <ban>http://www.○○○.com/XX.gif</ban> </link> <link> <url>http://www.×××.com/</url> <title>×××~</title> <ban></ban>//←画像データ空欄 </link> </links> ~Javascript~前後省略 var a = obj.responseXML; var xmlDoc = a.documentElement; var links = xmlDoc.getElementById("links").length; for(var i=0; i<links; i++) { var link = xmlDoc.getElementsByTagName("link")[i].firstChild.nodeValue; var title = xmlDoc.getElementsByTagName("title")[i].firstChild.nodeValue; var image = xmlDoc.getElementsByTagName("image")[i].firstChild.nodeValue; var html = Html(link,title,image); } function Html(link,title,image) { ~中略~ if(image != ""){ html += '<a href="' + link + '"><img src="' + image + '" alt="' + title + '" /></a>'; } return html; } この後、html内の「<div id="html"></div>」に表示させるのですが、function Html(~)では、画像の有無は絶対条件ではない為if文で条件分けしています。 ですが、この「if(image != "")」で「has no properties」エラ-になります。 ちなみに空欄だった画像データ欄に文字列を入れるときちんと動作します。 XMLタグに文字列が入らない場合、配列には""(空)が返されないのでしょうか? 何か良い方法はありましたら、よろしくご教授くださいませ。 よろしくお願いいたします。

    • ベストアンサー
    • XML

専門家に質問してみよう