DOM

DOM 文档对象模型

JS 运行到 HTML 文件中, 由 HTML 文件提供了 DOM 的能力

比如:

  • 添加一个div
  • 删除一个li
  • 修改一个ol
  • 获取某一个标签的样式
  • 修改某一个标签的样式
  • 给某一个标签添加事件
  • 给某一个标签添加属性

DOM 的核心 是 document

document 是JS 内置的一个对象,北部提供了很多属性和方法,帮助我们便捷的操作页面标签

DOM

  1. 文档对象模型
  2. 标签

DOM_获取标签

获取标签

语法1: document.querySelector('像写CSS选择器一样书写标签')     反回值: 符合条件的第一个标签

语法2: document.querySelectorAll('像写CSS选择器一样书写标签')

返回值: 返回一个符合条件的标签组成的 伪数组

伪数组      长得很像数组,也有下标,也有下标,也有 length ,但是数组的方法,很多都没有

js 复制代码
    //获取到页面的 div 标签 并存储在 一个变量中 oDiv 中 (变量名并不重要)
    var oDiv = document.querySelector('div')
    //console.log(oDiv)
    
    var oSpan = document.querySelector('.spanel')
    //console.log(oSpan)
    
    var mySpan = document.querySelectorAll('.spanel')
    console.log(mySpan)
    //console.log([0])
    
    //1. 自已补全 通过 ID 获取元素
    
    //2. 获取一个页面没有的元素

DOM_获取样式

元素/标签.style  能够拿到 行内 样式,或者给添加一个行内样式

getComputedStyle('要查询样式的标签'),要查询的样式名     能够获取到元素的样式(行内和非行内都可以)     但是获取到的内容是只读的,只允许查询,不允许修改

js 复制代码
    var oDiv = document.querySelecter('div')
    var myDiv = document.querySelect('.box')
    
    console.log(oDiv.style.width)
    console.log(oDiv.style.height)
    console.log(oDiv.style.background-color)         //color is not defined
    console.log(oDiv.style.'background-color')      //语法不支持
    console.log(oDiv.style['background-color'])     //能够获取,但是稍微有点麻烦
    console.log(oDiv.style.backgroundColor)        //推荐写法
    
    
    //因为元素的样式添加在了 类名,也就是非行内的,所以 style 获取不到
    console.log(myDiv.style.width)
    console.log(myDiv.style.height)
    
    getComputedStyle('要查询样式的标签').要查询的样式名
    console.log(getComputedStyle(myDiv).width)
    console.log(getComputedStyle(myDiv).height)
js 复制代码
    //非行内样式 和 行内样式,都能正常获取,但是获取到的值 不能被修改
   console.log(getComputedStyle(oDiv).width)
   
   //getComputedStyle(oDiv).width = '800px'
   
   //修改元素的样式
   myDiv.style.width = '800px'
   myDiv.style.backgroundColor = 'red'

案例(随机背景)

xml 复制代码
    <style>
        body{
            transition: background-color 0.5s ease;
        }
    </style>
    <html>
    <body>
        <button id="btn">点击更改背景色</button>
        
        <script>
            // 0.获取标签
            var btn = document.querySelector('#btn')
            var body = document.qerySelector('body')
            
            //添加时间
                //1.声明一个数组,数组内部存放各种各样的颜色
                //2.点击事件触发的时候,随机从数组内拿到一个颜色
                //3.赋值给 body 的背景色
           //1.声明一个数组,数组内部存放各种各样的颜色
           var arr = ['#000000','#ffffff','#00ff00', '#0000ff', '#ffff00', '#800080', '#ffa500']
           btn,oncilck = function(){
           //2.点击事件触发的时候,随机从数组内拿到一个颜色
           var num = Math.floor(Math.random()*arr.length)
           body.style.backgroundColor = arr[num]
        </script>
    </body>
    </html>

DOM_操作元素类名

元素/标签.className    =>  能够得到元素目前拥有的类名

还可以给这个属性重新赋值,然后修改当前标签的类名

元素/标签.classList     返回值 是一个伪数组     数组内下表对应的是我们每一个类名     value 属性对应的是我们完整类名的字符串

js 复制代码
    var box = document.querySelector('.box1')

        // 1. className
        console.log(box.className)
        box.className = 'box2'   // 当前方式 不管之前有多少类名, 全都重新覆盖掉
        box.className = box.className + ' box2'
        box.className += ' box2'    // 类名之间一定要加 空格
        box.className = ''  // 相当于清空之前的所有类名

        // 2. classList
        console.log(box.classList)

        box.classList.add('box2')   // 向这个标签上在追加一个类名, 原本的类名不受影响
        box.classList.remove('qwe') // 删除指定类名 
        box.classList.remove('asd')

案例_自定义弹出层

js 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        * {
            padding: 0;
            margin: 0;
        }

        html,
        body {
            width: 100%;
            height: 100%;
        }

        .overlay {
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.3);
            position: fixed;
            top: 0;
            left: 0;
        }

        .msg_box {
            width: 280px;
            height: 170px;
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background-color: aliceblue;
            border-radius: 10px;
            padding: 20px;
        }

        .msg_box p {
            margin: 24px;
        }

        .close {
            display: none;
        }

        .show {
            display: block;
        }
    </style>
</head>

