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

智能推荐

python中文显示不出来_解决Python词云库wordcloud不显示中文的问题-程序员宅基地

文章浏览阅读2.6k次。解决Python词云库wordcloud不显示中文的问题2018-11-25背景:wordcloud是基于Python开发的词云生成库,功能强大使用简单。github地址:https://github.com/amueller/word_cloudwordcloud默认是不支持显示中文的,中文会被显示成方框。安装:安装命令:pip install wordcloud解决:经过测试发现不支持显示中文..._词云python代码无法输出文字

台式计算机cpu允许温度,玩游戏cpu温度多少正常(台式电脑夏季CPU一般温度多少)...-程序员宅基地

文章浏览阅读1.1w次。随着炎热夏季的到来,当玩游戏正爽的时候,电脑突然死机了,自动关机了,是不是有想给主机一脚的冲动呢?这个很大的原因是因为CPU温度过高导致的。很多新手玩家可能都有一个疑虑,cpu温度多少以下正常?有些说是60,有些说是70,到底多高CPU温度不会死机呢?首先我们先看看如何查看CPU的温度。下载鲁大师并安装,运行鲁大师软件,即可进入软件界面,并点击温度管理,即可看到电脑各个硬件的温度。鲁大师一般情况下..._台式机玩游戏温度多少正常

小白自学Python日记 Day2-打印打印打印!_puthon打印任务收获-程序员宅基地

文章浏览阅读243次。Day2-打印打印打印!我终于更新了!(哭腔)一、 最简单的打印最最简单的打印语句: print(“打印内容”)注意:python是全英的,符号记得是半角下面是我写的例子:然后进入power shell ,注意:你需要使用cd来进入你保存的例子的文件夹,保存时名字应该取为xxx.py我终于知道为什么文件夹取名都建议取英文了,因为进入的时候是真的很麻烦!如果你没有进入正确的文件夹..._puthon打印任务收获

Docker安装:Errors during downloading metadata for repository ‘appstream‘:_"cenerrors during download metadata for repository-程序员宅基地

文章浏览阅读1k次。centos8问题参考CentOS 8 EOL如何切换源? - 云服务器 ECS - 阿里云_"cenerrors during download metadata for repository \"appstream"

尚硅谷_谷粒学苑-微服务+全栈在线教育实战项目之旅_基于微服务的在线教育平台尚硅谷-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏11次。SpringBoot+Maven+MabatisPlusmaven在新建springboot项目引入RELEASE版本出错maven在新建springboot项目引入RELEASE版本出错maven详解maven就是通过pom.xml中的配置,就能够从仓库获取到想要的jar包。仓库分为:本地仓库、第三方仓库(私服)、中央仓库springframework.boot:spring-boot-starter-parent:2.2.1.RELEASE’ not found若出现jar包下载不了只有两_基于微服务的在线教育平台尚硅谷

随便推点

网络学习第六天(路由器、VLAN)_路由和vlan-程序员宅基地

文章浏览阅读316次。路由的概念路由器它称之为网关设备。路由器就是用于连接不同网络的设备路由器是位于OSI模型的第三层。路由器通过路由决定数据的转发。网关的背景:当时每家计算机厂商,用于交换数据的通信程序(协议)和数据描述格式各不相同。因此,就把用于相互转换这些协议和格式的计算机称为网关。路由器与三层交换器的对比路由协议对比路由器的作用:1.路由寻址2.实现不同网络之间相连的功能3.通过路由决定数据的转发,转发策略称为 路由选择。VLAN相关技术什么是VLAN?中文名称叫:虚拟局域网。虚_路由和vlan

设置div背景颜色透明度,内部元素不透明_div设置透明度,里面的内容不透明-程序员宅基地

文章浏览阅读2.8w次,点赞6次,收藏22次。设置div背景颜色透明度,内部元素不透明:.demo{  background-color:rgba(255,255,255,0.15) } 错误方式:.demo{ background-color:#5CACEE;opacity:0.75;} 这样会导致div里面的元素内容和背景颜色一起变透明只针对谷歌浏览器的测试_div设置透明度,里面的内容不透明

Discuz!代码大全-程序员宅基地

文章浏览阅读563次。1.[ u]文字:在文字的位置可以任意加入您需要的字符,显示为下划线效果。2.[ align=center]文字:在文字的位置可以任意加入您需要的字符,center位置center表示居中,left表示居左,right表示居右。5.[ color=red]文字:输入您的颜色代码,在标签的中间插入文字可以实现文字颜色改变。6.[ SIZE=数字]文字:输入您的字体大小,在标签的中间插入文..._discuzcode 大全

iOS NSTimer定时器-程序员宅基地

文章浏览阅读2.6k次。iOS中定时器有三种,分别是NSTimer、CADisplayLink、dispatch_source,下面就分别对这三种计时器进行说明。一、NSTimerNSTimer这种定时器用的比较多,但是特别需要注意释放问题,如果处理不好很容易引起循环引用问题,造成内存泄漏。1.1 NSTimer的创建NSTimer有两种创建方法。方法一:这种方法虽然创建了NSTimer,但是定时器却没有起作用。这种方式创建的NSTimer,需要加入到NSRunLoop中,有NSRunLoop的驱动才会让定时器跑起来。_ios nstimer

Linux常用命令_ls-lmore-程序员宅基地

文章浏览阅读4.8k次,点赞17次,收藏51次。Linux的命令有几百个,对程序员来说,常用的并不多,考虑各位是初学者,先学习本章节前15个命令就可以了,其它的命令以后用到的时候再学习。1、开机 物理机服务器,按下电源开关,就像windows开机一样。 在VMware中点击“开启此虚拟机”。2、登录 启动完成后,输入用户名和密码,一般情况下,不要用root用户..._ls-lmore

MySQL基础命令_mysql -u user-程序员宅基地

文章浏览阅读4.1k次。1.登录MYSQL系统命令打开DOS命令框shengfen,以管理员的身份运行命令1:mysql -u usernae -p password命令2:mysql -u username -p password -h 需要连接的mysql主机名(localhost本地主机名)或是mysql的ip地址(默认为:127.0.0.1)-P 端口号(默认:3306端口)使用其中任意一个就OK,输入命令后DOS命令框得到mysql>就说明已经进入了mysql系统2. 查看mysql当中的._mysql -u user

推荐文章

热门文章

相关标签