DOM(总结)

前言

什么是 DOM?

DOM 是 W3C(万维网联盟)的标准。

DOM 定义了访问 HTML 和 XML 文档的标准:
  “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

W3C DOM 标准被分为 3 个不同的部分:
  1)核心 DOM - 针对任何结构化文档的标准模型
  2)XML DOM - 针对 XML 文档的标准模型
  3)HTML DOM - 针对 HTML 文档的标准模型

本文主要讲的内容是HTML DOM

1 初识DOM

    DOM: Document Object Model 文档对象模型
        文档:html文档。
        对象:DOM元素对象  html元素对象
        模型:树模型  html标签就形成一课树

        DOM中有一套操作页面元素的属性和方法。

  HTML DOM 定义了访问和操作 HTML 文档的标准方法。
  HTML DOM 是:HTML 的标准对象模型;/HTML 的标准编程接口;/W3C 标准
  HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
  换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

DOM 将 HTML 文档表达为树结构。
在这里插入图片描述

    <div class="box">我是一个div</div> 
        元素节点:<div class="box">我是一个div</div> 
        属性节点:class="box"
        文本节点:我是一个div

    DOM操作: 操作(增删改查)
        1)可以操作document  
        2)可以操作文档中各种标签  
            A)操作元素节点
            B)操作属性节点
            C)操作文本节点
        3)操作样式
            A)操作行内样式
            B)操作class类

2 获取DOM元素

通过JS获取页面中的元素,进行操作:

2.1 document.documentElement

得到整个文档(html元素)

2.2 document.head

得到head元素

2.3 document.body

得到body元素

2.4 document.getElementById()

根据一个ID获取DOM元素
      仅仅是获取一个,因为ID是唯一
      如果有对应的ID,就获取这个元素
      如果没有这个ID,得到null

2.5 document.getElementsByClassName()

根据class名字获取页面上的DOM元素(获取多个)

                得到的是一个类数组(伪数组,长的像数组,本质不是数组)  数组是容器
                如果多个元素都有相同的class名字,得到多个DOM元素
                如果就一个标签有class名字,得到的也是一个伪数组,里面只有一个元素
                getElementsByClassName 用的不多  对于低版本的浏览器兼容性不太好

2.6 document.getElementsByTagName(“p”);

根据标签名来获取DOM元素
      得到的也是一个伪数组 只要是一个伪数组,就可以通过下标得到具体的元素

2.7 document.getElementsByName()

根据标签上的name属性得到的对应的DOM元素
      得到的也是一个伪数组

2.8 document.querySelector(“选择器”);

根据选择器查找页面上对应的DOM元素
      .box1是一个class选择器 如果有多个,得到的满足条件的第1个

2.9 document.querySelectorAll(".box1")

获取多个元素 也是一个伪数组

<body>
    <p class="item">这是一个p标签2</p>
    <span name="x1">我是一个span标签</span>
    <h1 id="box1">hello DOM 1 ~</h1>
    <h1 class="box1">hello DOM 2 ~</h1>
    <h1 class="box1">hello DOM 3 ~</h1>
    <script>
=============================1)document.documentElement  得到整个文档(html元素)
        // let html = document.documentElement;
        // console.log(html);
        console.log(document.documentElement);
        console.log("---------------------------");
=============================2)document.head 得到head元素
        // let head = document.head
        // console.log(head);
        console.log(document.head);
        console.log("---------------------------");
=============================3)document.body 得到body元素
        // let body = document.body
        // console.log(body);
        console.log(document.body);
        console.log("---------------------------");
=============================4)getElementById()  根据一个ID获取DOM元素
        // let div = document.getElementById("box")
        // console.log(div);
        console.log(document.getElementById("box1"));
        console.log("---------------------------");
=============================5)document.getElementsByClassName() 根据class名字获取页面上的DOM元素(获取多个)
        //   得到的是一个类数组(伪数组)  数组是容器
        // let ps = document.getElementsByClassName("item")
        // console.log(ps);
        console.log(document.getElementsByClassName("box1"));
        console.log("---------------------------");
=============================6)document.getElementsByName()  根据标签名来获取DOM元素
        // let ps = document.getElementsByTagName("p");
        // console.log(ps);
        console.log(document.getElementsByTagName("p"));
        console.log("---------------------------");
=============================7)document.getElementsByName()  根据标签上的name属性得到的对应的DOM元素
        // let spans = document.getElementsByName("x1")
        // console.log(spans[0]);
        // console.log(spans[1]);
        console.log(document.getElementsByName("x1"));
        console.log("---------------------------");
=============================8)document.querySelector("选择器");  根据选择器查找页面上对应的DOM元素
        // .box1是一个class选择器  如果有多个,得到的满足条件的第1个
        // let box = document.querySelector(".box1");
        // console.log(box);
        console.log(document.querySelector(".box1"));
        console.log("---------------------------");
=============================9)document.querySelectorAll(".box1") 获取多个元素 也是一个伪数组
        // let h1s = document.querySelectorAll(".box1");
        // console.log(h1s);
        console.log(document.querySelectorAll(".box1")[1]);
        console.log("---------------------------");
=============================10)document.title 获取当前页面title名
        console.log(document.title)
        console.log(document.title="你好测试")
    </script>
</body>

3 操作属性节点

3.1 标准属性和自定义属性:

        <div class="box" id="xxx" title="hello" abc="123" xyz="666" data-mn="888">我是div~</div>
        标准属性:指的是html中规定好的属性  class  id  title
        自定义属性:程序员自己写的属性  abc  xyz叫自定义属性
            在H5中规定,如果是自定义属性,最好使用data-打头  data-mn="888"

