使用 javascript 获取 DOM 树

2024-03-02

我正在开发一个小脚本分析 DOMHTML 页面和在屏幕上写下节点树.

这是一个简单的函数,称为递归地获取所有节点及其子节点。每个节点的信息存储在一个数组中(自定义对象).

我已经得到了所有节点在 DOM 中,但不是如何在树上画画通过嵌套列表。

###JSFIDLE###https://jsfiddle.net/06krpdyh/ https://jsfiddle.net/06krpdyh/

###HTML####

<html>
    <head>
        <title>Formulario para validar</title>
        <script type="text/javascript" src="actividad_1.js">Texto script</script>
    </head>
    
    <body>
        <p>Primer texto que se visualiza en la Pagina</p>
        <div>Esto es un div</div>
        <div>Otro div que me encuentro</div>
        <p>Hay muchos parrafos</p>
        <ul>
            <li>Lista 1</li>
            <li>Lista 2</li>
            <li>Lista 3</li>
        </ul>
        <button type="button" id="muestra_abol">Muestra Arbol DOM</button>
    </body>
</html>

###JS###

// Ejecuta el script una vez se ha cargado toda la página, para evitar que el BODY sea NULL.
window.onload = function(){
    
    // Evento de teclado al hacer click sobre el boton que muestra el arbol.
    document.getElementById("muestra_abol").addEventListener("click", function(){
        muestraArbol();
    });
    
    // Declara el array que contendrá los objetos con la información de los nodos.
    var nodeTree = [];
    
    // Recoge el nodo raíz del DOM.
    var obj_html = document.documentElement;
    
    // Llama a la función que genera el árbol de nodos de la página.
    getNodeTree(obj_html);
    console.log(nodeTree);
    
    // Función que recorre la página descubriendo todo el árbol de nodos.
    function getNodeTree(node)
    {
        // Comprueba si el nodo tiene hijos.
        if (node.hasChildNodes())
        {
            // Recupera la información del nodo.
            var treeSize = nodeInfo(node);
            
            // Calcula el índice del nodo actual.
            var treeIndex = treeSize - 1;
                        
            // Recorre los hijos del nodo.
            for (var j = 0; j < node.childNodes.length; j++)
            {
                // Comprueba, de forma recursiva, los hijos del nodo.
                getNodeTree(node.childNodes[j]);
            }
        }
        else
        {
            return false;
        }
    }
    
    // Función que devuelve la información de un nodo.
    function nodeInfo(node,)
    {
        // Declara la variable que contendrá la información.
        var data = {
            node: node.nodeName,
            parent: node.parentNode.nodeName,
            childs: [],
            content: (typeof node.text === 'undefined'? "" : node.text)
        }
        var i = nodeTree.push(data); 
        return i;
    }
    
    // Función que devuelve los datos de los elementos hijos de un nodo.
    function muestraArbol()
    {
        var txt = "";
        
        // Comprueba si existen nodos.
        if (nodeTree.length > 0)
        {
            // Recorre los nodos.
            for (var i = 0; i < nodeTree.length; i++)
            {   
                txt += "<ul><li>Nodo: " + nodeTree[i].node + "</li>";
                txt += "<li> Padre: " + nodeTree[i].parent + "</li>";
                txt += "<li>Contenido: " + nodeTree[i].content + "</li>";
                txt += "</ul>";
            }
            document.write(txt);
        }
        else
        {
            document.write("<h1>No existen nodos en el DOM.</h1>");
        }
    }   
};

有没有人想出如何绘制嵌套树来浏览您区分的父节点和子节点?


你有一个递归 DOMreader,但你还需要一个递归输出器。当您需要多级对象(树)时,您还要处理一维数组。

我们将从重构开始getNodeTree。代替adding到全局数组(nodeTree在你的代码中),让我们拥有它return a tree:

function getNodeTree (node) {
    if (node.hasChildNodes()) {
        var children = [];
        for (var j = 0; j < node.childNodes.length; j++) {
            children.push(getNodeTree(node.childNodes[j]));
        }

        return {
            nodeName: node.nodeName,
            parentName: node.parentNode.nodeName,
            children: children,
            content: node.innerText || "",
        };
    }

    return false;
}

同样适用于muestraArbol(对于我们只会说一种语言的朋友来说,这意味着“显示树”):我们将让它递归地工作并返回一个包含嵌套列表的字符串:

