getElementsByTagName() 相当于 textNodes

2023-12-02

有什么办法可以得到全部的集合吗textNode文档中的对象?

getElementsByTagName()对于 Elements 来说效果很好,但是textNodes 不是元素。

Update:我意识到这可以通过遍历 DOM 来完成 - 正如下面许多人所建议的。我知道如何编写一个 DOM-walker 函数来查看文档中的每个节点。我希望有一些浏览器原生的方法来做到这一点。毕竟我能得到所有的东西有点奇怪<input>具有单个内置调用,但不是全部textNodes.


Update:

我已经概述了这 6 种方法中每种方法超过 1000 次运行的一些基本性能测试。getElementsByTagName是最快的,但它做得半途而废,因为它不选择所有元素,而只选择一种特定类型的标签(我认为p)并盲目地假设它的firstChild是一个文本元素。它可能有一点缺陷,但它是为了演示目的并将其性能与TreeWalker. 在 jsfiddle 上自己运行测试查看结果。

  1. 使用树行者
  2. 自定义迭代遍历
  3. 自定义递归遍历
  4. Xpath查询
  5. 查询选择器全部
  6. 按标签名称获取元素

让我们假设有一个方法可以让你获得所有Text原生节点。您仍然需要遍历每个结果文本节点并调用node.nodeValue像处理任何 DOM 节点一样获取实际文本。因此,性能问题不在于迭代文本节点,而在于迭代所有非文本节点并检查它们的类型。我认为(根据结果)TreeWalker执行速度与getElementsByTagName,如果不是更快的话(即使 getElementsByTagName 玩残障)。



Ran each test 1000 times.

Method                  Total ms        Average ms
--------------------------------------------------
document.TreeWalker          301            0.301
Iterative Traverser          769            0.769
Recursive Traverser         7352            7.352
XPath query                 1849            1.849
querySelectorAll            1725            1.725
getElementsByTagName         212            0.212
  

每种方法的来源:

树行者

function nativeTreeWalker() {
    var walker = document.createTreeWalker(
        document.body, 
        NodeFilter.SHOW_TEXT, 
        null, 
        false
    );

    var node;
    var textNodes = [];

    while(node = walker.nextNode()) {
        textNodes.push(node.nodeValue);
    }
}

递归树遍历

function customRecursiveTreeWalker() {
    var result = [];

    (function findTextNodes(current) {
        for(var i = 0; i < current.childNodes.length; i++) {
            var child = current.childNodes[i];
            if(child.nodeType == 3) {
                result.push(child.nodeValue);
            }
            else {
                findTextNodes(child);
            }
        }
    })(document.body);
}

迭代树遍历

function customIterativeTreeWalker() {
    var result = [];
    var root = document.body;

    var node = root.childNodes[0];
    while(node != null) {
        if(node.nodeType == 3) { /* Fixed a bug here. Thanks @theazureshadow */
            result.push(node.nodeValue);
        }

        if(node.hasChildNodes()) {
            node = node.firstChild;
        }
        else {
            while(node.nextSibling == null && node != root) {
                node = node.parentNode;
            }
            node = node.nextSibling;
        }
    }
}

查询选择器全部

function nativeSelector() {
    var elements = document.querySelectorAll("body, body *"); /* Fixed a bug here. Thanks @theazureshadow */
    var results = [];
    var child;
    for(var i = 0; i < elements.length; i++) {
        child = elements[i].childNodes[0];
        if(elements[i].hasChildNodes() && child.nodeType == 3) {
            results.push(child.nodeValue);
        }
    }
}

按标签名称获取元素(障碍)

function getElementsByTagName() {
    var elements = document.getElementsByTagName("p");
    var results = [];
    for(var i = 0; i < elements.length; i++) {
        results.push(elements[i].childNodes[0].nodeValue);
    }
}

XPath

function xpathSelector() {
    var xpathResult = document.evaluate(
        "//*/text()", 
        document, 
        null, 
        XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
        null
    );

    var results = [], res;
    while(res = xpathResult.iterateNext()) {
        results.push(res.nodeValue);  /* Fixed a bug here. Thanks @theazureshadow */
    }
}

另外,您可能会发现此讨论很有帮助 -http://bytes.com/topic/javascript/answers/153239-how-do-i-get-elements-text-node

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getElementsByTagName() 相当于 textNodes 的相关文章

