JavaScript-节点操作_<script>对节点的操作-程序员宅基地

技术标签: 前端  html  javascript  

目录

​ 

1. 节点概述

2. 节点层次

1)父级节点

2)子节点

下拉显示菜单案例

3)兄弟节点

4)创建节点

简单版发布留言案例

5) 删除节点

6)复制节点(克隆节点)

8)三种动态创建元素区别


 

1. 节点概述

网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点用node来表示。

HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。

一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值) 这三个基本属性。

  • 元素节点 nodeType:1
  • 属性节点 nodeType:2
  • 文本节点 nodeType:3(文本节点包括文字、空格、换行等)

2. 节点层次

利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系

1)父级节点

  • node.parentNode
  • 得到的是离元素最近的父级节点
  • 如果指定的节点没有父节点则返回null
<body>
    <div class="box">
       <span class="num">1</span>
    </div>

    <div class="container"></div>
    <script>
        var num = document.querySelector('.num');
        //node.parentNode:得到的是离元素最近的父级节点,没有则返回null
        console.log(num.parentNode);

        var container = document.querySelector('.container');
        console.log(container.parentNode);
    </script>
</body>

结果为:

 

2)子节点

  • parentNode.childNodes(标准):得到的节点包括元素节点、文本节点等
  • parentNode.children(非标准):是一个只读属性,返回所有的子元素节点
  • parentNode.firstChild:返回第一个子节点,找不到则返回null,包含所有的节点
  • parentNode.firstElementChild:返回第一个子节点,IE9以上才支持
  • parentNode.lastChild:返回最后一个子节点,找不到则返回null,包含所有的节点
  • parentNode.firstElementChild:返回最后一个子节点,IE9以上才支持
<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
    </ul>


    <script>
        var ul = document.querySelector('ul');
        var lis = ul.querySelector('li');
        //1.parentNode.childNodes(标准):得到的节点包括元素节点、文本节点等
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType);  //3,表示为文本节点
        console.log(ul.childNodes[1].nodeType);  //1,表示为元素节点
        //2.parentNode.children(非标准):是一个只读属性,返回所有的子元素节点
        console.log(ul.children);
        //3.parentNode.firstChild:返回第一个子节点,找不到则返回null,包含所有的节点
        console.log(ul.firstChild);
        //4.parentNode.firstElementChild:返回第一个子节点,IE9以上才支持
        console.log(ul.firstElementChild);
        //5.parentNode.lastChild:返回最后一个子节点,找不到则返回null,包含所有的节点
        console.log(ul.lastChild);
        //6.parentNode.firstElementChild:返回最后一个子节点,IE9以上才支持
        console.log(ul.lastElementChild);
    </script>
</body>

结果为:

 

下拉显示菜单案例

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style-type: none;
        }
        
        a {
            text-decoration: none;
            font-size: 14px;
        }
        
        .nav {
            margin: 100px;
        }
        
        .nav>li {
            position: relative;
            float: left;
            width: 80px;
            height: 41px;
            text-align: center;
        }
        
        .nav li a {
            display: block;
            width: 100%;
            height: 100%;
            line-height: 41px;
            color: #333;
        }
        
        .nav>li>a:hover {
            background-color: #eee;
        }
        
        .nav ul {
            display: none;
            position: absolute;
            top: 41px;
            left: 0;
            width: 100%;
            border-left: 1px solid #FECC5B;
            border-right: 1px solid #FECC5B;
        }
        
        .nav ul li {
            border-bottom: 1px solid #FECC5B;
        }
        
        .nav ul li a:hover {
            background-color: #FFF5DA;
        }
    </style>
