JavaScript-DOM(重点)

Posted 小小荧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript-DOM(重点)相关的知识,希望对你有一定的参考价值。

DOM

概念

所谓DOM,其实就是 Document Object Model文档对象模型,毫无疑问,这个东西是让我们去操作对象的,那什么是对象呢?其实就是文档的对象。,在文档中一切皆为对象,比如html,body, p,div等等这些都是文档的对象。通过操作这些对象我们可以对这些文档对象进行有趣的操作,比如点击div然后div随机变换背景色。

解析过程

HTML加载完成,渲染引擎会在内存中把html生成一个DOM树,我们可以通过js的选择节点操作去获取DOM上的元素节点,然后就可以对这个元素进行一系列的操作,最后又会被渲染树渲染后页面中。

DOM树一切皆为节点

技术图片

在上图HTML中就可以显示出一切皆为节点

  • 元素节点:HTML标签
  • 属性节点:标签的属性
  • 文本节点:标签中的文字
DOM可以做什么?
  • 找对象(元素节点)
  • 设置元素属性值
  • 设置元素样式
  • 动态创建和删除元素
  • 事件的触发响应:事件源、事件、事件的驱动
获取DOM结构
  • 获取文档对象:document
  • 获取html:document.documentElement
  • 获取body: document.body
获取其他的DOM节点
        // id选择器
        var box = document.getElementById("box");
        // 类选择器
        var box = document.getElementsByClassName("box");
        // 标签选择器
        var box = document.getElementsByTagName("div");
        // css通用选择器
        var box = document.querySelector(".box");

事件

事件三要素
  • 事件源(引起事件的标签)
  • 事件(js已定义好的事件)
  • 事件驱动程序(对节点的操作)
常用的事件如下:

技术图片

绑定事件的方式

直接绑定匿名函数

        // id选择器
        var box = document.getElementById("box");
        box.onclick = function(){
            alert("我触发了点击事件");
        }

先单独定义函数,在绑定

        var box = document.getElementById("box");
        box.onclick = click();
        function click() {
            alert("我触发了点击事件");
        }

行内绑定(不推荐)

    <div id="box" class="box" onclick="click();"></div>
    <script>
        function click() {
            alert("我触发了点击事件");
        }
    </script>

javascript入口函数 window.onload()

此函数调用,是当页面加载完毕(文档图片),触发onload函数

<script type="text/javascript">
    window.onload = function () {
        console.log("alex");  //等页面加载完毕时,打印字符串
    }
</script>

样式属性操作

    <div id="box" class="box" onclick="click();"></div>
    <script>
        var box = document.getElementById("box");
        box.onclick = function(){
            // 设置盒子的背景颜色
            this.style.backgroundColor = "blue";
        }
</script>

值得操作

值得操作又分为双标签和单标签

  • 双标签 我们可以使用innerHTMLinnerText
  • 单标签 只能使用value获取值和设置值
<div id='box'></div>
<input type='text' value = 'alex' id='user'>
<script>
    window.onload = function(){
        //1.获取事件源(事件对象,在文档中一切的标签都是对象)
        var oDiv = docuement.getElementById('box');
         var oInput = docuement.getElementById('user');
        //2.事件
        oDiv.onclick = function(){
            //3.事件驱动程序  
            oDiv.innerText = 'alex';//仅仅设置文本内容
            oDiv.innerHTML = '<h1>alex</h1>';//将标签和文本内容一起解析
        };

        //2.事件
        oInput.onclick = function(){
            //3.事件驱动程序   只有有value属性的 才能使用value赋值和设置值
            oInput.value = 'hhhh';
        }
    };

</script>

标签属性操作

<script>
        //window.onload页面加载完毕以后再执行此代码
        window.onload = function () {
            //需求:鼠标放到img上,更换为另一张图片,也就是修改路径(src的值)。
            //步骤:
            //1.获取事件源
            //2.绑定事件
            //3.书写事件驱动程序

            //1.获取事件源
            var oImg = document.getElementById("box");
            //2.绑定事件(悬停事件:鼠标进入到事件源中立即出发事件)
            oImg.onmouseover = function () {
                //3.书写事件驱动程序(修改src)
                img.src = "image/jd2.png";
//                this.src = "image/jd2.png";
            }

            //2.绑定事件(悬停事件:鼠标进入到事件源中立即出发事件)
            oImg.onmouseout = function () {
                //3.书写事件驱动程序(修改src)
                img.src = "image/jd1.png";
            }
        }
    </script>

