首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >与textNodes等效的getElementsByTagName()

与textNodes等效的getElementsByTagName()
EN

Stack Overflow用户
提问于 2010-04-06 00:58:37
回答 6查看 18K关注 0票数 85

有没有办法获得文档中所有textNode对象的集合?

getElementsByTagName()对于元素非常有效,但是textNode不是元素。

更新:我意识到这可以通过遍历DOM来实现-正如下面许多人所建议的那样。我知道如何编写一个DOM-walker函数来查看文档中的每个节点。我希望有一些浏览器原生的方法来做这件事。毕竟,我可以通过一个内置调用获得所有的<input>,但不是所有的textNode,这有点奇怪。

EN

回答 6

Stack Overflow用户

发布于 2017-06-13 16:22:22

下面是最快的TreeWalker方法的现代Iterator版本:

代码语言:javascript
复制
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;
}

用法:

代码语言:javascript
复制
for (const textNode of getTextNodesIterator(document.body)) {
    console.log(textNode)
}

更安全的版本

如果在循环中移动节点,直接使用迭代器可能会卡住。这更安全,它返回一个数组:

代码语言:javascript
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2011-04-01 22:06:08

我知道你特别要求一个集合,但如果你只是非正式地说,并不关心它们是否都连接到一个大字符串中,你可以使用:

代码语言:javascript
复制
var allTextAsString = document.documentElement.textContent || document.documentElement.innerText;

...with第一项是DOM3标准方法。但是请注意,innerText似乎在支持它的实现(至少IE和Chrome)中排除了脚本或样式标签内容,而textContent则包含它们(在Firefox和Chrome中)。

票数 4
EN

Stack Overflow用户

发布于 2019-03-09 11:16:52

这里有一个更惯用并且(希望)更容易理解的替代方法。

代码语言:javascript
复制
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
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2579666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档