function muestraArbol (node) {
    if (!node) return "";

    var txt = "";

    if (node.children.length > 0) {
        txt += "<ul><li>Nodo: " + node.nodeName + "</li>";
        txt += "<li> Padre: " + node.parentName + "</li>";
        txt += "<li>Contenido: " + node.content + "</li>";
        for (var i = 0; i < node.children.length; i++)
            if (node.children[i])
                txt += "<li> Hijos: " + muestraArbol(node.children[i]) + "</li>";
        txt += "</ul>";
    }

    return txt;
}

最后,如果我们将其放在一个片段中:

var nodeTree = getNodeTree(document.documentElement);
console.log(nodeTree);

function getNodeTree(node) {
    if (node.hasChildNodes()) {
        var children = [];
        for (var j = 0; j < node.childNodes.length; j++) {
            children.push(getNodeTree(node.childNodes[j]));
        }

        return {
            nodeName: node.nodeName,
            parentName: node.parentNode.nodeName,
            children: children,
            content: node.innerText || "",
        };
    }

    return false;
}

function muestraArbol(node) {
	if (!node) return "";
    
    var txt = "";
	
    if (node.children.length > 0) {
        txt += "<ul><li>Nodo: " + node.nodeName + "</li>";
        txt += "<li> Padre: " + node.parentName + "</li>";
        txt += "<li>Contenido: " + node.content + "</li>";
        for (var i = 0; i < node.children.length; i++)
        	if (node.children[i])
            	txt += "<li> Hijos: " + muestraArbol(node.children[i]) + "</li>";
        txt += "</ul>";
    }

    return txt;
}


document.getElementById("muestra_abol").addEventListener("click", function() {
    document.getElementById("result").innerHTML = muestraArbol(nodeTree);
});
<title>Formulario para validar</title>

<body>
    <p>Primer texto que se visualiza en la Pagina</p>
    <div>Esto es un div</div>
    <div>Otro div que me encuentro</div>
    <p>Hay muchos parrafos</p>
    <ul>
        <li>Lista 1</li>
        <li>Lista 2</li>
        <li>Lista 3</li>
    </ul>
    <button type="button" id="muestra_abol">Muestra Arbol DOM</button>
    <div id="result"></div>
</body>

最后:我很抱歉,我的西班牙语 JavaScript 阅读能力还没有达到巅峰。 :)

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

