DOM操作

article/2025/10/21 12:48:38

今天开始进入JS的核心操作 DOM,DOM操作其实很简单,就是增删改查这几个操作,先看一下思维导图:

 

1.增加操作

1.新建: fn creatElement(标签名) 创建元素节点 fn setAttribute(name,value)直接设置属性 fn cloneNode(true、false) true包含子节点 false不包含

2.插入 拼接节点: fn appendChild() 插入节点 fn insertBefore(new,old)

2.删除操作

1.删除子节点 fn removeChild() 删除属性节点 fn removeAttributeNode()

3.改

替换节点 fn replaceChild(new,old)

修改属性 fn setAttribute()

4.查找操作

1.获取下一个兄弟节点 pro nextSibling pro nextElementSibling

2.获取上一个兄弟节点 pro previousSibling pro previousElementSibling

3.获取子节点  第一个子节点 pro firstChild   pro firstElementChild

最后一个子节点  pro  lastChild    pro  lastElementChild

获取子节点:pro  childNodes    pro  children

获取父级节点:pro parentNode

4.获取节点后的操作 :(1)通过点语法调用标签属性

(2)通过style属性控制样式

(3)通过classlist操作

案例时刻

下面是完成百度换肤的简单功能:效果图如下:

 当我们点击更新皮肤 会出来一个选择框 类似手风琴效果,将背景图进行更换代码如下:

       .content {

            height: 2000px;

            background-color: gold;

            width: 50px;

            /* margin: 0 auto; */

        }

       

        nav {

            position: fixed;

            top: 0;

            width: 100vw;

            height: 60px;

            background-color: rgba(0, 0, 0, .35);

            color: #fff;

        }

       

        nav p {

            float: right;

            margin-right: 50px;

            height: 60px;

            line-height: 60px;

            font-size: 14px;

        }

       

        nav p:hover {

            cursor: pointer;

        }

       

        .alert {

            position: fixed;

            top: 0;

            z-index: 1;

            width: 100vw;

            height: 100vh;

            background-color: rgba(0, 0, 0, .1);

            display: none;

            justify-content: center;

            align-items: center;

        }

       

        .card {

            padding: 0 20px;

            display: flex;

            position: relative;

            width: 920px;

            height: 320px;

            background-color: #fff;

            border-radius: 8px;

            overflow: hidden;

            box-shadow: 0 0 5px lightgray;

            justify-content: space-around;

            align-items: center;

        }

       

        .card img {

            width: 180px;

            border-radius: 4px;

            box-shadow: 0 0 3px #ccc;

            transition: .3s;

        }

       

        .card img:hover {

            cursor: pointer;

            transform: scale(1.2);

            box-shadow: 0 0 3px #999;

        }

       

        .close {

            position: absolute;

            right: 30px;

            top: 30px;

            color: lightgray;

            font-size: 20px;

        }

       

        .close:hover,

        .no:hover {

            cursor: pointer;

            color: cornflowerblue;

        }

       

        .no {

            position: absolute;

            bottom: 0;

            width: 100%;

            line-height: 40px;

            height: 40px;

            font-size: 14px;

            color: lightgray;

            text-align: center;

        }

       

        .checked {

            outline: 4px solid tomato;

        }

    </style>

</head>

<body>

    <nav>

        <p>更换皮肤</p>

    </nav>

    <div class="alert">

        <div class="card">

            <span class="close"> X</span>

            <span class="no">不使用皮肤</span>

            <img src="https://tse1-mm.cn.bing.net/th/id/R-C.2469e14c80ce4bf9f3daa70aaf39aa0a?rik=HDm4Qv15uw01tg&riu=http%3a%2f%2fimage.qianye88.com%2fpic%2fcc2c707ae9c26972a92b465c4f43bc75&ehk=9hVSnIteSl%2fz1TVhdei%2bHmr1g3Z4DnjLvDH8SZhWIuo%3d&risl=&pid=ImgRaw&r=0"

                alt="">

            <img src="https://uploadfile.bizhizu.cn/2015/0320/20150320115721147.jpg" alt="">

            <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1115%2F101021113337%2F211010113337-2-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1654678095&t=9af93ad051672e6fc296b7ab1acb9223"

                alt="">

            <img src="https://tse1-mm.cn.bing.net/th/id/R-C.6685dd9d8aa6780795862545552751a5?rik=Ewk9pglxXZ61cg&riu=http%3a%2f%2fup.jpgjpg.com%2fpic%2f24%2fbd%2fc7%2f24bdc7a973aa134e4621cf392872ef52.jpg&ehk=KUCPXB7aMx44OGFyetXEq9zoT1xPnnbpqGnsS8X%2fmNs%3d&risl=&pid=ImgRaw&r=0"

                alt="">

            <img src="https://tse1-mm.cn.bing.net/th/id/R-C.f24607a93c8bb9fd41cb34b3326a8e44?rik=2P0ObbSZPPiohQ&riu=http%3a%2f%2fimage.qianye88.com%2fpic%2fdd8ca4523da562da23739f1533f39384&ehk=I7S%2bggcnVVK4dpHk6F6T3OcuAyQQQ%2bdXCX7GZp4wWYk%3d&risl=&pid=ImgRaw&r=0"

                alt="">

        </div>

    </div>

    <div class="content">

        这里是centent

    </div>

