2012-03-31 9 views
9

子なしの要素のテキストを取得するにはどうすればよいですか? element.textContentでもelement.innerTextでも動作していないようです。javascriptで子なしの要素のテキストを取得する

HTML:

jQuery.fn.justtext = function(text) { 
    return $(this).clone() 
    .children() 
    .remove() 
    .end() 
    .text(); 
}; 

function fool(el) { 

    reverse(el); 

    function reverse(el) { 
     $(el).children().each(function() { 
      if($(this).children().length > 0) { 
       reverse(this); 
       if($(this).justtext() != "") 
        reverseText(this); 
      } else { 
       reverseText(this) 
      } 
     }); 
    } 

    function reverseText(el){ 
     var text = el.textContent; 
     var frag = text.toString().split(/ /); 
     var foo = ""; 
     var punctation_marks = [".",",","?","!"," ",":",";"]; 
     for(i in frag){ 
      if(punctation_marks.indexOf(frag[i]) == -1) 
       foo += actualReverse(frag[i],punctation_marks) + " "; 
     } 
     el.textContent = foo; 
    } 

    function actualReverse(text,punctation_marks) { 
     return (punctation_marks.indexOf(text.split("")[text.split("").length-1]) != -1)?text.split("").slice(0,text.split("").length-1).reverse().join("") + text.split("")[text.split("").length-1] : text.split("").reverse().join(""); 
    } 
} 

編集:ここ

<body> 
<h1>Test Heading</h1> 
<div> 
Awesome video and music. Thumbs way up. Love it. Happy weekend to you and your family. Love, Sasha 
</div> 
</body> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
<script type="text/javascript"> 
    fool("body"); 
</script> 

とはfool機能だ本当に助けにはならないnode.nodeTypeを使用して、ここだ理由: Imaginge以下のHTML

<td class="gensmall"> 
    Last visit was: Sat Mar 31, 2012 10:50 am 
    <br> 
    <a href="./search.php?search_id=unanswered">View unanswered posts</a> | <a href="./search.php?search_id=active_topics">View active topics</a> 
</td> 

td自体、私は、nodeTypeを使用したいだけa要素のテキストを変更するだろうが、されていない場合(「最後の訪問....」)

+0

plzはあなたのhtml – Jigs

+0

任意のコードを投稿しますか?セレクタが間違っている可能性があります。 'element'は' .textContent'と 'innerText'が空のときにコンテンツをコンバインしません。 –

+0

「子供なし」というのは正確にはどういう意味ですか? – Pointy

答えて

14

だけでテキストノードを見つける:

var element = document.getElementById('whatever'), text = ''; 
for (var i = 0; i < element.childNodes.length; ++i) 
    if (element.childNodes[i].nodeType === 3) 
    text += element.childNodes[i].textContent; 

編集 —(今明らかなように)あなたはjQueryを使用している子孫のテキストを(「子供」)のノードたい、と場合:

$.fn.allText = function() { 
    var text = ''; 
    this.each(function() { 
    $(this).contents().each(function() { 
     if (this.nodeType == Node.TEXT_NODE) 
     text += this.textContent; 
     else if (this.nodeType == Node.ELEMENT_NODE) 
     text += $(this).allText(); 
    }); 
    }); 
    return text; 
}; 

私はそれをテストします:-)(動作するようです)

+5

私は読みやすいので "3"ではなく "Node.TEXT_NODE"を使用しています。 –

+1

は、それらが含むテキストノードを見つけるために非テキストノードを再帰的に処理する必要があります。 (例:表のセル) –

+0

@ David-SkyMesh:まさに私の問題です。私は自分の質問を編集しました –

2

要素のテキストも別のノードです。 コードのこの部分を考えてみましょう:あなたは要素のテキストをしたいと言うとき、あなたは今

<span> 
    Some text 
    <span>Inner text</span> 
    More text 
    <span>More inner text</span> 
    Even more text 
</span> 

何を意味するのですか? 直接の子供たちだけ?

、コードのこの部分のコードは役立つかもしれない:

for (var element in elements) { 
    if (element.nodeType == Node.TEXT_NODE) { 
     // do something 
    } 
} 
4

このコードは、2件の他の回答として、より多くの表現、機能的な方法で同じ結果を達成します。 filtermapの配列メソッドは、最新のすべてのブラウザ(IE9以上)でサポートされています。

他の回答は少し遅れているので、そこにこれを投げてください。先のとがったような答えに加えて

var content = Array.prototype.filter.call(element.childNodes, function (element) { 
    return element.nodeType === Node.TEXT_NODE; 
}).map(function (element) { 
    return element.textContent; 
}).join(""); 
1

<br/>ために改行文字を処理することは、次のように行うことができます。

txt = ''; 
for (var i = 0; i < element.childNodes.length; ++i) 
    if (element.childNodes[i].nodeType == 3) { 
     txt += element.childNodes[i].textContent; 
    } else if (element.childNodes[i].nodeType == 1) { 
     name = element.childNodes[i].nodeName || element.childNodes[i].tagName || ''; 
     if (name.toUpperCase() == 'BR') { 
      txt += '\n'; 
     } 
    } 
return txt; 
関連する問題