有没有办法只获取顶部元素的innerText(并忽略子元素的innerText)?
示例:
<div>
top node text
<div> child node text </div>
</div>
如何获取“顶部节点文本”而忽略“子节点文本”?顶部 div 的 innerText 属性似乎返回内部文本和顶部文本的串联。
只需迭代子节点并连接文本节点:
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("");
这将在您的示例中起作用:
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>
tagName
属性,则它是一个元素:删除该节点。innerText
获取文本内容(当不支持 textContent
时,可以回退到 innerText
)。代码:
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>
如果不想忽略子元素的内部文本,请使用以下函数:
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(" ");
}
正如所有其他答案已经解释的那样,您需要检查子节点的类型。
这是基于 @ehsaneha 的答案的简洁的单行文字:
Array.from(element.childNodes).reduce((x, y) => x + (y.nodeType == Node.TEXT_NODE ? y.data : ''), '').trim()
或者作为原型方法:
Element.prototype.directInnerText = function () {
return Array.from(this.childNodes).reduce((x, y) => x + (y.nodeType == Node.TEXT_NODE ? y.data : ''), '').trim();
}
用途:
console.log(document.body.querySelector('.element').directInnerText());
兼容性参考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType?retiredLocale=de
const nodeValues=[];
document.querySelectorAll("locator").forEach(
function (currentValue) {
nodeValues.push(currentValue.firstChild.nodeValue);
}
)
return nodeValues;