</body>

<script>

    var dAlert = document.querySelector(".alert");

    var p = document.querySelector("nav p");

    var spanClose = document.querySelector(".close");

    var imgs = document.querySelectorAll("img");

    var body = document.querySelector("body");

    var no = document.querySelector(".no");

    //给P添加点击事件

    p.onclick = function() {

        dAlert.style.display = "flex";

    }

    spanClose.onclick = function() {

        dAlert.style.display = "none";

    }

    var index = -1; //当前显示图片的img的下标,如果是-1,则代表没有背景图

    for (var i = 0; i < imgs.length; i++) {

        imgs[i].xiabiao = i;

        imgs[i].onclick = function() {

            if (index === this.xiabiao) {

                //如果点的是已经显示的图片,就结束函数

                return;

            }

            //this 指向函数的拥有者

            body.style.backgroundImage = `url(${this.src})`;

            // 找到上一个有outline的img  把他去掉

            // 1.暴力解除

            // for (var j = 0; j < imgs.length; j++) {

            //     imgs[j].className = "";

            // }

            // 2.下标

            if (index != -1) {

                imgs[index].className = "";

            }

            this.className = "checked";

            //修改index的值

            index = this.xiabiao;

        }

    }

    no.onclick = function() {

        body.style.backgroundImage = "none";

        imgs[index].className = '';

        index = -1;

    }

</script>


 

</html>


http://chatgpt.dhexx.cn/article/piYRi0NG.shtml

相关文章

JS中DOM元素的操作

一、DOM元素的获取 1&#xff09;document.getElementsByClassName ( “class”) 返回集 htmlcollection ,用法和数组一致 说明: class为DOM元素上class属性的值 2&#xff09;document.getElementById( “id” ) 功能:返回对拥有指定ID的第一个对象的引用 返回值: DOM对象 说明…

java锁结构之无锁偏向锁轻量级锁重量级锁

一、对象的本质&#xff08;锁在对象中的体现&#xff09; 1.1、对象的结构 对象由多部分构成的&#xff0c;对象头、属性字段、补齐字段等。补齐字段是指如果对象总大小不是4字节的整数倍&#xff0c;会填充上一段内存地址是之成为4的整数倍。 其中&#xff0c;对象头在对象…

简单理解重量级锁、轻量级锁、偏向锁

全文使用synchronized来说明。 synchronized给对象上锁&#xff0c;先上偏向锁&#xff0c;在上轻量级锁&#xff0c;最后上重量级锁。上什么锁&#xff0c;是jvm根据竞争程度自行变换的。 重量级锁 计算机操作系统本有Monitor对象&#xff0c;称为管程。在java里面看不到此对…

synchronized锁升级之偏向锁

目录 一、什么是偏向锁&#xff1f; 二、偏向锁原理 三、偏向锁演示 四、偏向锁的处理流程 五、偏向锁的撤销 六、偏向锁的好处 一、什么是偏向锁&#xff1f; HotSpot作者经过研究实践发现&#xff0c;在大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而…

Java无锁、偏向锁、轻量级锁、重量级锁,锁升级过程

2. 锁 2.1 无锁 Java对象刚创建时还没有任何线程来竞争&#xff0c;说明该对象处于无锁状态&#xff08;无线程竞争它&#xff09;&#xff0c;这时偏向锁标识位是0&#xff0c;锁状态是01 。 2.2 偏向锁 偏向锁是指一段同步代码一直被同一个线程所访问&#xff0c;那么该…

偏向锁的获取和撤销详解

Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗&#xff0c;引入了偏向锁和轻量级锁&#xff1b;在Java SE 1.6 中&#xff0c;锁共有4种状态&#xff0c;级别从底到高依次是&#xff1a;无锁状态、偏向锁状态、轻量级锁和重量级锁状态&#xff0c;这几种状态会随着竞争情况…

一篇文章说清 :无锁、偏向锁、轻量级锁、重量级锁

文章目录 前言一、无锁二、偏向锁三、轻量级锁&#xff08;自选锁&#xff09;四、重量级锁锁升级场景 前言 JDK1.6为了减少获得锁和释放锁所带来的性能消耗&#xff0c;引入了“偏向锁”和“轻量级锁”&#xff0c;所以在JDK1.6里锁一共有四种状态&#xff0c;无锁状态&#x…

synchronized的偏向锁、轻量级锁和重量级锁

