【JavaScript】获取和操作 DOM 节点

news2024/9/23 13:22:00

文章目录

  • 【JavaScript】获取和操作 DOM 节点
    • 一. DOM节点分类
    • 二. 获取节点
      • (1) 获取元素节点
        • 1. 非常规元素节点
        • 2. 常规元素节点
      • (2) 获取节点的方式
    • 三. 操作节点
      • (1) 创建节点
      • (2) 插入节点
      • (3) 删除节点
      • (4) 替换节点
      • (5) 克隆节点
      • (6) 节点属性
    • 四. 案例:微博发布

【JavaScript】获取和操作 DOM 节点

一. DOM节点分类

DOM 节点描述
元素节点页面上的每一个标签
属性节点书写在标签上的属性
文本节点书写的文本内容(包含空格和回车)
注释节点书写的注释(包含空格和回车)

实例

<div class="box">
    hello
    <p>你好</p>
    <!-- 注释 -->
    <p>p2</p>
    world
</div>

问:div标签里面一共有多少个子节点,分别是什么?

  1. 文本节点:一个回车 + 4个空格 + hello + 一个回车+ 4个空格
  2. 元素节点:<p>你好</p>
  3. 文本节点:一个回车 + 4个空格
  4. 注释节点:<!-- 注释 -->
  5. 文本节点:一个回车 + 4个空格
  6. 元素节点:<p>p2</p>
  7. 文本节点:一个回车 + 4个空格 + world + 一个回车

二. 获取节点

(1) 获取元素节点

1. 非常规元素节点

  • html:document.documentElement
  • body:document.body
  • head:document.head

2. 常规元素节点

  • document.getElementById
  • document.getElementsByClassName
  • document.getElementsByTagName
  • document.querySelector
  • document.querySelectorAll

(2) 获取节点的方式

属性或方法描述
节点.childNodes获取该节点所有的子节点
节点.children获取该节点的所有子元素节点
节点.firstChild获取该节点的第一个子节点
节点.firstElementChild获取该节点的第一个子元素节点
节点.lastChild获取该节点的最后一个子节点
节点.lastElementChild获取该节点的最后一个子元素节点
节点.previousSibling获取该节点的上一个兄弟节点
节点.previousElementSibling获取该节点的上一个兄弟元素节点
节点.nextSibling获取该节点的下一个兄弟节点
节点.nextElementSibling获取该节点的下一个兄弟元素节点
节点.parentNode获取该节点的父节点
节点.parentElement获取该节点的父元素节点
节点.attributes获取该元素的所有属性节点
<p>p1</p>
<div class="box">
    ni
    <p>p2</p>
    <!-- 注释1 -->
    <!-- 注释2 -->
    <p>p3</p>
    hao
</div>
<p>p4</p>

实例

var div = document.querySelector("div");
// 1. childNodes
console.log(div.childNodes); // [text, p, text, comment, text, comment, text, p, text]伪数组

// 2. children
console.log(div.children); // [p, p]

// 3. firstChild
console.log(div.firstChild); // " ni "

// 4. firstElementChild
console.log(div.firstElementChild); // <p>p2</p>

// 5. lastChild
console.log(div.lastChild); // " hao "

// 6. lastElementChild
console.log(div.lastElementChild); // <p>p3</p>

// 7. previousSibling
console.log(div.previousSibling); // #text

// 8. previousElementSibling
console.log(div.previousElementSibling); // <p>p1</p>

// 9. nextSibling
console.log(div.nextSibling); // #text

// 10. nextElementSibling
console.log(div.nextElementSibling); // <p>p4</p>

// 11. parentNode
console.log(div.parentNode); // <body>...</body>

// 12. parentElement
console.log(div.parentElement); // <body>...</body>

// 13. attributes
console.log(div.attributes); // NamedNodeMap {0: class, class: class, length: 1}

三. 操作节点

(1) 创建节点

只是创建不会显示到页面上,要显示到页面上得使用下面的插入节点。

  1. 创建元素节点

    语法

    document.createElement('标签名')
    

    返回值:创建好的元素节点。

    var div = document.createElement("div");    
    console.log(div); // <div></div>
    
  2. 创建文本节点

    语法

    document.createTextNode("文本内容")
    

    返回值:创建好的文本节点。

    var text = document.createTextNode("好的");
    console.log(text); // "好的"
    

