【DOM笔记三】节点操作(节点概述、节点层级、添加 / 删除 / 复制节点、DOM基本语法总结!

news2025/6/14 13:08:31

文章目录

    • 5 节点操作
      • 5.1 节点概述
      • 5.2 节点层级
        • 5.2.1 父子节点
        • 5.2.2 兄弟节点
      • 5.3 添加元素
      • 5.4 删除节点
      • 5.5 复制节点
      • 5.6 三种动态创建元素的区别
    • 6 DOM小结

5 节点操作

获取元素的方式:

image-20231219145956719

比较发现,用节点层级关系来获取元素更简单(DOM方法相当于绝对路径,节点方法相当于相对路径)。

5.1 节点概述

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

基本组成: nodeType(节点类型) 、nodeName(节点名称)、nodeValue(节点值)

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

节点操作(主要为元素节点)的目的: 获取元素

5.2 节点层级

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

5.2.1 父子节点
image-20231219150855037

1.父节点

  • node.parentNode

2.子节点

  • node.childNodes(标准),返回子节点(元素节点、文本节点…)集合
  • node.children(非标准),返回子元素节点集合(各浏览器都支持,更常用
  • node.firstChild,返回第一个子节点(所有类型),找不到返回null
  • node.lastChild,返回最后一个子节点(所有类型)
  • node.firstElementChild,返回第一个子元素节点,IE9以上才支持
  • node.lastElementChild,返回最后一个子元素节点,IE9以上才支持
  • node.children[0],返回第一个子元素节点,没有兼容性问题
  • node.children[ol.children.length - 1]),返回ol最后一个子元素节点,没有兼容性问题
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <!-- 节点的优点 -->
    <div>我是div</div>
    <span>我是span</span>
    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <ol>
        <li>我是li1</li>
        <li>我是li2</li>
        <li>我是li3</li>
        <li>我是li4</li>
    </ol>
    
    <div class="demo">
        <div class="box">
            <span class="erweima">×</span>
        </div>
    </div>
    
    <script>
        // DOM 提供的方法(API)获取 '父节点'
        var erweima = document.querySelector('.erweima');
        var box = document.querySelector('.box');  // 以前获得.box方法
        // 父节点 node.parentNode
        console.log(erweima.parentNode);   // 现在获得.box方法为erweima.parentNode,返回<div class="box">...</div>,得到的是离元素最近的父级节点(亲爸爸)box,得不到demo,如果找不到父节点就返回为 null
        
        
        // DOM 提供的方法(API)获取 '子节点'
        var ul = document.querySelector('ul');
        var lis = ul.querySelectorAll('li');
        // 1. node.childNodes 获得所有的子节点,包含:元素节点、文本节点...
        console.log(ul.childNodes);  // NodeList(9)
        console.log(ul.childNodes[0].nodeType);  // 3(文本节点)
        console.log(ul.childNodes[1].nodeType);  // 1(元素节点)
        // 如何只获取元素节点?
        var ul = document.queryselector ('ul');
		for(var i = 0; i < ul.childNodes.length; i++) {
			if (ul.childNodes[i].nodeType == 1) {
				console.log (ul.childNodes[i]);	 // ul.childNodes[i]是元素节点
            }
		}   // 这种方法太麻烦,因此用方法2

        // 2. node.children 获取所有的子元素节点,更常用
        console.log(ul.children);  // HTMLCollection(4)
        
        
        var ol = document.querySelector('ol');
        // 3.4. node.firstChild 
        console.log(ol.firstChild);  // #text
        console.log(ol.lastChild);  // #text
        // 5.6. node.firstElementChild,IE9以上才支持
        console.log(ol.firstElementChild);  // <li>我是li1</li>
        console.log(ol.lastElementChild);   // <li>我是li4</li>
        // 7.8. node.children[0]实际开发的写法,没有兼容性问题
        console.log(ol.children[0]);  // <li>我是li1</li>
        console.log(ol.children[ol.children.length - 1]);  // <li>我是li4</li>
    </script>
</body>

</html>

案例:下拉菜单

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <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; // 得到4个小li
        // 2.循环注册事件
        for (var i = 0; i < lis.length; i++) {
            lis[i].onmouseover = function() {
                this.children[1].style.display = 'block';
            }
            lis[i].onmouseout = function() {
                this.children[1].style.display = 'none';
            }
        }
    </script>
</body>

</html>

鼠标指向菜单后出现下拉菜单,离开后自动隐藏:

5.2.2 兄弟节点
  • node.nextSibling,返回元素下一个兄弟节点(所有类型),找不到返回null
  • node.previousSibling,返回元素上一个兄弟节点(所有类型),找不到返回null
  • node.nextElementSibling,返回元素下一个兄弟元素节点,找不到返回null,IE9以上才支持
  • node.previousElementSibling,返回元素上一个兄弟元素节点,找不到返回null,IE9以上才支持
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>我是div</div>
    <span>我是span</span>
    <script>
        var div = document.querySelector('div');
        // 1.2. nextSibling 下一个兄弟节点,包含:元素节点、文本节点...
        console.log(div.nextSibling);  // #text
        console.log(div.previousSibling);  // #text
        
        // 3.4. nextElementSibling 下一个兄弟元素节点,IE9以上才支持
        console.log(div.nextElementSibling);  // <span>我是span</span>
        console.log(div.previousElementSibling);   // null
        // 有兼容性问题怎么办?封装一个兼容性函数。
        function getNextElementsibling (element) {
            var el = element;
            while (el = el.nextsibling) {
                if (el.nodeType === 1) {   // 是元素节点就返回
                    return el;
                }
            }
            return null;
        }

    </script>
</body>

</html>

5.3 添加元素

在页面中添加元素的步骤:

  1. 创建节点
  • document.createElement('tagName'),由tagName指定的HTML元素创建。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点
  1. 添加节点
  • node.appendChild(child);,将一个节点添加到指定父节点的子节点列表末尾,类似于CSS里面的after伪元素。
  • node.insertBefore(child,指定元素);将一个节点添加到指定父节点的指定子节点前面,类似于CSS里面的before伪元素。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <ul>
        <li>123</li>
    </ul>
    <script>
        // 1. 创建节点元素节点
        var li = document.createElement('li');
        
        // 2. 添加节点node.appendChild(child),类似于数组中的push
        var ul = document.querySelector('ul');
        ul.appendChild(li); // 给ul父节点内的末尾加上小li
        
        // 3. 添加节点node.insertBefore(child, 指定元素);
        var lili = document.createElement('li');
        ul.insertBefore(lili, ul.children[0]);  // ul.children[0]为第一个孩子,在它前面插入lili
    </script>
</body>

</html>

案例:简单版-发布留言

需求:输入留言内容,点击发布后内容会出现在下面。

思路:点击按钮后动态创建一个li,添加到ul里面。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 300px;
            padding: 5px;
            background-color: rgb(245, 209, 243);
            color: red;
            font-size: 14px;
            margin: 15px 0;
        }
    </style>
