2011-06-24 2 views
2

私はPHPスクリプトから動的に生成されたHTMLをいくつか持っています。 PHPのコードは、このjavascriptを使用して特定のdivタグからすべてのテキストノードを削除します

echo "<div id='categories'>\n"; 
foreach($category as $k => $v) 
{ 
echo "<div class='category'>\n"; 
echo "<div id=\"$k\" class='cat_name'\n>$k</div>\n"; 
echo "<div id=\"$k".'_link"'." class='cat_link'>\n<a href=$v>Link</a>\n</div>\n"; 
echo "</div>\n"; 
} 
echo "</div>\n"; 

のように私は、HTMLのテキストノードが存在するので、予想通り、この

var categories=document.getElementById('categories').childNodes; 
for(i=0;i<categories.length;i++) 
{ 
var link=categories[i].childNodes[1].childNodes[0].attributes['href']; 
.. 
... 
.. 

今、このdoesntの仕事のようにDOMにアクセスしようとしたJavaScriptファイルを持って見えます。私はこの

document.getElementById('categories').childNodes[0].nodeType; // displays 3 

をしようとするfirebug consoleを使用する場合 それはノードがtext nodeであることを意味している3を表示します。 私はこの

window.onload=function() { 
document.normalize(); 
var categories=document.getElementById('categories').childNodes; 
... 
... 

ようwindow.onloaddocument.normalize();を追加しようとしたが、テキストノードは、HTML内に残ります。どのように私はすべてのテキストノードを削除することができます。今私は、どのようにすべてのテキストノードを取得するのですかgetElementByType()のようなメソッドがあるとは思わない。

答えて

4

使用.childrenは要素のみ(テキストノード)を標的とします

// --------------------------------------------------v 
var categories=document.getElementById('categories').children; 

FF3は、あなたがそのブラウザをサポートしているので、もし、あなたがする方法が必要になります、そのプロパティをサポートしていません。それを複製する。

function children(parent) { 
    var node = parent.firstChild; 
    var result = []; 
    if(node) { 
     do { 
      if(node.nodeType === 1) { 
       result.push(node); 
      } 
     } while(node = node.nextSibling) 
    } 
    return result; 
} 
var parent = document.getElementById('categories'); 
var categories= parent.children || children(parent); 

また、IEにはコメントノードもありますので、マークアップにコメントが含まれていない方が良いでしょう。

+1

+1、これは素晴らしいです.. –

1
+0

私の問題は解決しません。私のHTML全体にテキストノードがあります。私はそれ以上のトラバーサル – lovesh

+0

の@loveshのためにそれらのテキストノードを削除する必要があります、そして、あなたは[patrick dwの答えを使うべきです(http://stackoverflow.com/questions/6472464/removing-all-text-nodes-from-a-特定のdivタグを使用するjavascript/6472637#6472637) –

0

あなたのループ内の各ノードをチェックして、テキストノードの場合は、あなたが言ったように、それを削除するか、何もしないのいずれか:ネイティブ、それはこれらの実装を見てサポートしていないブラウザのために

var categories=document.getElementByClassName('category'); 

。テキストノードでない場合は、そのノードに実行するアクションを実行します。代わりに.childNodes

関連する問題