(2) 插入节点

  1. appendChild()

    语法

    父节点.appendChild(子节点)
    

    作用:把子节点插入到父节点中,并且是在最后面的位置插入

    <div class="box">
        <span class="a">1</span>
    </div>
    <!-- 分割线 -->
    var box = document.querySelector(".box");
    var div = document.createElement("div");
    box.appendChild(div);
    /*
        <div class="box">
        	<span class="a">1</span>
        	<div></div>
        </div>
    */
    
  2. insertBefore()

    语法

    父节点.insertBefore(子节点, 谁的前面)
    

    作用:把子节点插入到父节点中,并且放到指定一个节点的前面。

    注意:第二个参数必须写,但是第二个参数有没有可以忽略。

    <div class="box">
        <span class="a">1</span>
    </div>
    <!-- 分割线 -->      
    var box = document.querySelector(".box");
    var span1 = document.querySelector(".a");
    var span2 = document.createElement("span");
    box.insertBefore(span2, span1);
    /*
        <div class="box">
            <span></span>
        	<span class="a">1</span>
        </div>
    */
    

(3) 删除节点

  1. removeChild()

    语法

    父节点.removeChild(子节点)
    

    作用:将子节点从父节点中删除。

    <div class="box">
        <p>1</p>
        <p>2</p>
        <p>3</p>
    </div>
    <h1>标题</h1>
    <!-- 分割线 -->  
    var div = document.querySelector(".box");
    var p1 = document.querySelector("p:first-child")
    div.removeChild(p1); 
    /*
        <div class="box">
            <p>2</p>
            <p>3</p>
        </div>
    */ 
    
  2. remove()

    语法:节点.remove()

    作用:将该节点删除

    <div class="box">
        <p>1</p>
        <p>2</p>
        <p>3</p>
    </div>
    <!-- 分割线 -->  
    var div = document.querySelector(".box");
    div.remove(); // <h1>标题</h1>
    

    :若删除的节点中有子节点会一并删除。

(4) 替换节点

replaceChild()

语法

父节点.replaceChild(换上节点, 换下节点)

作用:在父节点中,使用换上节点替换换下节点

<div>
    <h1>你好</h1>
</div>
<button>点击替换</button>
<!-- 分割线 -->  
<script>
    var div = document.querySelector("div");
    var h1 = document.querySelector("h1");
    var btn = document.querySelector("button");

    var h2 = document.createElement("h2");
    h2.innerHTML = "好的";

    btn.onclick = function () {
        // 父节点.replaceChild(换上节点, 换下节点)
        div.replaceChild(h2, h1);
        /*
        	<div>
    			<h2>好的</h2>
            </div>
        */
    };
</script>

(5) 克隆节点

cloneNode()

语法

节点.cloneNode(参数)

参数

  • true 克隆后代节点
  • false 默认 不克隆后代节点

作用:把该节点复制一份一模一样的

<div class="box" style="width: 300px; height: 300px; background-color: pink">
    <p style="width: 100px; height: 100px; background-color: yellow">
        <span style="background-color: green">spanspan</span>
    </p>
</div>
<button>复制</button>
<script>
    var btn = document.querySelector("button");
    var box = document.querySelector(".box");
    btn.onclick = function () {
        var res = box.cloneNode(true);
        document.body.appendChild(res);
    };
</script>

(6) 节点属性

节点类型(nodeType)

节点节点类型
元素节点1
属性节点2
文本节点3
注释节点8

节点名称(nodeName)

节点节点名称
元素节点大写标签名
属性节点属性名
文本节点#text
注释节点#comment

节点内容(nodeValue)

节点节点内容
元素节点null
属性节点属性值
文本节点文本内容
注释节点注释内容