</head>

<body>
    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul>
		<!-- 留言板内容 -->
    </ul>
    <script>
        // 1. 获取元素
        var btn = document.querySelector('button');
        var text = document.querySelector('textarea');
        var ul = document.querySelector('ul');
        // 2. 注册事件
        btn.onclick = function() {
            if (text.value == '') {   // 用户没输入内容就提交了
                alert('您没有输入内容');
                return false;
            } else {
                // console.log(text.value);  留言的内容
                // (1) 创建元素
                var li = document.createElement('li');  // 先有li
                li.innerHTML = text.value;  // 再进行赋值
                // (2) 添加元素
                // ul.appendChild(li);   新写的留言在最后面显示
                ul.insertBefore(li, ul.children[0]);   // 新写的留言在最前面显示
            }
        }
    </script>
</body>

</html>

5.4 删除节点

  • node.removeChild(child),删除子节点并返回删除的节点
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button>删除</button>
    <ul>
        <li>熊大</li>
        <li>熊二</li>
        <li>光头强</li>
    </ul>
    <script>
        // 1.获取元素
        var ul = document.querySelector('ul');
        var btn = document.querySelector('button');
        // 2. 删除元素  node.removeChild(child)
        // ul.removeChild(ul.children[0]);  熊大被删掉
        // 3. 点击按钮依次删除里面第一个孩子
        btn.onclick = function() {
            if (ul.children.length == 0) {
                this.disabled = true;   // 如果没有元素,按钮就被禁用
            } else {
                ul.removeChild(ul.children[0]);
            }
        }
    </script>
