Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
87
rated 0 times [  88] [ 1]  / answers: 1 / hits: 19227  / 12 Years ago, sat, march 31, 2012, 12:00:00

How do I get the text of an element without the children?
Neither element.textContent nor element.innerText seem to be working.



HTML:



<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>


and here's the fool function:



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();
}
}


edit: using node.nodeType doesn't really help and here's why:
Imaginge the following 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>


if I'd use nodeType, only the text of the a element would change , but not the td itself (last visit....)


More From » jquery

 Answers
16

Just find the text nodes:



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


edit — if you want the text in descendant (children) nodes, and (as is now apparent) you're using 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;
};


Hold on and I'll test that out :-) (seems to work)


[#86488] Friday, March 30, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jazminuniquer

Total Points: 63
Total Questions: 121
Total Answers: 96

Location: Cambodia
Member since Thu, May 21, 2020
4 Years ago
;