四. 案例:微博发布

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            textarea {
                width: 400px;
                height: 200px;
                margin: 30px;
            }
            * {
                margin: 0;
                padding: 0;
            }
            ul {
                margin: 30px;
            }
            li {
                list-style: none;
                border: 1px solid #000;
                padding: 10px;
                width: 400px;
                height: 50px;
                position: relative;
            }
            .btnStyle {
                width: 40px;
                height: 30px;
                position: absolute;
                top: 10px;
                right: 10px;
            }
        </style>
    </head>
    <body>
        <textarea name="" id="" cols="30" rows="10"></textarea>
        <button>发布</button>
        <ul></ul>
        <script>
            // 获取元素
            var ul = document.querySelector("ul");
            var textarea = document.querySelector("textarea");
            var btnOrigin = document.querySelector("button");
            btnOrigin.onclick = function() {
                // 获取文本域内容
                var text = textarea.value;
                // 判断文本域的内容是否为空
                if (text === '') {
                    alert('请输入内容');
                    return;
                }
                // 创建li标签
                var li = document.createElement("li");
                // 创建删除按钮
                var btn = document.createElement("button");
                // 将文本域内容放入li中
                li.innerText = `${text}`;
                // 在页面中ul里最前面显示li标签
                ul.insertBefore(li, ul.firstElementChild);
                // li渲染后清空文本域中的内容
                textarea.value = "";
                // 在创建的li标签中添加按钮
                li.appendChild(btn, li);
                // 给创建的按钮添加类名
                btn.classList.add("btnStyle");
                // 给创建的按钮添加文本
                btn.innerText = "x";
                // var btn1 = document.querySelector(".btnStyle");
                btn.onclick = function() {
                    if (confirm("你确定要删除吗?")) {
                        li.remove();
                    }
                }
            }
        </script>
    </body>
</html>

效果图

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用云开发的垃圾分类、垃圾识别、答题的微信小程序源码+部署教程,文字识别垃圾类型、语音识别垃圾类型、图片识别类型、垃圾类别答题

使用云开发的垃圾分类、垃圾识别、答题的微信小程序 完整代码下载地址&#xff1a;使用云开发的垃圾分类、垃圾识别、答题的微信小程序 前言 项目介绍 小程序使用了云开发&#xff0c;包含文字识别垃圾类型、语音识别垃圾类型、图片识别类型、垃圾类别答题、腾讯机器人对话…

AndroidStudio启动app时闪退问题解决过程

问题描述: Android app在启动时闪退的问题有很多种,大部分可能集中在代码有问题上,譬如StartActivity的时候启动不了。 看提示里一般是有错误出现的,这个很好解决,只要找到对应的错误就可以了。 那么,还有一类问题,就是我这里出现的,启动成功,没有任何错误,查看lo…

Odoo 16 企业版手册 - 库存管理之库存调拨

库存调拨 拥有多个仓库的公司需要管理产品从一个地点转移到另一个地点。在某些情况下&#xff0c;公司可能在不同地点设有不同的分支机构&#xff0c;这需要付出巨大努力才能成功管理产品调拨。公司通常通过分配主要仓库和子仓库进行产品分销来管理这种情况。Odoo中的调拨功能支…

SpringBoot+JWT+Shiro+MybatisPlus实现Restful快速开发后端脚手架

一、背景 前后端分离已经成为互联网项目开发标准&#xff0c;它会为以后的大型分布式架构打下基础。SpringBoot使编码配置部署都变得简单&#xff0c;越来越多的互联网公司已经选择SpringBoot作为微服务的入门级微框架。 Mybatis-Plus是一个 Mybatis 的增强工具&#xff0c;有…

房产管理系统系统与数据中心对接要遵循的标准和规范

数图互通高校房产综合管理系统平台是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解…

票务公司网上订票系统

课程设计题目七&#xff1a;票务公司网上订票系统https://download.csdn.net/download/qq_45037155/87364367 点击此链接免费下载原文章&#xff01; 第1章 绪论 1.1 引言 在当今社会&#xff0c;速度决定了很多商业机构的成败。为了顺应时代发展&#xff0c;提高效率&#x…

2023年山东建筑安全员考试真题题库及答案

百分百题库提供建筑安全员考试试题、安全员证考试真题、安全员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 51.申请从事建筑施工特种作业的人员,应当具备()基本条件。 A.年满18周岁且符合相关工种规定的年龄要求; B.经医院体检合格…

【Java多线程JUC入门详解】AQS原理详解

AQS 概述 AbstractQuenedSynchronizer抽象的队列式同步器, 在java.util.concurrent.locks包下。 我们常用的ReentrantLock中有一个抽象静态内部类Sync&#xff0c;就继承自AbstractQuenedSynchronizer。 abstract static class Sync extends AbstractQueuedSynchronizer { …

1.4日报

验收了TestMrlController 历经千辛万苦给电脑安装了vpn 因为昨天系统损坏&#xff0c;今天重新配置postman和navicat 遇到的困难及解决 linux安装vpn时官方给的教程&#xff1a; 可是ubnutu里没有yum&#xff0c;我得先下载yum 而默认镜像源里找不到yum软件包&#xff0c;…