<body>
    <!-- 点击打开弹出框 -->
    <button id="show_msg_box">展示弹出框</button>

    <!-- 灰色的遮罩层 -->
    <div class="overlay close"></div>

    <!-- 弹出层的信息展示 -->
    <div class="msg_box close">
        <h1>这是一个自定义弹出层</h1>
        <p>广告位招租</p>
        <!-- 点击关闭弹出层 -->
        <button id="close_msg_box">关闭</button>
    </div>

    <script>
        // 0. 获取标签
        var showMsgBox = document.querySelector('#show_msg_box')
        var closeMsgBox = document.querySelector('#close_msg_box')
        var overlay = document.querySelector('.overlay')    // 遮罩层
        var msgBox = document.querySelector('.msg_box')     // 信息框

        // 添加事件

        // 1. 打开弹窗框    遮罩层和弹出框的信息展示
        showMsgBox.onclick = function () {
            // 拿遮罩层举例, 删掉 close 添加类名 show
            overlay.classList.remove('close')
            overlay.classList.add('show')
            // 信息框和上边的遮罩层相同
            msgBox.classList.remove('close')
            msgBox.classList.add('show')
        }

        // 2. 关闭弹出框    遮罩层和弹出框的信息隐藏
        closeMsgBox.onclick = function () {
            // 删掉 show, 添加 close
            overlay.classList.remove('show')
            overlay.classList.add('close')

            msgBox.classList.remove('show')
            msgBox.classList.add('close')
        }
    </script>
</body>

</html>

操作元素属性

1.获取标签属性

js 复制代码
    console.log(box.getAttribute('class'))
    var res = box.getAttribute('qew')
    console.log(res)

2.设置标签属性

js 复制代码
        box.setAttribute('my_qwe', '这是通过 JS 添加的一个自定义属性')
        box.setAttribute('class', 'qf001')
        box.setAttribute('qwe', '通过 JS 将 qwe 的属性值 进行了一个修改')

3.H5新增自定义属性

h5自定义属性在书写的时候有一个固定的开头就是 data-     完整语法:data-属性名=属性值

获取的语法:       元素/标签.dataset.属性名(属性名不要带data-)

注意点:在设置时,不要采用驼峰,全小写,因为哪怕你写大了,浏览器也会转换成小写

案例_全选

js 复制代码
    <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    全选: <input type="checkbox" class="all_btn">
    <hr>
    <input type="checkbox" class="item"> 兴趣1
    <input type="checkbox" class="item"> 兴趣2
    <input type="checkbox" class="item"> 兴趣3
    <script>
        // 0. 获取标签
        var allBtn = document.querySelector('.all_btn')
        var items = document.querySelectorAll('.item')

        // 1. 给全选按钮添加点击事件
        allBtn.onclick = function () {
            for (var i = 0; i < items.length; i++) {
                items[i].checked = allBtn.checked
            }
        }


        // 2. 给所有的兴趣爱好添加事件
        // 因为 items 是一个伪数组, 所以不能添加点击事件, 只有页面的元素/标签 才能添加
        // items.onclick = function () {}


        // items[0].onclick = function () { console.log(123) }
        // items[1].onclick = function () { console.log(123) }
        // items[2].onclick = function () { console.log(123) }

        // 因为上述的代码比较复杂, 所以可以使用 一个循环进行优化 (前提是, 这几个函数的事件是一样的, 而我们目前案例中就是相同的事件功能)
        // for (var i = 0; i < items.length; i++) {
        //     items[i].onclick = function () {
        //         console.log(123)
        //     }
        // }



        // console.log(setItemChecked) // 是一个函数体
        // console.log(setItemChecked())   // undefined
        // 拆分代码, 进行代码的优化(可读性)
        for (var i = 0; i < items.length; i++) {
            items[i].onclick = setItemChecked
            // items[i].onclick = setItemChecked()
        }

        function setItemChecked() {
            // console.log('判断内部的所有兴趣有没有被选中, 如果有那么选中 全选')

            // 1. 要知道现在有没有全部选中 所有兴趣
            var num = 0
            for (var k = 0; k < items.length; k++) {
                items[k].checked && num++
            }
            // console.log(num, items.length, num === items.length)

            // 2. 根据上边的结果, 决定是否选中 全选
            allBtn.checked = num === items.length
        }
    </script>
</body>

</html>
相关推荐
DT——2 小时前
Vite项目中eslint的简单配置
前端·javascript·代码规范
学习ing小白4 小时前
JavaWeb - 5 - 前端工程化
前端·elementui·vue
真的很上进4 小时前
【Git必看系列】—— Git巨好用的神器之git stash篇
java·前端·javascript·数据结构·git·react.js
胖虎哥er4 小时前
Html&Css 基础总结(基础好了才是最能打的)三
前端·css·html
qq_278063714 小时前
css scrollbar-width: none 隐藏默认滚动条
开发语言·前端·javascript
.ccl4 小时前
web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)
前端·javascript·vue.js
小徐不会写代码4 小时前
vue 实现tab菜单切换
前端·javascript·vue.js
2301_765347545 小时前
Vue3 Day7-全局组件、指令以及pinia
前端·javascript·vue.js
ch_s_t5 小时前
新峰商城之分类三级联动实现
前端·html
辛-夷5 小时前
VUE面试题(单页应用及其首屏加载速度慢的问题)
前端·javascript·vue.js