使用 javascript 获取 DOM 树 的相关文章

  • chai-http/superagent : 设置多部分表单字段的 Content-Type

    在集成测试中上传文件如下 chai request server instance post profile photo 0 set Access Token accessToken set API Key testConfig apiKe
  • JavaScript 原型继承和 html canvas

    我是一名 Ruby 开发人员 最终决定认真学习 JavaScript 所以我买了一些书 开始深入研究 但当我试图理解原型继承时 我很快就陷入了困境 这本书的例子之一如下 给定一个 Shape 其原型有一个绘制方法 以及两个子形状 一个 Tr
  • AngularJS 和 Apiary.IO - 无法读取任何响应标头?

    我使用 Apiary io 模拟我的 API 但不知怎的 我无法使用 angularJS 从响应对象中读取任何标头 我确信我至少通过检查 firebug 正确设置了 Content Type application json Angular
  • Puppeteer 的行为与开发者控制台不同

    我正在尝试使用 Puppeteer 提取此页面的标题 https www nordstrom com s zella high waist studio pocket 7 8 leggings 5460106 https www nords
  • 移动浏览器上的 Javascript / jQuery 页面更改事件

    我正在设计一个移动网站 同时考虑所有领先的浏览器 Safari Chrome Dolphin Opera 我想显示一个 正在加载 元素页面导航 更改 请求新页面 我无法在锚标签上使用点击事件 因为有很多锚标签存在preventDefault
  • Firebase 模拟器无法促进/运行新功能

    我有三个云功能 其中两个已部署到我的 firebase 项目中 其中一个是我刚刚添加的 我希望在部署之前在本地测试新的功能 但是当我尝试使用它时却无法使用 并且只有两个已部署的功能可用 Firebase 模拟器在端口上运行良好5001 像往
  • ELEMENT.style.color 在 IE 中不起作用

    在一个小型 Web 应用程序中 我使用 JavaScript 在文本框中设置一些文本及其颜色 在下面的片段中 el 是我的对象 这段代码在 Firefox Opera 和 Safari 下产生了正确的效果 但在 IE 下却没有这样的运气 我
  • webrtc - 获取网络摄像头的宽高比

    我正在尝试学习如何开发 webRTC 应用程序 我想知道是否可以获得相机的宽高比 我不知道它是否有帮助 但我正在使用 webrtc io 但是 if更好 我可以停止使用它 From MDN https developer mozilla o
  • 确定用户是否在shadow dom之外单击

    我正在尝试实现一个下拉菜单 您可以单击外部将其关闭 下拉列表是自定义日期输入的一部分 并且封装在输入的影子 DOM 内 我想写一些类似的东西 window addEventListener mousedown function evt if
  • 如何在 .js 中的字符串中插入来自 ruby​​ 示例的变量[重复]

    这个问题在这里已经有答案了 在 ruby 中 您可以将变量插入到字符串中 如下所示 x sake puts I like x I like sake 例如 def what i like word I like word end 在 jav
  • 如何使用 QuerySelector 获得第二个匹配项?

    以下语句给出了该类的第一个元素titanic element document querySelector titanic 我如何检索具有相同类的第二个元素 Use document querySelectorAll https devel
  • 可拖动的非模态弹出窗口 Jquery Mobile

    我希望在 Jquery mobile 中有一个弹出窗口 它不会阻止用户与页面交互 并且 data dismissible false 即当页面的另一部分与页面的另一部分交互并保持可见时 弹出窗口不会消失 我已经尝试过这个 popupNew
  • 角度引导手风琴数据绑定问题

    我有 2 个相同型号的下拉菜单 一个位于手风琴内部 另一个位于外部 外部下拉菜单在 2 路数据绑定方面工作良好 但手风琴内部的下拉菜单似乎只有 1 路绑定 换句话说 在 UI 中选择并不会设置模型值 我找到了一个建议here https s
  • 有效地获取下拉列表中的选定选项(XHTML Select 元素)

    背景 使用 XHTML Select 元素的下拉列表中有大量选项 数十个 我需要使用 JavaScript 检索所选选项 Problem 目前我正在使用 jQuery selectedCSS 选择器并且它按预期工作 但这种方法效率不高 因为
  • ExpressJS - 提供通用 Nuxt 应用程序和 AngularJS SPA

    我有一个具有以下结构的博客项目 服务器 用 Node Express 编写 管理员 AngularJS SPA public AngularJS SPA 目前 管理部分和公共部分具有相同的域 但管理部分使用不同的子域 这允许我在 Expre
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • 使用 Lodash 循环 JavaScript 对象中的属性

    是否可以循环访问 JavaScript 对象中的属性 例如 我有一个 JavaScript 对象定义如下 myObject options property1 value 1 property2 value 2 属性将动态添加到该对象 有没
  • 谷歌浏览器不显示一个网站的alert()弹出窗口

    我正在开发一个 javascript 循环 该循环会随着循环的进行而提醒每个键值 为了加快速度 我选中了 阻止此页面创建其他对话框 框 通常这只会抑制一个例程的弹出窗口 但它们还没有回来 在 Google Chrome 中 alert 消息
  • 关于 Node.js Promise then 和 return?

    我对承诺感到困惑 I use 那么就答应没有返回像这样 new Promise resolve reject gt resolve 1 then v1 gt console log v1 new Promise resolve reject
  • 限制在三角形内

    我正在寻找一段通用代码 javascript 它可以与 jquery UI 一起使用来限制三角形内 div 的移动 拖动 与此类似 http stackoverflow com questions 8515900 how to constr