节点操作

创建节点
新的标签(元素节点) = document.createElement("标签名");
<script type="text/javascript">
    var a1 = document.createElement("li");   //创建一个li标签
    var a2 = document.createElement("adbc");   //创建一个不存在的标签

    console.log(a1);
    console.log(a2);

    console.log(typeof a1);
    console.log(typeof a2);
</script>

技术图片

插入节点

父节点.appendChild(新的子节点);

    <div id="parent">
        <div id="child">我是儿子</div>
    </div>
    <script>
        var parent = document.getElementById("parent");
        var ele = document.createElement("p");
        ele.innerHTML = "我是追加元素"
        // 会在父元素内的某位添加一个节点
        parent.appendChild(ele);
    </script>

技术图片

父节点.insertBefore(新的子节点,参考节点);

    <div id="parent">
        <div id="child">我是儿子</div>
    </div>
    <script>
        var parent = document.getElementById("parent");
        var ele = document.createElement("p");
        var child = document.getElementById("child");
        ele.innerHTML = "我是追加元素"
        //会在父节点下的以一个节点为参考,添加到这个参考元素的前面
        parent.insertBefore(ele, child);
    </script>

技术图片

删除节点

父节点.removeChild(子节点);

    <div id="parent">
        <div id="child">我是儿子</div>
    </div>
    <script>
        var parent = document.getElementById("parent");
        var ele = document.createElement("p");
        var child = document.getElementById("child");
        // 删除子节点
        parent.removeChild(child);
    </script>

技术图片

兄弟节点
  • 节点.nextSibling
  • 节点.previousSibling
  • 节点.nextElementSibling
  • 节点.previousElementSibling
    <div id="parent">
        <div>我是前兄弟</div>
        <div id="child">我是儿子</div>
        <div>我是后兄弟</div>
    </div>
    <script>
        var parent = document.getElementById("parent");
        var ele = document.createElement("p");
        var child = document.getElementById("child");
        ele.innerHTML = "我是DOM节点"
        console.log(child.nextSibling);
        console.log(child.nextElementSibling);
        console.log(child.previousSibling);
        console.log(child.previousElementSibling);
    </script>

技术图片

DOM的案例

模态框
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            html,body{
                height: 100%;
            }
            #box{
                width: 100%;
                height: 100%;
                background: rgba(0,0,0,.3);
            }
            #content{
                position: relative;
                top: 150px;
                width: 400px;
                height: 200px;
                line-height: 200px;
                text-align: center;
                color: red;
                background-color: #fff;
                margin: auto;
            }
            #span1{
                position: absolute;
                background-color: red;
                top: 0;
                right: 0;
                width: 30px;
                height: 30px;
                line-height: 30px;
                text-align: center;
                color: #fff;

            }
        </style>
    </head>
    <body>
        <button id="btn">弹出</button>
    </body>
    <script type="text/javascript">
        //获取dom元素 1.获取事件源
        var oBtn = document.getElementById('btn');
        //创建弹出模态框的相关DOM对象
        var oDiv = document.createElement('div');
        var oP = document.createElement('p');
        var oSpan = document.createElement('span');


        // 设置属性
        oDiv.id = 'box';
        oP.id = 'content'
        oP.innerHTML = '模态框成功弹出'
        oSpan.innerHTML = 'X';
        oSpan.id = 'span1'

        // 追加元素
        oDiv.appendChild(oP);
        oP.appendChild(oSpan);

        // 点击弹出按钮 弹出模态框
        oBtn.onclick = function(){
            //动态的添加到body中一个div
            this.parentNode.insertBefore(oDiv,oBtn)

        }
        // 点击X 关闭模态框
        oSpan.onclick = function(){
            // 移除oDiv元素
            oDiv.parentNode.removeChild(oDiv)
        }   

    </script>
</html>

技术图片

tab选项卡
<!DOCTYPE html>
<!--
 * @Descripttion: 
 * @version: 
 * @Author: 小小荧
 * @Date: 2020-03-06 21:20:00
 * @LastEditors: 小小荧
 * @LastEditTime: 2020-03-06 22:43:35
 -->
<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>
        body {
            margin: 0;
            padding: 0;
        }

        #box {
            width: 300px;
            height: 200px;
            border: 1px solid black;
            margin: 0 auto;
        }

        .content {
            text-align: center;
            position: relative;
        }

        .content .box {
            width: 100%;
            height: 100%;
            font-size: 100px;
            line-height: 100px;
            position: absolute;
            display: none;
        }

        .btn.active {
            color: aliceblue;
            background: #000000;
        }

        .box.active {
            display: block;
            z-index: 1;
        }
    </style>