单调栈 单调队列 专题

文章目录一、单调栈1、问题模型2、实现过程&#xff1a;3、代码实现4、规律总结5、题目练习二、单调队列1、问题模型2、实现过程&#xff1a;3、代码实现4、规律总结5、题目练习三、总结一、单调栈 1、问题模型 主要解决一类问题&#xff1a; O(n)O(n)O(n) 求数列中每个元素左…

PaddleNLP系列课程一:Taskflow、小样本学习、FasterTransformer

文章目录一、Taskflow1.1 前言1.2 Taskflow应用介绍1.2.1 词法分析1.2.2 命名实体识别1.2.3 文本纠错1.2.4 句法分析1.2.5 情感分析1.2.6 文本生成应用&#xff08;三行代码体验 Stable Diffusion&#xff09;1.2.7 使用技巧&#xff08;保存地址、批量推理&#xff09;二、 小…

Excel怎么转换成PDF?教你两招轻松搞定

Excel怎么转换成PDF&#xff1f;相信在工作中大家都或多或少需要转换文件的格式&#xff0c;我们会根据工作需求将word、excel、PPT、图片等文件转换成PDF文件。Excel表格是我们经常使用的一款录入数据的文件类型&#xff0c;因为excel文件打开查看时不是很方便&#xff0c;我们…

时序数据库 TDengine 3.0 参数体系使用方式汇总

在日常使用 TDengine 时&#xff0c;参数是用户们无法绕开的重要一环。深入了解参数的属性&#xff0c;生效范围&#xff0c;查询更改方式等会让我们在使用数据库的过程中更加节时高效&#xff0c;也有助于我们更加深入地理解数据库的架构体系。在 3.0 版本中&#xff0c;TDeng…

参数校验(Validator)

为什么要用validator 实战演练 1. Validated 声明要检查的参数 2. 对参数的字段进行注解标注 3. 在全局校验中增加校验异常 4. 测试 自定义参数注解 1. 比如我们来个 自定义身份证校验 注解 2. 然后自定义Validator 3. 使用自定义的注解 4.使用groups的校验 5.restful…

209数组-长度最小的子数组

题目 链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 思路 可以采用暴力&#xff0c;两个for循环&#xff0c;不断寻找符合条件的子序列。时间复杂度为O(n^2) 代码&#xff1a; class Solution { public:int minSubArrayLen(int target, v…

【BP靶场portswigger-服务端6】信息泄露漏洞-5个实验(全)

目录 一、信息泄露漏洞 1、简述&#xff1a; 2、危害&#xff1a; 3、示例&#xff1a; 4、漏洞的产生 5、影响 6、严重程度判定 二、发现和利用信息泄露漏洞 1、模糊测试 2、使用BP扫描仪 3、使用Burp的相关工具 4、工程信息响应 三、常见来源 1、示例&#xff…

【数据篇】34 # 如何处理多元变量?

说明 【跟月影学可视化】学习笔记。 从数据到图表展现 2014 年北京市的天气历史数据&#xff08;csv 格式&#xff09; 这里使用QCharts 图表库折线图来展示平均气温 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" …

PDF转换成word免费版网页版哪个好?办公就用它

我们在工作中经常需要对PDF文件进行编辑&#xff0c;所以可以将PDF文件转换为word文件&#xff0c;这样就可以随意编辑我们想要编辑的内容了&#xff0c;不过有些小伙伴不喜欢下载客户端&#xff0c;但是又不知道PDF转换成word免费版网页版哪个好&#xff0c;为了帮助大家更好的…

微信小程序是如何设计百亿级用户画像分析系统的?

导语 | “We分析”是微信小程序官方推出的数据分析平台&#xff0c;其中画像洞察是其中一个非常重要的功能模块。微信开发工程师钟文波将描述We分析画像系统各模块是如何设计&#xff0c;在介绍基础标签模块之后&#xff0c;重点讲解用户分群模块设计。希望相关的技术实现思路&…

使用OpManager Plus进行网络运行管理

什么是网络运行管理 网络运行管理会不断跟踪网络设备及其操作&#xff0c;并在出现任何网络故障时通知技术人员团队&#xff0c;以便消除它们并主动加强网络免受停机的影响。 为什么网络运行管理很重要 借助网络操作管理工具&#xff0c;管理员可以深入了解网络的最微小细节…