Is there a way to get innerText of only the top element (and ignore the child element's innerText) ?
Example:
<div>
top node text
<div> child node text </div>
</div>
How to get the "top node text" while ignoring "child node text" ? innerText property of top div seem to return concatenation of both inner , top text.
Child nodes can be removed from a parent with removeChild(), and a node itself can be removed with remove(). Another method to remove all child of a node is to set it's innerHTML=”” property, it is an empty string which produces the same output.
textContents is all text contained by an element and all its children that are for formatting purposes only. innerText returns all text contained by an element and all its child elements. innerHtml returns all text, including html tags, that is contained by an element.
innerHTML returns HTML, as its name indicates. Sometimes people use innerHTML to retrieve or write text inside an element, but textContent has better performance because its value is not parsed as HTML. Moreover, using textContent can prevent XSS attacks.
Just iterate over the child nodes and concatenate text nodes:
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("");
This will work in your example:
document.getElementById("item").firstChild.nodeValue;
Note: Keep in mind that this will work if you know you are dealing with that specific HTML. If your HTML can change, for example to:
<div>
<div class="item"> child node text </div>
top node text
</div>
then you should use the more generic solution by @Tim Down
Here is working code snippet:
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>
tagName
attribute, then it's an element: Remove the node.innerText
to get the textual contents (with fallback to textContent
, when innerText
is not supported).Code:
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'];
function getDirectInnerText(element) {
var childNodes = element.childNodes;
result = '';
for (var i = 0; i < childNodes.length; i++) {
if(childNodes[i].nodeType == 3) {
result += childNodes[i].data;
}
}
return result;
}
element = document.querySelector("div#element");
console.log(getDirectInnerText(element))
<div id="element">
top node text
<div> child node text </div>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With