</head>
<body>
    <ul class="nav">
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="#">私信</a>
                </li>
                <li>
                    <a href="#">评论</a>
                </li>
                <li>
                    <a href="#">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="#">私信</a>
                </li>
                <li>
                    <a href="#">评论</a>
                </li>
                <li>
                    <a href="#">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="#">私信</a>
                </li>
                <li>
                    <a href="#">评论</a>
                </li>
                <li>
                    <a href="#">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="#">私信</a>
                </li>
                <li>
                    <a href="#">评论</a>
                </li>
                <li>
                    <a href="#">@我</a>
                </li>
            </ul>
        </li>
    </ul>

    <script>
        //1.获取元素
        var nav = document.querySelector('.nav');
        //返回所有的子节点,只包括元素节点
        var lis = nav.children;
        //2.注册事件 处理程序
        for(var i = 0; i < lis.length; i++) {
            lis[i].onmouseover = function() {
                //ul有两个子孩子->a和ul,要使得鼠标经过时ul显示出来,所以应该设置第二个子孩子display
                this.children[1].style.display = 'block';
            }
            lis[i].onmouseout = function() {
                this.children[1].style.display = 'none';
            }
        }
    </script>
</body>

结果为:当鼠标经过时,下拉的菜单就会显示;反之则隐藏起来

 

3)兄弟节点

  • node.nextSibling:返回当前元素的下一个兄弟节点,找不到则返回null,包含所有的节点
  • node.previousSibling:返回当前元素的上一个兄弟节点,找不到则返回null,也是包含所有的节点
  • node.nextElementSibling:返回当前元素下一个兄弟元素节点,找不到则返回null,IE9以上才支持
  • node.previousElementSibling:返回当前元素上一个兄弟节点,找不到则返回null,IE9以上才支持
<body>
    <div>1</div>
    <span>2</span>
    <script>
        var div = document.querySelector('div');
        //1.nextSibling:返回当前元素的下一个兄弟节点,包含所有节点
        console.log(div.nextSibling);
        //2.previousSibling:返回当前元素的上一个兄弟节点,包含所有节点
        console.log(div.previousSibling);
        //3.nextElementSibling:返回当前元素的下一个兄弟节点,兼容性问题(IE9以上才支持)
        console.log(div.nextElementSibling);
        //4.previousElementSibling:返回当前元素的上一个兄弟节点,兼容性问题(IE9以上才支持)
        console.log(div.previousElementSibling);
    </script>
</body>

结果为:

 

4)创建节点

  • document.createElement('tagName'):创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据需求动态生成的,所谓也称为动态创建元素节点
  • node.appendChild():将一个节点添加到指定父节点的子节点列表末尾,类似于CSS的after元素         父节点.appendChild(子节点);->在后面追加元素
  • node.insertBefore(child, 指定元素):将一个节点添加到父节点的指定子节点前面,类似于CSS里面的子元素。
<body>
    <ul>
        <li>1</li>
    </ul>
    <script>
        var ul = document.querySelector('ul');
        //1.创建节点元素
        var li = document.createElement('li');
        //2.添加节点:parent.appendChild(child) 在末尾追加元素
        ul.appendChild(li);
        //3.添加节点:node.insertBefore(child, 指定元素)  在指定父节点的子节点前面追加元素
        var li1 = document.createElement('li');
        ul.insertBefore(li1, ul.children[0]);
    </script>
</body>

结果为:

简单版发布留言案例

    <style>
        textarea {
            border: 1px solid #000;
        }
        li {
            background-color: pink;
        }
    </style>
</head>
<body>
    <textarea cols="30" rows="10"></textarea>
    <button>发布</button>
    <ul>

    </ul>
    <script>
        //1.获取元素
        var text = document.querySelector('textarea');
        var btn = document.querySelector('button');
        var ul = document.querySelector('ul');
        //2.注册事件 处理程序
        btn.onclick = function() {
            if (text.value == '') {
                alert('您没有输入留言');
                return false;
            }
            else {
                //创建元素
                var li = document.createElement('li');
                //添加元素
                //将输入的内容赋值给li
                li.innerHTML = text.value;
                // ul.appendChild(li);
                ul.insertBefore(li, ul.children[0]);
            }
        }
    </script>
</body>

结果为:

 

5) 删除节点

  • node.removeChild(child):从DOM中删除一个子节点,返回删除的节点
