JS - DOM和BOM的概念 - 01

BOM : BOM是浏览器对象模型,是BrowserObject Model的缩写。它提供了一整套的从浏览器相关的前端页面相关的api.

DOM : 就是文档对象模型,是DocumentObject Model的缩写。是对HTML文档页面进行编程控制的一系列接口API. 它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。

BOM + DOM完整结构图:

1.document对象:

 案例:01-document的属性

<!DOCTYPE html>
<!-- document.URL  document.title  document.log -->
<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>
</head>
<body>
    <script>
        // document.URL 可以获取当前文档的地址
        console.log(window.document.URL);

        // document.title  获取或者是设置 head标签中的title标签的文本内容
        console.log(document.title);

        //更换标题属性
        document.title = '哈哈哈';
        console.log(document.title);

        // 查看文档的字符集编码
        console.log(document.charset);
    </script>
</body>
</html>

案例:02-浏览器时钟

<!DOCTYPE html>
<!-- setInterval setTimeOut clearInterval() -->
<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>浏览器时钟</title>
</head>
<body>
    <script>
        //window.setInterval();
        //可以传两个参数:
        //1.要执行的代码段(可以是一个函数,也可以是一段代码字符串)
        //2.要间隔执行代码段的毫秒数

        var t = setInterval(function(){  //每隔一秒打印一次
            console.log(1);
            console.log(new Date());
        },1000);

        // 不推荐使用,代码字符串的方式
        // setInterval("console.log(new Date());",2000);

        //setTimeOut(func, delay); //延迟delay毫秒之后,执行代码段(函数) 但只执行一次
        setTimeout(function(){
            console.log('hi ChengCheng !!');
            // 停止上面的时钟
            console.log(t);
            clearInterval(t);  // 停止间断循环执行的 setInterval时钟
        }, 5000);

    </script>
</body>
</html>

案例:03-标题跑马灯案例

<!DOCTYPE html>
<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>标题跑马灯案例</title>
</head>
<body>
    <script>
        // console.log(document.title);
        //每隔0.5秒,让title最后一个文字放到title最前面去.
        //1s == 1000ms;
        setInterval(function(){
            //让title最后一个文字放到title最前面去
            //使用字符数组的办法
            //数组有: pop方法可以从数组的最后位置弹出一个元素
            //       unshift方法可以从数组的头部添加元素

            //把字符串转换为字符串数组
            var charArray = document.title.split("");

            //让字符数组的最后的一个元素出数组
            var lastChar = charArray.pop();

            //把最后的一个元素插入到数组的开头
            charArray.unshift(lastChar);

            //把字符数组转成字符串
            var newTitle = charArray.join("");

            //把新的标题改到浏览器上去
            document.title = newTitle;

        }, 500);


    </script>
</body>
</html>

案例:04-slice实现跑马灯效果

<!DOCTYPE html>
<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>123456</title>
</head>
<body>
    <script>
        //实现跑马灯效果
        var intervalID = setInterval(function(){
            //拿到当前的页面的title
            var oldTitle = document.title;

            // 拿到当前也米娜title的最后一个字符
            // slice方法,可以接收两个参数
            // 第一个参数: 截取字符串起始位置.第二个参数是结束位置
            // slice方法不影响原始的字符串,截取到结束位置的前一个元素.
            var lastChar = oldTitle.slice(oldTitle.length - 1);
            var beforeStr = oldTitle.slice(0,oldTitle.length - 1);
            document.title = lastChar + beforeStr;
        }, 500);

        // 5秒钟之后,执行清除时钟的代码
        setTimeout(function(){
            clearInterval(intervalID);
        }, 5000);

    </script>
</body>
</html>

2.访问DOM树上的节点:

案例: 05-getElementById案例

<!DOCTYPE html>
<!-- getElementById('') -->
<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>getElementById案例</title>
</head>
<body>
    <p id="p1">段落1</p>
    <p id="p2">段落2</p>
    <p id="p3">段落3</p>

    <div class="" id="d1">div</div>

    <!-- 获得段落2的标签对象 -->
    <script>
        // 根据标签的id的值在文档中搜索标签
        var elementP = document.getElementById('p2');
        console.log(elementP);

        // 继承关系
        //elementP内部原型 - HTMLParagraphElement(段落标签的原型) - 
        // - HTMLElement(所有HTML标签的基类接口) - Element - Node - EventTarget - Object -null
        //接口: 有自己规定的方法,属性.但必须有子类给他实现. Element/Node
        //类型: 可以直接创建实例.比如:Number类型.

        var d1 = document.getElementById('d1');
        //d1 -> HTMLDivElement

        var d2 = document.getElementById('huoqubudao');
        // d2 -> null  一般情况如果函数额米有具体的值.一般都会返回null
        
    </script>
</body>
</html>

案例: 06-Element接口详解

<!DOCTYPE html>
<!-- Element.attributes  Element.className  Element.innerHTML Element.tagName
    getAttribute(attName)  removeAttribute(attrName)  setAttribute(name,value)  hasAttribute()