</body>

</html>

案例:删除留言

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 300px;
            padding: 5px;
            background-color: rgb(245, 209, 243);
            color: red;
            font-size: 14px;
            margin: 15px 0;
        }
        
        li a {
            float: right;
        }
    </style>
</head>

<body>
    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul>

    </ul>
    <script>
        // 1. 获取元素
        var btn = document.querySelector('button');
        var text = document.querySelector('textarea');
        var ul = document.querySelector('ul');
        // 2. 注册事件
        btn.onclick = function() {
            if (text.value == '') {
                alert('您没有输入内容');
                return false;
            } else {
                // (1) 创建元素
                var li = document.createElement('li');
                li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";  // 使用javascript:阻止链接跳转,效果比#好
                
                // (2) 添加元素
                ul.insertBefore(li, ul.children[0]);
                
                // (3) 删除元素:删除的是当前链接的li(它的父亲)
                var as = document.querySelectorAll('a');
                for (var i = 0; i < as.length; i++) {
                    as[i].onclick = function() {  
                        ul.removeChild(this.parentNode);  // node.removeChild(child); 删除的是当前a所在的li,this.parentNode;
                    }
                }
            }
        }
    </script>
</body>

</html>

5.5 复制节点

  • node.cloneNode ();,括号为空或者里面是false,为浅拷贝,只复制标签不复制里面的内容
  • node.cloneNode(true);, 括号为true,为深拷贝,复制标签里面的内容
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <ul>
        <li>1111</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        var ul = document.querySelector('ul');
        // 1. node.cloneNode(); 浅拷贝
        // 2. node.cloneNode(true); 深拷贝
        var lili = ul.children[0].cloneNode(true);
        ul.appendChild(lili);
    </script>
</body>

</html>

浅拷贝效果:image-20231219172015455 深拷贝效果:

案例:动态生成表格

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        table {
            width: 500px;
            margin: 100px auto;
            border-collapse: collapse;
            text-align: center;
        }
        
        td,
        th {
            border: 1px solid #333;
        }
        
        thead tr {
            height: 40px;
            background-color: #ccc;
        }
    </style>
</head>

<body>
    <table cellspacing="0">
        <thead>
            <tr>
                <th>姓名</th>
                <th>科目</th>
                <th>成绩</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
         <!-- 放准备好的学生数据,一个学生放一行 -->
        </tbody>
    </table>
    <script>
        // 1.先准备好学生的数据(实际应用:JS动态生成,从数据库中取数据;此处:模拟数据)
        var datas = [{    // 一个数组中放了多个对象
            name: '魏璎珞',
            subject: 'JavaScript',
            score: 100
        }, {
            name: '弘历',
            subject: 'JavaScript',
            score: 98
        }, {
            name: '傅恒',
            subject: 'JavaScript',
            score: 99
        }, {
            name: '明玉',
            subject: 'JavaScript',
            score: 88
        }];
        
        // 2. 往tbody里面创建行:有几个人(看数组的长度)就创建几行
        var tbody = document.querySelector('tbody');
        for (var i = 0; i < datas.length; i++) { // 外面的for循环指行 tr
            var tr = document.createElement('tr');  // 创建tr行
            tbody.appendChild(tr);
            // 行里面创建3个单元格td  for循环遍历对象 datas[i]
            for (var k in datas[i]) {   // 里面的for循环指列 td
                var td = document.createElement('td');    // 创建单元格 
                td.innerHTML = datas[i][k];  // 把对象里面的属性值datas[i][k] 给td 
                tr.appendChild(td);
            }
            // 3. 创建删除列单元格 
            var td = document.createElement('td');
            td.innerHTML = '<a href="javascript:;">删除</a>';
            tr.appendChild(td);
        }
        // 4. 删除操作 开始 
        var as = document.querySelectorAll('a');
        for (var i = 0; i < as.length; i++) {
            as[i].onclick = function() {
                // 点击a,删除当前a所在的行(链接的爸爸的爸爸)  node.removeChild(child)  
                tbody.removeChild(this.parentNode.parentNode)
            }
        }
    </script>
