2012-02-18 4 views
6

top要素だけのinnerTextを取得する方法はありますか?(子要素のinnerTextは無視しますか?)上の要素だけのinnerTextを取得する方法はありますか?子要素のinnerTextは無視しますか?

例:「子ノードのテキストを」無視して「最上位ノードのテキストを」取得する方法

<div> 
    top node text 
    <div> child node text </div> 
</div> 

?上のdivのinnerTextプロパティは、内側と上の両方のテキストの連結を返すようです。

+1

最初に非テキスト直接子ノードを削除しますか? – Oded

+1

@Oded:必要ありません。子供たちを繰り返して連結してください。簡単なピーシー。 –

答えて

11

ただ、子ノードを反復し、テキスト・ノードを連結します。

var el = document.getElementById("your_element_id"), 
    child = el.firstChild, 
    texts = []; 

while (child) { 
    if (child.nodeType == 3) { 
     texts.push(child.data); 
    } 
    child = child.nextSibling; 
} 

var text = texts.join(""); 
+1

+1 DOMツリーの非常に大きなビットであるかもしれないものをクローン化するよりも明らかに優れています。改善だけが 'text = []'で始まり、次に反復ごとに 'text.push(child.data)'、そして最後に 'text = text.join( '')'の配列を有効にします。文字列に変換することができます。文字列は、常に文字列が繰り返されるよりも速くなりがちです。 –

+0

@DanielEarwicker:私はそれを考慮しましたが、私が最後に見たベンチマークでは、パフォーマンスが実際に向上したことが分かりませんでしたので、シンプルなバージョンに進んだと思います。私は今確認します。 –

+1

いいです。 PS。 'data'は' TextData'(https://developer.mozilla.org/en/DOM/CharacterData)インタフェースで定義され、 'Text'(テキストノード)によって実装されます。 –

3
  1. 要素をクローンします。
  2. すべての子ノードをループします(競合を避けるために後方に移動します)。
    要素にtagName属性がある場合は、要素です。ノードを削除します。
  3. innerTextを使用してテキストコンテンツを取得します(がサポートされていない場合は、textContentにフォールバックしてください)。

コード:

var elem = document.getElementById('theelement'); 
elem = elem.cloneNode(true); 
for (var i=elem.childNodes.length-1; i>=0; i--) { 
    if (elem.childNodes[i].tagName) elem.removeChild(elem.childNodes[i]); 
} 
var innerText = elem['innerText' in elem ? 'innerText' : 'textContent']; 
+0

うわー、すべてのブラウザで魅力的です。率直に言って、私は質問を投稿する前にそれが可能だとは思わなかった:) ...ありがとう... – ivymike

+2

DOMをクローン化したり突然変異させる必要はありません。ちょうどテキストノードの子供を読んでください。私の答えを見てください。 –

+2

@ivymike Timsの方法が優れています。私は彼の答えを私の代わりに受け入れることを提案する。すべてのブラウザ(IE6 +、Chrome 1+、Safari 5、Firefox 3+でテスト済み)でも動作します。 –

0

あなたは子要素の内部テキストを無視したくない場合は、以下を使用します関数:

function getInnerText(el) { 
    var x = []; 
    var child = el.firstChild; 
    while (child) { 
     if (child.nodeType == 3) { 
      x.push(child.nodeValue); 
     } 
     else if (child.nodeType == 1) { 
      var ii = getInnerText(child); 
      if (ii.length > 0) x.push(ii); 
     } 
     child = child.nextSibling; 
    } 
    return x.join(" "); 
} 
+0

私は何かを見逃しているのですか?これは彼らが求めていることの反対ですか? – Tom

2

これはあなたの例では機能します。 document.getElementById("item").firstChild.nodeValue;

注:あなたがその特定のHTMLを扱っている知っていれば、これが動作することに注意してください。あなたのHTMLは、例えばに、変更することができる場合:

<div> 
    <div class="item"> child node text </div> 
    top node text 
</div> 

あなたはここで@Tim Down


することで、より汎用的なソリューションを使用する必要があるコードスニペットを働いている:

window.onload = function() { 
 
    var text = document.getElementById("item").firstChild.nodeValue; 
 
    document.getElementById("result").innerText = text.trim(); 
 
};
#result { 
 
    border: 1px solid red; 
 
}
<div id="item"> 
 
    top node text 
 
    <div> child node text </div> 
 
</div> 
 

 

 

 
<strong>Result:</strong> <div id="result"></div>

関連する問題