-->
<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>接口详解</title>
</head>
<body>

    <div id="d1" class="ts" chengcheng="sss">
        <span>你好啊</span>
        <p>我是张宜成</p>
    </div>

    <script>
        //获取到id = d1的div标签
        var d1 = document.getElementById('d1');
        //d1: HTMLDivElement HTMLElement Element

        // d1.attribute 遍历拿到它的所有属性
        console.log(d1.attributes);

        // 获得某个具体属性的值  d1.attributes[0]
        d1.attributes.item(0);
        
        // 设置某个属性的值
        d1.setAttribute("chengcheng","234");

        // 获取某个属性的值
        console.log(d1.getAttribute("class")); 
        //d1.className  -> 直接拿到类名
        //d1.innerHTMl 

        // 删除属性
        d1.removeAttribute('chengcheng');

        // Element对象: 元素,是所有标签元素的基础对象,封装了所有标签元素的公共方法和属性
        // 常用属性:
        // Element.attributes 获得所有属性key-value集合
        // Element.className 获得类名
        // Element.innerHTML 获取元素内部包裹的html标签字符串
        // Element.tagName (只读) 获取元素内部包裹的html标签字符串
        // 常用方法:
        // Element.getAttribute(attName) 返回属性的字符串值
        // Element.removeAttribute(attrName) 从指定的元素中删除一个属性
        // Element.setAttribute(name,value) 设置属性
        // Element.hasAttribute() 检测属性是否存在
        // Element.getElementsByClassName()
        // Element.getElementsByTagName()

    </script>
</body>
</html>

案例: 07-获取getElementByTagName

<!DOCTYPE html>
<!-- getElementsByTagName innerHTML -->
<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>getElementByTagName</title>
</head>
<body>
    <p>1-1</p>
    <p>2-2</p>
    <p>3-3</p>
    <p>4-4</p>
    <h1>哈哈</h1>
    <div class="tem">混淆</div>

    <script>
        // 把页面中所有的p标签选择出来
        // 获取当前文档中的所有的p标签
        var array = document.getElementsByTagName('p');
        //此方法返回:HTMLCollection集合对象,是一个伪数组
        // array -> HTMLCollection -> Object.prottype
        console.dir(array);

        // 要求:把当前页面中所有的p标签的内部文字打印
        for(var i = 0; i < array.length; i ++){
            console.log(array[i].innerHTML);
        }

    </script>
</body>
</html>

案例: 08-HTMLCollection接口详解

<!DOCTYPE html>
<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>08-HTMLCollection接口详解</title>
</head>

<body>
    <p name="p1">k1k</p>
    <p name="p2">k2k</p>
    <p>k3k</p>

    <div class="pss1">hi,1</div>
    <div class="pss2">hi,2</div>
    <div class="pss3">hi,3</div>

    <script>
        //把当前页面中所有的标签都获取来.
        var all = document.getElementsByTagName('*');
        // all -> HTMLCollection
        for (var i = 0; i < all.length; i++) {
            console.log(all[i]);
        }

        // 将HTMlCollection转成真正的数组
        // Array.prototype.slice.call(c);

        // HTMLCollection: 是动态集合.当标签发送变化的时候,HTMLCollection会自动同步更新.
        // HTMLCollection:item()通过索引获取标签对象Element, 同[]
        // HTMLCollection:nameItem()通过标签的属性名获取标签元素.

    </script>
</body>

</html>

案例: 09-querySelect方法详解

<!DOCTYPE html>
<!-- querySelector -->
<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>querySelect</title>
</head>
<body>
    <div class="c1">第一个div</div>
    <p class="tm">哈哈哈</p>
    <h3 id="tmd">这是h3标签</h3>

    <script>
        //querySelector可以接受一个css的选择器字符串作为参数,来搜索页面中的标签元素.
        var element1 = document.querySelector(".c1");
        console.dir(element1);
        var p1 = document.querySelector('.c1');
        var h = document.querySelector("#tmd");
        var p2 = document.querySelector('p');
    </script>
</body>
</html>

案例: 10-querySelectAll方法详解

<!DOCTYPE html>
<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>querySelectAll方法详解</title>
</head>
<body>

    <p>ss1</p>
    <p class="tm">ss2</p>
    <p class="tm">ss3</p>

    <script>
        // 把页面中所有的p标签包含tm样式类的标签选取出来.
        var arr = document.querySelectorAll('p.tm');
        // arr伪数组不会自动更新
        // arr是一个NodeList接口的实例 NodeList的原型是Object.prototype
        console.log(arr);

        //forEach接收一个函数进行对数组中的元素进行处理.
        // 函数的第一个参数是数组的元素,第二个参数是元素对应的索引
        arr.forEach(function(elem, index){
            console.log(index + ':' +elem.innerHTML);
        });

        //转化成真正的数组,数组原型的slice方法借用调用
        // Array.prototype.slice.call(c); 
    </script>
</body>
</html>

3.Element元素对象(接口)详解

4.HTMLCollection元素对象(接口)详解

5.了解Node对象(接口)

6.NodeList对象节点集合

7.DOM继承关系图

源代码下载地址: https://github.com/godlikecheng/JavaScript_complete

下一篇: JS - 事件的概念 - 02

猜你喜欢

转载自blog.csdn.net/qq_40820862/article/details/81777569