3.2 操作属性节点:

        属性节点是位于元素节点上面的。      获取属性节点,首先要得到元素节点。
        有两种方案,可以得到对应的属性节点:
            1)打点形式   div.className  input.type  img.alt
            2)getAttribute()  div.getAttribute("class")  input.getAttribute("type")
            区别:
                1)打点形式只能获取标准属性
                2)getAttribute()可以获取自定义属性,也能获取标准属性
            如果自定义属性是以data-打头,获取如下:
            <div class="box" data-mn="xixi">我是div~</div>
            console.log(div.dataset.mn);
            对于class需要特别注意,不能写class,需要换成className
<body>
    <div class="box" title="hello" abc="123" data-mn="xixi">我是div~</div>
    <input type="text">
    <img src="" alt="hello">
        <script>
        let div = document.querySelector("div")
        // 因于class在JS中是关键字,不能直接写class,需要给class换一个名字,换成className
        // console.log(div.className);
        // console.log(div.getAttribute("class"));  // 不需要改名字
        // console.log(div.abc); // 通过打点形式去拿自定义属性 不OK
        // console.log(div.getAttribute("abc"));
        console.log(div.dataset.mn);

        let input = document.querySelector("input")
        // console.log(input.type);
        console.log(input.getAttribute("type"));

        let img = document.querySelector("img")
        // console.log(img.alt);
        console.log(img.getAttribute("alt"));
    </script>
</body>

3.3 设置属性节点:

1)打点形式 div.title = "hello" 不能设置自定义属性
2)setAttribute() 可以设置自定义属性
<body>
    <div>我是div~</div>
        <script>
        let div = document.querySelector("div")
        // div.title = "hello"
        // div.id = "box"
        // div.abc = "xixi"
        div.setAttribute("title","hi")
        div.setAttribute("abc","hehe")
        div.style.color="red";//咔咔咔咔咔咔扩扩扩扩扩扩扩扩扩扩扩
        div.setAttribute("title","hihihi")
        // div.setAttribute("title","")
    </script>
</body>

4 操作class属性

    操作类名:
        1)设置类名:
            元素.className="box"
        2)修改类名:
            元素.className="新值"
        3)追加类名:
            元素.className = 元素.className + " 新类名"  在新类名前面需要有一个空格
        4)删除类名:
            获取类型  置为空  截取字符串  循环遍历 删除你要删除的类型

    对于类名的操作,还有种形式:
        元素上有一个属性,叫classList   它里面就包含了所有的类名
        classList.add()
            添加类型
        classList.remove()
            删除类型
        classList.toggle()     
            (切换)有就删除,没有就添加
        ....
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title>Document</title>
    <style>
        div{
            width: 100%;
            height: 50px;
            background:gold;
        }
        .box{
            border: 10px solid red;
        }
        .box2{
            border: 20px solid blue;
        }
        .box3{
            color: red;
        }
    </style>
</head>
<body>
    <button id="btn">点我</button>
    <div class="box">我是div标签</div>
    <script>
        let div = document.getElementsByTagName("div")[0]
        btn.onclick = function(){
            // div.className = "box"; // 设置类名
            // div.className = "box2" // 元素.className="新值"
            // div.className = div.className + " box3"
            // div.className = ""; // 删除类名
            // div.classList.add("box")
            // div.classList.remove("box")
            div.classList.toggle("box")
        }
    </script>
</body>
</html>

5 操作文本节点

    innerHTML:  用的最多的
        可读可写,针对的是标签中的内容
        读:获取标签中所有的内容,包含里面的所有的子标签  
           文本+标签
        写:box.innerHTML = "<strong>我是一个div</strong>"

    ----------------------
    innerText: 用的不多
        只针对文本,并不能获取标签

    ----------------------
    value:针对输入框中的文本节点
     <div>
         hello
         <p>你好</p>
         hello
     </div>
     <div id="box"></div>

   <script>
        let div = document.getElementsByTagName("p")[0]
        console.log(div);
        // 获取文本节点
        console.log(div.innerHTML);
        div.innerHTML="这都是少时诵诗书所所所"

        let box = document.getElementById("box")
        // 设置文本节点
        box.innerHTML = "<strong>我是一个div233</strong>"
    </script> 
    <!-- <script>
        let div = document.getElementsByTagName("div")[0]
        console.log(div.innerText);

        let box = document.getElementsByTagName("div")[1]
        box.innerText = "<strong>hello 你好~</strong>"
    </script> -->

    <script>
        let input = document.getElementsByTagName("input")[0];
        // console.log(input.value);
        input.value = "xxx"
    </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React中的虚拟DOM和真实DOM是用于构建用户界面的两个不同的概念。虚拟DOM是React中的一种技术,它是通过在内存中创建一个轻量级的JavaScript对象来表示DOM结构的副本。这个副本被称为虚拟DOM树。React使用虚拟DOM来表示用户界面的状态,并根据需要对其进行更新。 真实DOM则是浏览器中实际存在的DOM树,它是由HTML文档解析而来,并且直接与用户交互。当使用React创建虚拟DOM后,React会比较虚拟DOM和真实DOM之间的差异,并且仅更新真实DOM中需要改变的部分,从而提高性能和效率。 虚拟DOM的主要优势在于它可以在内存中进行快速的操作和计算,而不会直接影响到真实DOM。这使得React可以通过一系列优化算法来批量更新DOM,从而减少了对浏览器的重绘和重排,提高了性能。 总结来说,React的虚拟DOM是通过在内存中创建一个轻量级的JavaScript对象来表示DOM结构的副本,而真实DOM是浏览器中实际存在的DOM树。React使用虚拟DOM来管理用户界面的状态,并将其转化为真实DOM更新到浏览器中。这种机制提高了React应用的性能和效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?](https://blog.csdn.net/echolunzi/article/details/125586796)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值