<body>
    <button>删除</button>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        //1.获取对象
        var btn = document.querySelector('button');
        var ul = document.querySelector('ul');
        //2.注册事件 处理程序
        btn.onclick = function() {
            if (ul.children.length == 0) {
                this.disabled = true;
            }
            else {
                ul.removeChild(ul.children[0]);
            }
        }
    </script>
</body>

结果为:

 

6)复制节点(克隆节点)

node.cloneNode():返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点

  • 如果括号参数为空或者false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点内容
  • 如果括号参数true,则是深拷贝,即既克隆复制节点本身,又克隆里面的子节点内容
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        //获取对象
        var ul = document.querySelector('ul');
        //1.cloneNode():参数为空或者是false,浅拷贝,只复制节点不复制文本内容
        var li = ul.children[0].cloneNode();
        //2.cloneNode(true):参数为true,深拷贝,只复制节点同时复制文本内容
        var li1 = ul.children[1].cloneNode(true);
        ul.appendChild(li);
        ul.appendChild(li1);
    </script>
</body>

结果为:

 

8)三种动态创建元素区别

  • document.write():直接将内容写入页面的内容流,但是文档流执行完毕,它会导致页面全部重绘
  • element.innerHTML:将内容写入某个DOM节点,不会导致页面全部重绘,创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
  • document.createElement():创建多个元素效率稍低一点,但是结构更清晰
<body>
    <button>btn</button>
    <span>1</span>
    
    <script>
        var btn = document.querySelector('button');
        btn.onclick = function() {
            //直接将内容写入页面的内容流,但是文档流执行完毕,它会导致页面全部重绘->button和span不在页面上
            document.write('<div>123</div>');
        }
    </script>
</body>

结果为:

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52822043/article/details/123655477

智能推荐

Orange3入门-程序员宅基地

文章浏览阅读1.1k次,点赞10次,收藏26次。Orange3 是一个开源的机器学习和数据可视化桌面软件。它允许你通过简单的拖放技术来创建数据分析工作流程。Orange3 提供了一个友好的图形化用户界面,非常适合初学者使用,同时也为熟练的数据科学家提供了数据探索和建模的强大功能。在 Orange3 中,数据分析过程被设计为工作流程,它顺畅地转换并可视化数据,使用机器学习算法进行建模,并创建了可视化的数据呈现。每个流程都是一系列称为 "widget" 的模块,它们通过渠道连接在一起进行通信。_orange3

JAVA常用加密方式介绍及使用汇总(全集)-程序员宅基地

文章浏览阅读5.5k次,点赞5次,收藏28次。引文:如果开发者需要保存密码(比如网站用户的密码),要考虑如何保护这些密码数据,网站用户密码的泄露是一件非常严重的事情,容易引起用户恐慌,所以在安全方面是重中之重,直接将密码以明文写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function),也就是摘要加密。通过哈希函数,我们就可以将密码的哈希值存储进数据库。

用于理解vtkPolyData和vtkCellArray的一段代码_vtk隐藏单元-程序员宅基地

文章浏览阅读3.5k次。#include "vtkActor.h"#include "vtkCamera.h"#include "vtkCellArray.h"#include "vtkFloatArray.h"#include "vtkPointData.h"#include "vtkPoints.h"#include "vtkPolyData.h"#include "vtkPolyDataMapper._vtk隐藏单元

【.NET Standard依赖问题】错误    CS0012    类型“Object”在未引用的程序集中定义。必须添加对程序集“netstandard, Version=2.0.0.0,-程序员宅基地

文章浏览阅读9.9k次,点赞9次,收藏6次。【背景】在vs2019上运行winform应用程序,弹出来如下提示:错误 CS0012 类型“Object”在未引用的程序集中定义。必须添加对程序集“netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”的引用.............【解决办法】右键当前项目→属性→应用程序..._类型“object”在未引用的程序集中定义。必须添加对程序集“netstandard, version

操作系统学习 介绍一下fork是什么? 1操作系统提供的用户界面有几种?分别是什么?2,举出人类社会中采用的几个抽象示例,并与操作系统提供的抽象进行对比。3,有人认为,内核态程序可以访问任_操作系统fork-程序员宅基地