文章目录 Java对象头偏向锁批量重偏向批量撤销 轻量级锁重量级锁Monitor 原理 Java对象头 普通对象 Mark Word在64 位虚拟机中的结构为 Mark Word后三&#xff08;两&#xff09;位表示 001&#xff1a;无锁状态101&#xff1a; 偏向锁00&#xff1a; 轻量级锁10&#xff1a…

Java synchronized偏向锁、轻量级锁、重量级锁

简介 synchronized锁共有偏向锁、轻量级锁、重量级锁三种类型&#xff0c;而这三种类型的加锁方式都是相同的&#xff0c;写代码时不用考虑加哪种锁。使用锁时对象首先会变为偏向锁状态&#xff0c;当有其它线程获取锁时会升级为轻量级锁&#xff08;没有竞争锁&#xff09;&am…

java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

之前做过一个测试&#xff0c;详情见这篇文章《多线程 1操作的几种实现方式&#xff0c;及效率对比》&#xff0c;当时对这个测试结果很疑惑&#xff0c;反复执行过多次&#xff0c;发现结果是一样的: 1. 单线程下synchronized效率最高&#xff08;当时感觉它的效率应该是最差…

偏向锁、轻量级锁、重量级锁的区别和解析

为了换取性能&#xff0c;JVM在内置锁上做了非常多的优化&#xff0c;膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题&#xff0c;几种锁的分配和膨胀过程&#xff0c;有助于编写并优化基于锁的并发程序。 内置锁的分配和膨胀过程较为复杂&…

偏向锁是什么

偏向锁操作流程偏向锁&#xff0c;顾名思义&#xff0c;它会偏向于第一个访问锁的线程&#xff0c;如果在接下来的运行过程中&#xff0c;该锁没有被其他的线程访问&#xff0c;则持有偏向锁的线程将永远不需要触发同步 但是从我们跑的代码输出却看不到偏向锁这个东东。为啥对…

偏向锁的基本原理

偏向锁的基本原理 前面说过&#xff0c;大部分情况下&#xff0c;锁不仅仅不存在多线程竞争&#xff0c;而是总是由同一个线程多次获得&#xff0c;为了让线程获取锁的代价更低就引入了偏向锁的概念。怎么理解偏向锁呢&#xff1f;当一个线程访问加了同步锁的代码块时&#xff…

偏向锁,轻量级锁,重量级锁的核心原理

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章是关于并发编程中偏向锁&#xff0c;轻量级锁&#xff0c;重量级锁的核心原理知识记录。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适…

深入探究synchronize锁机制

synchronized 有三种方式来加锁&#xff0c;分别是&#xff1a; **1. 修饰实例方法&#xff1a;**作用于当前实例加锁&#xff0c;进入同步代码前要获得当前实例的锁 **2. 静态方法&#xff1a;**作用于当前类加锁&#xff0c;进入同步代码前要获得当前类的锁 **3. 修饰代码块&…

偏向锁的原理与实战

文章目录 1. 偏向锁的核心原理2. 偏向锁代码演示3. 偏向锁的膨胀与撤销 1. 偏向锁的核心原理 如果不存在线程竞争的一个线程获得了锁&#xff0c;那么锁就进入偏向状态&#xff0c;此时Mark Word的结构变为偏向锁结构&#xff0c;锁对象的锁标志位&#xff08;lock&#xff09;…

Java并发 | 19.[锁机制] 偏向锁(CAS)

文章目录 1. 偏向锁分析回顾轻量级锁偏向锁的优势 2. 偏向锁&#xff08;CAS&#xff09;2.1. 偏向锁流程概述2.2. 锁升级 参考资料 1. 偏向锁分析 回顾轻量级锁 在上文 Java并发 | 18.[锁机制] 轻量级锁&#xff08;CAS自旋锁&#xff09;中对轻量级锁进行过解析&#xff0c…

Synchronized-偏向锁

偏向锁是什么&#xff1f; 是jdk1.6引入的一种锁优化方式。让 锁对象 偏心于第一次获取锁的线程&#xff0c;记住它的id&#xff0c;当下一次再有线程获取锁的时候&#xff0c;与记录的ID匹配&#xff0c;直接获取锁就行。是一种load-and-test的过程。 引入目的&#xff1f; …

面试题-- 什么是偏向锁

所谓的偏向&#xff0c;就是偏心&#xff0c;即锁会偏向于当前已经占有锁的线程 。 大部分情况是没有竞争的&#xff08;某个同步块大多数情况都不会出现多线程同时竞争锁&#xff09;&#xff0c;所以可以通过偏向来提高性能。即在无竞争时&#xff0c;之前获得锁的线程再次获…

Java中的偏向锁,轻量级锁, 重量级锁解析

文章目录 参考文章Java 中的锁一些先修知识synchronized 关键字之锁的升级&#xff08;偏向锁->轻量级锁->重量级锁&#xff09;无锁 -> 偏向锁偏向锁的撤销&#xff08;Revoke&#xff09;偏向锁的批量再偏向&#xff08;Bulk Rebias&#xff09;机制偏向锁 -> 轻…