2012-01-18 11 views
0

私は次のコードを持っている:UL子ノードの異なる長さ

<ul id="meganFox"> 
    <li>Frank</li> 
    <li>Jeff</li> 
    <li>Bob</li> 
</ul> 
<div id="debug"></div> 
<script language="javascript"> 
var nodes = document.getElementById('meganFox').childNodes; 
var el = document.getElementById('debug'); 
for(var i = 0; i < nodes.length; i++){ 
    el.innerHTML += i +' - '+ nodes[i] +'<br />'; 
} 
alert(nodes.length); 
</script> 

Firefoxの警告:7 0 - [オブジェクトのテキスト]

1 - [オブジェクトHTMLLIElement]

2 - [対象テキスト]

3 - [対象HTMLLIElement]

4 - [対象テキスト]

5 - [オブジェクトHTMLLIElement]

6 - [対象テキスト]

IE警告:3

0 - [目的]

1 - [オブジェクト]

2 - [オブジェクト]

なぜ7ですか?オブジェクトテキストとオブジェクトとは何ですか?

私の最終目標は、キーイベントをキャプチャし、上下の矢印を使用してキーイベントをナビゲートすることです。 IEで正常に動作していますが、この問題のためにFFで動作していません。

答えて

2

W3準拠のブラウザは、要素間の空白をDOM(テキストノード)の一部と見なします。

IEの古いバージョンはありません。だからこそ、あなたはIEで3、他の場所で7を得る。

出力は、明らかに要素ノードのIEのtoString()が与えるものです。

あなたforループでこれを行う、その後、任意のテキストノードをしたくない場合は...

for(var i = 0; i < nodes.length; i++){ 
    if(nodes[i].nodeType === 3) 
     continue; 
    else 
     el.innerHTML += i +' - '+ nodes[i] +'<br />'; 
} 

これは、すべてのテキストノード(だけでなく、空のもの)を除去します。空でないノードを保存するには、これを行うことができます。

for(var i = 0; i < nodes.length; i++){ 
    if(nodes[i].nodeType === 3 && !nodes[i].data.replace(/^\s*|\s*$/g, '')) 
     continue; 
    else 
     el.innerHTML += i +' - '+ nodes[i] +'<br />'; 
} 
+0

私はIE8とIE9を使用していますので、IEの古いバージョンではありません。私はまだ "空のテキストノード"の定義を理解しようとしています。 googlingそれ。 – phpmeh

+0

ああ、私はそれがコード内の空白だけであることを理解しました...私はFFが嫌いです。 :Pありがとうございました! – phpmeh

+0

@phpmeh:申し訳ありませんが、要素間だけに空白があるはずです。スペース、改行、およびタブが含まれます。私はIE8を古いバージョンと考えています。私はIE9がそれを修正しましたが。 –

関連する問題