在2022年获取一个元素中的所有文本而没有任何子元素中的文本似乎仍然不是简单的事情。
但是不需要jQuery。
获取所有原始文本节点(s)内容:
const getElementTextWithoutChildElements = (el) =>
Array.from(el.childNodes) // iterator to array
.filter(node => node.nodeType === 3) // only text nodes
.map(node => node.textContent) // get text
.join('') // stick together
;
或者类似的,使用reduce:
const getElementTextWithoutChildElements = (el) =>
[].reduce.call(
el.childNodes,
(a, b) => a + (b.nodeType === 3 ? b.textContent : ''),
''
);
应该这样做:
<div>
you get this
<b>not this</b>
you get this too
</div>
将返回:
you get this
you get this too
元素之间的空白可能很棘手,建议使用.trim()和/或规范化所有空白。
对于调试和记录快速识别元素,我发现这通常是足够的:
getElementTextWithoutChildElements(...).replace(/\s+/g, ' ').trim();
// 'you get this you get this too'
尽管您可能希望以不同的方式调整空白,但可以在reduce()函数本身中处理每个节点的空白。
例如,每个节点的空格处理:
const getElementTextWithoutChildElements_2 = (el) =>
Array.from(el.childNodes)
.filter(node => node.nodeType === 3)
.map(node => node.textContent.trim()) // added .trim()
.join(',') // added ','
;
以上内容的快速测试:
document.body.innerHTML = `
you get this
<b>not this</b>
you get this too
`;
// '\n you get this\n <b>not this</b>\n you get this too\n'
getElementTextWithoutChildElements(document.body);
// '\n you get this\n \n you get this too\n'
getElementTextWithoutChildElements(document.body).replace(/\s+/g, ' ').trim();
// 'you get this you get this too'
getElementTextWithoutChildElements_2(document.body);
// 'you get this,you get this too'