文章浏览阅读556次。介绍一下fork是什么? 1操作系统提供的用户界面有几种?分别是什么?2,举出人类社会中采用的几个抽象示例,并与操作系统提供的抽象进行对比。3,有人认为,内核态程序可以访问任何资源的权限对系统安全造成严重成卧,你怎么看?4,处理器的状态设置需要在何种态势下完成?为什么?5,处理器从用户态转为内核态时面临的关键问题是什么?如何解决?_操作系统fork

go jwt 生成token报错 :key is of invalid type-程序员宅基地

文章浏览阅读2.5k次,点赞6次,收藏4次。jwt.SigningMethodES256 两种类型 *SigningMethodECDSA 和 *SigningMethodHMACjwts := jwt.NewWithClaims(jwt.SigningMethodES256, c) // SigningMethodES256 *SigningMethodECDSA 此类型会报错: key is of invalid type`jwts := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // S

随便推点

计算机组成原理期末考试题库(超级多的那种)_云南大学滇池学院2024计算机组成原理期末考试-程序员宅基地

文章浏览阅读2.9w次,点赞160次,收藏1.7k次。废话不多说,不管是应对期末考试还是考研基础复习,刷题是必不可少的!!! 大家冲就完了!!!!记得给 罡罡同学点关注哦! 后期还会更新其他题库的呢!!!打赏一点钱,帮我买瓶肥宅快乐水,继续创作,谢大家!计算机组成原理试题库——题目及答案计算机组成原理试卷1一、选择题(共20分,每题1分)1.CPU响应中断的时间是______。A.中断源提出请求;B.取指周期结束;C.执行周期结束;D.间址周期结束。2.下列说法中______是正确的。A.加法指令的执行周期一定要访存;B.加法指令_云南大学滇池学院2024计算机组成原理期末考试

IPC网络高清摄像机基础知识6(CCD 与 CMOS传感器)_ipc shutter-程序员宅基地

文章浏览阅读1.2w次。需求说明:IPC高清摄像机知识储备内容 :第一部分 从四大方面分析CCD传感器与CMOS传感器的优劣 第二部分 解析数码相机的技术参数整理来自:时间的诗第一部分 从四大方面分析CCD传感器与CMOS传感器的优劣来自:http://www.elecfans.com/yuanqijian/sensor/20_ipc shutter

给NAS-Tool添加拓展功能,自定义刷流、索引规则_nastool安装第三方插件-程序员宅基地

文章浏览阅读1.5k次,点赞7次,收藏8次。给NAS-Tool添加拓展功能,自定义刷流、索引规则_nastool安装第三方插件

【 Arduino 和水流量传感器测量水流量和体积】_arduino 流量计-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏14次。Arduino 和水流量传感器测量水流量和体积_arduino 流量计

F02_HttpRunner关联:提取固定名称方式的 SessionID-程序员宅基地

文章浏览阅读229次。F02_HttpRunner关联:提取固定名称方式的 SessionID接着上一章项目案例分析,SessionID 存在于临时 cookie 中,HttpRunner 可以从cookie中直接提取需要的值,而且要求 cookie 的键名称必须是固定不变的,提取方式为:extract: - 变量名称: cookies.键名称为了验证返回响应内容的正...

Echarts绘制柱状图 报错“Initialize failed: invalid dom.”_echarts 中 打开弹框中的柱状图rror: initialize failed: invali-程序员宅基地

文章浏览阅读1.5k次。原因:echarts在创建图表的时候需要一个div作为dom容器,再将由echarts.init方法初始化一个 echarts 实例初始化的map挂载到dom树中。<div id="map" v-if="showType != 'list'"></div>而此错误的意思是在该element创建之前,就去getElement获取该元素。解决:本以为是生命周期的问题,改了好久,后来发现是该dom容器上挂了一个v-if,而v-if是由后来调后端接口获取的数据来控._echarts 中 打开弹框中的柱状图rror: initialize failed: invalid dom

推荐文章

热门文章

相关标签