有没有办法获得文档中所有textNode
对象的集合?
getElementsByTagName()
对于元素非常有效,但是textNode
不是元素。
更新:我意识到这可以通过遍历DOM来实现-正如下面许多人所建议的那样。我知道如何编写一个DOM-walker函数来查看文档中的每个节点。我希望有一些浏览器原生的方法来做这件事。毕竟,我可以通过一个内置调用获得所有的<input>
,但不是所有的textNode
,这有点奇怪。
发布于 2017-06-13 16:22:22
下面是最快的TreeWalker方法的现代Iterator
版本:
function getTextNodesIterator(el) { // Returns an iterable TreeWalker
const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);
walker[Symbol.iterator] = () => ({
next() {
const value = walker.nextNode();
return {value, done: !value};
}
});
return walker;
}
用法:
for (const textNode of getTextNodesIterator(document.body)) {
console.log(textNode)
}
更安全的版本
如果在循环中移动节点,直接使用迭代器可能会卡住。这更安全,它返回一个数组:
function getTextNodes(el) { // Returns an array of Text nodes
const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);
const nodes = [];
while (walker.nextNode()) {
nodes.push(walker.currentNode);
}
return nodes;
}
发布于 2011-04-01 22:06:08
我知道你特别要求一个集合,但如果你只是非正式地说,并不关心它们是否都连接到一个大字符串中,你可以使用:
var allTextAsString = document.documentElement.textContent || document.documentElement.innerText;
...with第一项是DOM3标准方法。但是请注意,innerText
似乎在支持它的实现(至少IE和Chrome)中排除了脚本或样式标签内容,而textContent
则包含它们(在Firefox和Chrome中)。
发布于 2019-03-09 11:16:52
这里有一个更惯用并且(希望)更容易理解的替代方法。
function getText(node) {
// recurse into each child node
if (node.hasChildNodes()) {
node.childNodes.forEach(getText);
}
// get content of each non-empty text node
else if (node.nodeType === Node.TEXT_NODE) {
const text = node.textContent.trim();
if (text) {
console.log(text); // do something
}
}
}
https://stackoverflow.com/questions/2579666
复制相似问题