</body>

</html>

image-20231219172418183

5.6 三种动态创建元素的区别

  • document.write(),直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
  • element.innerHTML,不会导致页面全部重绘,创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
  • document.createElement(),创建多个元素效率稍低一点点,但是结构更清晰

总结:不同浏览器下,innerHTML效率要比creatElement高

6 DOM小结

  1. 创建

    • document.write

    • innerHTML

    • createElement

  2. 增加

    • appendChild

    • insertBefore

  3. 删除

    • removeChild
  4. 修改(元素属性、元素内容、表单的值…)

    • 元素属性:src、href、title等

    • 普通元素内容:innerHTML、innerText

    • 表单元素:value、type、disabled等

    • 元素样式:style、className

  5. 查询(DOM元素)

    • DOM提供的API方法:getElementByld、getElementsByTagName 古老用法不太推荐

    • H5提供的新方法:querySelector、querySelectorAll 提倡

    • 利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling) 提倡

  6. 属性操作(主要针对自定义属性)

    • setAttribute:设置dom的属性值

    • getAttribute:得到dom的属性值

    • removeAttribute:移除属性

  7. 事件操作(给元素注册事件,采取事件源.事件类型=事件处理程序

image-20231219191817442

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

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

相关文章

Git常用命令及解释说明

目录 前言1 git config2 git init3 git status4 git add5 git commit6 git reflog7 git log8 git reset结语 前言 Git是一种分布式版本控制系统&#xff0c;广泛用于协作开发和管理项目代码。了解并熟练使用Git的常用命令对于有效地管理项目版本和历史记录至关重要。下面是一些…

Linux一行命令配置jdk环境

使用方法&#xff1a; 压缩包上传 到/opt, 更换命令中对应的jdk包名即可。 注意点&#xff1a;jdk-8u151-linux-x64.tar.gz 解压后名字是jdk1.8.0_151 sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt && echo export JAVA_HOME/opt/jdk1.8.0_151 | sudo tee -a …

Pixelmator Pro 中文

Pixelmator Pro是一款专为Mac用户设计的强大图像编辑软件。它提供了丰富的功能和直观的界面&#xff0c;使用户可以轻松进行各种图像处理任务。该软件支持各种文件格式&#xff0c;包括JPEG、PNG、GIF、BMP和TIFF等&#xff0c;并可导入Photoshop的psd文件。它提供了丰富的绘画…

【LeetCode刷题笔记】贪心

135.分发糖果 解题思路: 两个数组 + 两次遍历 ,取 最大峰值 ,准备两个数组 L 和 R ,默认填充 1 , 先 从左往右 扫描一遍, 更新 L 数组,如果 右边

C++哈希表的实现

C哈希表的实现 一.unordered系列容器的介绍二.哈希介绍1.哈希概念2.哈希函数的常见设计3.哈希冲突4.哈希函数的设计原则 三.解决哈希冲突1.闭散列(开放定址法)1.线性探测1.动图演示2.注意事项3.代码的注意事项4.代码实现 2.开散列(哈希桶,拉链法)1.概念2.动图演示3.增容问题1.拉…

前端开发基于Qunee绘制网络拓扑图总结-01

节点、连线添加label标签&#xff1a; 当需要在节点或者连线上添加图标、文字等醒目标识时&#xff0c;可添加label标签 自定义事件控制label标签的显示、隐藏&#xff1a; 外部点击事件控制某些自定义标识显、隐 showHideLableUI(edge, visible) {let uis edge.bindingUIs…

VideoPoet: Google的一种用于零样本视频生成的大型语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Proteus仿真】【Arduino单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能&#xff1a; 系统运行后&am…

在做题中学习(40):有效三角形的个数

611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;&#xff08;双指针法&#xff09;最优 确定一个三角形除了左边&#xff0c; 还可以右边的让数组排好序&#xff0c;让一个小的&#xff0c;一个次大 相加 和 最大的 比较&#xff0c;如果不满…

RateLimiter速率了解

RateLimiter <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version> </dependency>这个同名的类在nacos的jar包中也有出现。速率限制于java.util.concurrent.Semaphore功能…

git分支解析

1、概述和优点 在版本控制过程中&#xff0c;同时会推进多个任务&#xff0c;为此&#xff0c;就可以为每个任务创建单独的分支。开发人员可以把自己的任务和主线任务分离开来&#xff0c;在开发自己的分支的时候不会影响主分支。 分支的好处&#xff1a; 同时推进多个功能开发…

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录 Stack容器 一、Stack容器介绍 二、stack常用接口 三、栈的示例 queue&#xff08;队列&#xff09;容器 一、queue容器介绍 二、queue常用接口 三、queue示例 list容器 一、list容器介绍 二、list常用接口及示例 &#xff08;一&#xff09;list构造函数 &am…

【Vulnhub 靶场】【DarkHole: 1】【简单】【20210730】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/darkhole-1,724/ 靶场下载&#xff1a;https://download.vulnhub.com/darkhole/DarkHole.zip 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月18日 文件大小&#xff1a;2.9 GB 靶场作者&#xff1a…

lv12 根文件系统12

目录 1 根文件系统 2 BusyBox 3 实验九 3.1 在 busybox 官网下载 busybox 源码&#xff08;这里我们下载 busybox-1.22.1.tar.bz2&#xff09; 3.2 拷贝 busybox 源码包到 ubuntu 的家目录下&#xff0c;解压并进入其顶层目录 3.3 进入 busybox 配置界面&#xff08;…

国内chatGPT3.5升级到chatGPT4.0的教程

1、准备一个3.5的账号 2、准备一个美元虚拟信用卡 这里默认您是有账号的 1、注册办理卡 2、按图片步骤就可以开卡成功 3、卡片cvc在卡中心cvc安全码里面 4、登录ChatGPT 第三步:升级 Plus 完成了上面步骤 小白朋友连账号都么有的&#xff0c;可以使用谷歌邮箱直接在open…

如何快速实现地源热泵远程监控

地源热泵远程监控解决方案 一、项目背景 山东省潍坊市盛世花园小区地源热泵项目是一个先进的供暖与制冷系统&#xff0c;旨在为整个小区提供高效且节能的温控服务。该系统主要由地下管道网络、地源热泵单元以及室内分配系统组成。 针对现有的地源热泵系统的管理和监控问题&a…

用SQL语句创建数据库表的注意事项

1.所有的符号都要在英文状态下使用。 2.表的名称和字段尽量使用括起来。 3.AUTO_INCREMENT(自增) 4.字符串使用单引号 括起来 5.所有的语句后面加 , (英文的)&#xff0c;最后一个不用加。 6.PRIMARY KEY() 主键&#xff0c;一般一个表只有一个唯一 的主键&#xff01; …

Java--抽象工厂设计模式

抽象工厂设计模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责…

pip 常用指令 pip list 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包&#xff0c;以及它们的版本号。 pip list 命令有以下参数 -o, --outdated&#xff1a;列出所有过时的包&#xff0c;即有新版本可用的包。-u, --uptod…

麒麟信安日志轮询分割操作说明

1、背景介绍 由于模块上面硬盘容量有限&#xff0c;需要定时清理系统日志。为了方便用户使用&#xff0c;在系统中设定自动日志轮询操作&#xff0c;让日志占用容量由操作系统自动管理&#xff0c;用户无需担心日志太多把硬盘容量占满。 2、操作说明 新建需要分割的日志logr…