</head>

<body>

    <div id="box">
        <button class="btn active">1</button>
        <button class="btn">2</button>
        <button class="btn">3</button>
        <div class="content">
            <div class="box active">1</div>
            <div class="box">2</div>
            <div class="box">3</div>
        </div>

    </div>
    <script>
        // 3.tab选项卡效果
        /* 
            按钮选中时会在按钮上设置一个active的classname,这样就会具有active的样式,同时我们在将原牛对应的内容设置classname和之前的对应的按钮内容的classname的active清除
         */
        /**
         * @name: removeClassName
         * @test: 
         * @msg: 删除之前的含有active的classname
         * @param {type} 
         * @return: 
         */
        function removeClassName(btns, contents, classname) {
            // 循环遍历
            for (var i = 0; i < btns.length; i++) {
                // 获取每一个按钮的classnanmes
                var btn_class_names = btns[i].getAttribute("class").split(" ");
                var content_class_name = contents[i].getAttribute("class").split(" ");
                // 如果找到了和这个class那么说明就是之前的那个active,我们需要把它的active的属性值删除然后重新为他设置未选中状态的属性值
                var btn_index = btn_class_names.indexOf(classname);
                var content_index = content_class_name.indexOf(classname);
                if (btn_index !== -1) {
                    btn_class_names.splice(btn_index, 1);
                    // 处理完成之后我们在吧处理好的classname重新设置给按钮的class
                    btns[i].className = btn_class_names.join(" ");
                }
                if (content_index !== -1) {
                    content_class_name.splice(content_index, 1);
                    contents[i].className = content_class_name.join(" ");
                }
            }
        }
        /**
         * @name: toggleTab
         * @test: 
         * @msg: 切换选项卡
         * @param {type} 
         * @return: 
         */
        function toggleTab() {
            //  获取按钮的节点
            var btns = document.getElementsByClassName("btn");
            // 获取按钮下方的内容
            var contents = document.querySelectorAll(".box");
            // 循环监听按钮点击
            for (var i = 0; i < btns.length; i++) {
                btns[i].onclick = function (e) {
                    // 首先我们需要把清除之前的actIve的classname
                    removeClassName(btns, contents, "active");
                    // 将点击的这个按钮的class追加active属性值
                    this.className += " active";
                    // 按钮状态设置完成之后在将按钮对应的内容显示出来,但是我们需要找到选中按钮对用的内容
                    var index = Array.from(btns).indexOf(this);
                    contents[index].className += " active";
                }
            }
        }

        // 调用切换选项卡函数
        toggleTab();
    </script>
</body>

</html>

技术图片

使用js完成伪元素标签的变色效果
<!DOCTYPE html>
<!--
 * @Descripttion: 
 * @version: 
 * @Author: 小小荧
 * @Date: 2020-03-07 22:07:31
 * @LastEditors: 小小荧
 * @LastEditTime: 2020-03-07 22:07:32
 -->
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        button {
            margin: 10px;
            width: 100px;
            height: 40px;
            cursor: pointer;
        }
        .current {
            background-color: red;
        }
    </style>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>

<script>
    //需求:鼠标放到哪个button上,改button变成黄色背景(添加类)


    var btnArr = document.getElementsByTagName("button");
    //绑定事件
    for(var i=0;i<btnArr.length;i++){   //要为每一个按钮绑定事件,所以用到了for循环
        btnArr[i].onmouseover = function () {
            //【重要】排他思想:先把所有按钮的className设置为空,然后把我(this)这个按钮的className设置为current
            //排他思想和for循环连用
            for(var j=0;j<btnArr.length;j++){
                btnArr[j].className = "";
            }
            this.className = "current";  //【重要】核心代码
        }
    }

    //鼠标离开current时,还原背景色
    for(var i=0;i<btnArr.length;i++){   //要为每一个按钮绑定事件,所以用到了for循环
        btnArr[i].onmouseout = function () { //鼠标离开任何一个按钮时,就把按钮的背景色还原
            this.className = "";
        }
    }

</script>

</body>


</html>

技术图片

以上是关于JavaScript-DOM(重点)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript-dom3

JavaScript-DOM(九九乘法表)——两种算法

13-javascript-DOM操作的相关案例

javascript-DOM

JavaScript-DOM节点

JavaScript-DOM(文档对象模型)