随机推荐

  • 将 LINQ 表达式谓词从一种类型更改为另一种类型

    我有两个不相关的课程 一种作为 API 公开 另一种由 3rd 方 API 在内部使用 Entity 从我们的 API 公开 而 EntityProvider 来自第 3 方程序集 class Entity public A get set
  • stringstream 到底做了什么?

    我从昨天开始尝试学习 C 我正在使用这个文档 http www cplusplus com files tutorial pdf 第 32 页 我在文档中找到了一段代码并运行了它 我尝试输入价格为 5 5 卢比 数量为整数 但输出为 0 我
  • Android - 如何使标题(TextView)在工具栏中居中?

    在我的工具栏左侧有一个徽标 我想将 TextView 放在同一个工具栏中作为我的标题 由于某种原因 标题没有居中 而是位于右侧 这是我的尝试
  • 使用 Perl / AWK 将两连续行合并为一行

    我有如下数据 abcd join abcd efgh join efgh 我想将两个连续的对连接成一行 结果 abcd join abcd efgh join efgh 我怎样才能在 Perl AWK 中做到这一点 sed N s n in
  • Crystal Report 可重新分发用于 Windows Server 2008? - 尝试加载 Crystal Reports 运行时时发生错误

    首先 谢谢大家 我需要什么才能在 Windows Server 2008 上获取工作 Crystal Report 或者我如何在 Windows Server 2008 上运行的网站 框架 3 5 4 0 上获取工作 rpt 文件 由代码加
  • .htaccess 将子域重定向到域

    我有一个子域http sub domain com 我希望来自该子域的所有链接都重定向到目标域 与 www 非 www 以及重定向路径 重定向 www http www sub domain com 非万维网 http sub domain
  • 电子邮件中支持 JavaScript 吗?

    电子邮件中支持 JavaScript 吗 http en wikipedia org wiki Comparison of e mail clients 老客户 例如 Lotus Notes Mozilla Thunderbird Outl
  • Visual Studio 2008 中的“文件另存为”对话框问题

    我正在通过 Visual Studio 2008 进行编程 我更改了 html 页面并使用 Ctrl S 保存它 然后在浏览器上按 Ctrl F5 进行测试 我的问题是 当我在刷新浏览器后将文件保存在 VS 中时 会出现 文件另存为 对话框
  • 使用php在浏览器中显示.msg文件

    我已在 php 应用程序中附加了 Outlook 消息文件 我将该文件存储在 SQL Server 数据库中 现在我想从浏览器打开并显示它 我尝试了这段代码 if ext msg header ContentType application
  • 如何使用 jQuery 获取整个页面的 HTML?

    I used document html 但这引发了错误 有没有办法获得一切 你可以尝试 html html 如果您还想捕获 html 标签 您可以将它们连接到 html 如下所示 function getPageHTML return h
  • pandas 如何在时间序列数据上“get_dummies”

    如果我有一些时间序列数据 弥补一些 import numpy as np import pandas as pd np random seed 11 rows cols 50000 2 data np random rand rows co
  • 使用 segue 设置详细视图控制器

    背景 我有一个自定义 UIViewController 类 我在其中使用自定义注释填充 MKMapView 当用户选择注释时 会显示有关该注释的详细信息 并且还会显示一个按钮 供用户选择并调出另一个 UIViewController 其中包
  • 重播非循环 gif 图像

    我有一个非循环 gif 我将其用作两个 JLabel 的 ImageIcon 但不同时使用 我的问题是 当我将第二个 JLabel 的图标设置为 gif 时 动画已经播放过 因此它只显示最后一帧 您知道当 gif 设置为第二个 JLabel
  • VBA 中的哨兵对象

    我在网络上和我自己的项目中普遍看到具有以下模式的代码 Sub Func Application EnableEvents False some code Application EnableEvents True End Sub 自从有生以
  • 我自己的驱动程序是否需要 Windows 7 x64 中的数字签名

    我已经创建了驱动程序来在 Windows 7 x64 上挂接 ssdt 我怀疑是否需要对驱动程序进行数字签名才能在 x64 上以内核模式安装 否则我只需要 Windows 驱动套件即可安装它 除了 Windows Driver Kit WD
  • 获取维度长度,C# 数组

    int arr new int 2 5 var rows arr var cols arr Assert Equals 3 rows Assert Equals 6 cols 您可以使用GetLength some dimension st
  • 用于验证 IPv4 和 IPv6 地址(无主机名)的 JavaScript 正则表达式

    请建议一个可以验证的 JS 正则表达式 IPv4地址 IPv6地址 该正则表达式应该只验证地址而不验证主机名 我有完全相同的需要 所以我改编了正则表达式丹尼尔的精彩回答 这是我能找到的最准确的 不验证主机名 这里是 var expressi
  • Mongodb 带条件聚合查找

    我有一个名为article category其中存储所有article id属于以下类别category id像这样的数据格式 集合 1 article category article id 2015110920343902 all ca
  • Opencv cv::waitKey() 返回值

    我正在 Ubuntu 14 上调试一些使用 OpenCV 的 C 代码 已知该代码可以在 Ubuntu 12 上运行 也可能与其他 OpenCV 库构建一起运行 之前是什么 int key pressed waitKey 0 cout lt
  • getElementsByTagName() 相当于 textNodes

    有什么办法可以得到全部的集合吗textNode文档中的对象 getElementsByTagName 对于 Elements 来说效果很好 但是textNodes 不是元素 Update 我意识到这可以通过遍历 DOM 来完成 正如下面许多