随机推荐

  • 使用 LINQ 对对象列表进行分组

    我有一个对象 public class Customer public int ID get set public string Name get set public int GroupID get set 我返回一个可能如下所示的列表
  • docker-compose 中不同 docker 服务之间的通信

    我刚刚开始使用 docker compose 目前正在努力解决不同服务之间的通信问题 我有2个服务 alice and bob 我希望它们能够互相发送 http 请求 据我了解 服务应该能够通过使用服务名作为主机名来相互访问 很遗憾 ali
  • jQuery 将类添加到单选框未删除

    我使用 jQuery 将一个类添加到单选框 如果它被选中 这工作正常 但在选择另一个单选框时它不会删除该类 我缺少什么 jQuery checkbox radio change function if this is checked thi
  • 在 Visual Studio 中调试期间评估表达式

    我习惯了 Jetbrains IDEA 和 Java 但现在我有一个 NET C 项目并使用 Visual Studio 2017 社区 如果我在 IDEA 中调试代码 当执行在断点处停止时 我始终可以使用 IDE 的 评估表达式 功能来运
  • 从给定的 x86 程序集编写 C 函数

    我正在尝试对这个神秘的函数进行逆向工程 该函数返回一个整数并接受一个结构节点作为参数 include mystery h int mystery struct e4 struct s 头文件是一个简单的结构体声明 struct my str
  • Qt 应用程序:模拟模态行为(启用/禁用用户输入)

    我目前正在开发一个应用程序 该应用程序启动显示附加对话框的单独进程 我试图实现的功能是模拟这些对话框的模式行为 更具体地说 我需要应用程序在对话框启动时停止处理所有输入 包括鼠标和键盘 并在对话框关闭时恢复 对话框保持在应用程序顶部并不是那
  • 不使用 ASP.Net Core 2 中的迁移命令 Update-Database 创建数据库

    我使用 WebAPI 创建了新的 ASP Net core 项目 使用下面的链接 jwt authentication with aspnet core 2 web api angular 5 net core identity and f
  • 使 Java 应用程序对用户不可见

    我正在尝试找出一种方法使 Java 应用程序对用户不可见 基本上只是想删除this http screensnapr com e atyZkF png lt Image 如何才能做到这一点 public class TransparentW
  • 有人可以解释 Spring web.xml 文件吗?

    我是 Java Enterprise 和 Spring 的新手 但我对标准 Java 有很强的掌握 我正在查看一个现有的网络应用程序项目 该项目使用 Tomcat Spring Hibernate 据我所知这是相当常见的 它还使用 DWR
  • 如何在下次按下时聚焦下一个输入(如果有)

    我实际上知道如何做到这一点 但我需要一种不同的方法 所以我有如下文本输入
  • 如何在 macOS 上将 swiftUI 视图导出为 PDF 文件

    我需要在 macOS big sur 上将 swifUIview 导出为 PDF 文件 这是我正在使用的功能 func exportPDF let testView TestView let hostingView NSHostingVie
  • Vulkan 内存对齐要求

    我正在为 Vulkan 设备内存实现一个简单的内存管理器 并希望确保我了解内存的对齐要求以及如何满足这些要求 因此 假设我使用 vkAllocateMemory 分配了一个内存 池 并希望将该池中的内存块子分配给各个资源 基于 VkMemo
  • 全局定义分析器 (ES)

    我需要 想要在全球范围内定义我的自定义分析器 因此我根据这个答案编辑了ES的配置文件 elasticsearch yml 我可以自定义 Elastic Search 以使用我自己的停用词列表吗 https stackoverflow com
  • 在 ag-grid 上使用正确的单元格格式导出到 Excel

    当我使用 ag grid 自己的将表导出到 Excel 时exportDataAsExcel 生成的 Excel 包含日期为General数据类型而不是Date 我用过这个 exportDataAsExcel processCellCall
  • 如何将散点图中的异常值更改为其他颜色

    If I have a scatter plot like this 我想知道是否有任何方法可以将明显的异常值 例如顶部的三个 更改为同一图中的其他颜色 首先 您需要找到 异常值 的标准 一旦你有了这个 你就可以掩盖图中那些不需要的点 在
  • 如何从 JavaScript 调用小程序中声明的方法

    我正在尝试做一个基本的Java小程序 https en wikipedia org wiki Java applet为他们打开客户计算机上的文件 我想通过 JavaScript 调用下面 Java 小程序中的 openFile 函数 imp
  • 有没有办法比较两个会员的排名?

    我有一个 Discord 机器人 我正在编写警告命令 但我需要一个代码来比较两个成员 角色 的排名 例 A人的地位高于B人 如果 B 人试图警告 A 人 机器人会说 你不能警告这个人 如果 A 人试图警告 B 人 机器人就会警告 B 人 怎
  • 找到图像上的特定点

    我正在尝试编写一个程序来解决难题 我的尝试与我用来测试的示例谜题效果很好 现在我正在尝试为一个真正的谜题制作一个 这个新拼图的拼图块实际上没有正确的形状 我设法将图像变成黑白 最后变成 1 和 0 的数组 其中 1 表示片段 0 表示背景
  • 解决 svn update 时的合并冲突

    我正在尝试学习 Eric Sink 的版本控制基础知识 http ericsink com vcbe vcbe usletter lo pdf http ericsink com vcbe vcbe usletter lo pdf 我现在在
  • 使用 javascript 获取 DOM 树

    我正在开发一个小脚本分析 DOMHTML 页面和在屏幕上写下节点树 这是一个简单的函数 称为递归地获取所有节点及其子节点 每个节点的信息存储在一个数组中 自定义对象 我已经得到了所有节点在 DOM 中 但不是如何在树上画画通过嵌套列表 JS