学JS你不会DOM算真的学会了吗?

来来来,JavaScript核心基础语句送给你们
学JS你不会DOM算真的学会了吗?
对JavaScript中的 事件 进行疯狂 处理
用BOM来实现轮播图效果
我们来实现创建JavaScript中的自定义对象
JS中构造函数的原型prototype
还不明白JS中的内置对象吗? 快来这里!
JavaScript中数据如何存储在客户端?带你看看Cookie和WebStorage

关于DOM

1. DOM简介

Document Object Model 文档对象模型

浏览器加载HTML文档时,会将HTML文档解析为一个树形结构,称为DOM树

  • HTML文档和DOM树是一 一对应的关系
  • 当DOM树被修改时,与值对应的HTML文档也会随之改变
  • 当需要对HTML中的内容进行动态改变时,可以使用DOM来进行操作
  • DOM提供了一组用来操作HTML文档的API,即提供一套属性、方法和事件
  • 树上的每一个结点都是一个DOM对象,树的顶层为document对象

在这里插入图片描述

2. document对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        /* 
         *  document对象,表示整个文档
         */
        

        /* document.bgColor设置文档颜色属性 */
        function doBgColor() {
            document.bgColor='red';
        }
        /* document.title设置文档标题属性 */
        function doTitle() {
            document.title='DOM';
        }
        /* document.body设置文档主体属性 */
        function doBody() {
            //向body内添加一个文本结点
            document.body.appendChild(document.createTextNode('吗吗哈哈'));
        }
    </script>
</head>
<body>
    <button onclick="doBgColor()">设置页面背景</button>
    <button onclick="doTitle()">设置页面标题</button>
    <button onclick="doBody()">操作页面主体</button>
    <h3>喝光大佬的卡布奇诺</h3>
</body>
</html>
3. 查询操作

获取DOM对象

方法含义
document.geyElementById('id值')根据id属性来查询节点,返回匹配的第一个节点
document.getElementsByName('name属性值')根据name属性来查询,返回所有匹配的节点集合
document.getElementsByTagName("标签名")根据标签名来查询,返回所有匹配的节点集合
document.getElementsByClassName("类名")根据class属性查询,返回所有匹配的节点集合
document.querySelector("选择器")根据css选择器来查询,返回匹配的第一个节点
document.querySelectorAll("选择器")根据css选择器来查询,返回所有匹配的节点集合
node.getElementsByTagName("标签名")在当前节点的内部根据标签名来查询
node.parentNode属性查询当前节点的父节点
node.children属性查询当前节点的子节点集合,NodeList类型
node.firstElementChild属性查询当前节点的第一个元素子节点
node.lashElementChild属性查询当前节点的最后一个元素子节点
node.previousElementSibling属性查询当前节点的上一个元素节点
node.nextElementSibling属性查询当前节点的下一个元素节点
//使用getElementById方法,根据id来获取对象
<head>
    <script>
       function doQuery(){
           var objDiv = document.getElementById('d');
           console.log(objDiv);
           onsole.log(typeof objDiv);
       }
    </script>
</head>
<body>
    <button onclick='doQuery()'>查询获取页面中的元素</button>
    <div id="d">div</div>
</body>
//使用getElementsByName方法,根据name属性来获取对象
<head>
    <script>
        var objs = document.getElementsByName('hobby');
        console.log(objs);
    </script>
</head>
<body>
    爱好:
    <input type="checkbox" name="hobby" value="eat"> 吃饭
    <input type="checkbox" name="hobby" value="sleep"> 睡觉
    <input type="checkbox" name="hobby" value="paly"></body>
//使用getElementsByTagName方法,根据标签名来获取对象
<head>
    <script>
        var objs = document.getElementsByTagName('div');
        console.log(objs[1]);		//获取三个对象中的第二个
    </script>
</head>
<body>
    <div id='1'>div1</div>
    <div id='2'>div2</div>
    <div id='3'>div3</div>
</body>
<head>
    //根据css选择器获取
    <script>
    	//返回单个对象
        var obj = document.querySelector('div.hello');
        console.log(obj);
        //返回整个集合
        var objs = document.querySelectorAll('div');
        console.log(objs);
    </script>
    <style>
        div .hello{
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>   
</head>
<body>
    <div class='hello'>div1</div>
    <div id='2'>div2</div>
    <div id='3'>div3</div>
</body>
<head>
    //根据已有节点来获取其他节点
    //在当前节点的内部,根据标签名来获取
    <script>
        var ul = document.getElementById('myul');
        var lis = ul.getElementsByTagName('li');
    </script>
</head>

<body>
    <ul id='myul'>
        <li1>1</li1>
        <li2>2</li2>
        <li3>3</li3>
        <li4>4</li4>
        <li5>5</li5>
    </ul>
</body>
<head>
    <script>
        var li2 = document.getElementById('second');
        console.log("父节点:",li2.parentNode);
        console.log("父节点的父节点:",li2.parentNode.parentNode);
        console.log("父节点的所有子节点:",li2.parentNode.children);
        console.log("第一个子节点",li2.parentNode.firstElementChild);
        console.log("最后一个子节点",li2.parentNode.lastElementChild);
        console.log("前一个兄弟节点",li2.previousElementSibling);
        console.log("后一个兄弟节点",li2.nextElementSibling);
    </script>
</head>

<body>
    <ul class='myul'>
        <li1>li1</li1>
        <li2 id='second'>li2</li2>
        <li3>li3</li3>
        <li4>li4</li4>
        <li5>li5</li5>
    </ul>
</body>
4. 访问操作
(1)访问属性

获取/设置DOM对象的属性

DOM对象的属性和HTML标签的属性几乎是一样的,一般情况下DOM对象都会存在一个与之对应的HTML标签同名的属性

两种方式:

  • 直接访问属性

    用法:DOM对象.属性

  • 调用setAttribute()和getAttribute()方法

    DOM对象.setAttribute(“属性名”,“属性值”) 或 DOM对象.getAttribute(“属性名”)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        function doProperty() {
            let obj = document.getElementById('baidu');
            console.log(obj);

            //获取对象的属性
            console.log(obj.href);
            console.log(obj.target);
            console.log(obj.id);
            //或者
            console.log(obj.getAttribute('href'));

            //修改属性的值
            obj.href = "https://www.xina.comc.cn";
            obj.target = "_self";
            obj.id = "xina";
            //或者
            obj.setAttribute('href','https://www.qq.com');
        }
    </script>
</head>
<body>
    <button onclick="doProperty()">访问属性</button>
    <br>
    <a href="https://www.baidu.com" target="_blank" id="baidu">点这里</a>
</body>
</html>

这里有一个特殊的属性checked,它是一个Boolean属性,取值为true或false

<head>
    <script>
        function doProperty(){
            let obj= document.getElementById('male');
            obj.checked=true;
        }
    </script>
</head>
<body>
    <button onclick="doProperty()">访问属性</button>
    
    <input type="radio" name="sex" id="male" value="male" checked><input type="radio" name="sex" id="female" value="female"></body>
(2)访问内容

获取/设置标签中的内容

三种方式:

  • 使用innerHTML

    用法:DOM对象、innerHTML 将内容解析为HTML

  • 使用innerText

    用法:DOM对象、innerText 将内容作为纯文本,出现转义字符时会进行解析

  • 使用textContent

    用法:DOM对象、textContent 将内容作为纯文本,出现转义字符时会直接保留特性

<head>
    <script>
        function doContent(){
            let obj= document.getElementById('mydiv');
            //获取内容
            console.log(obj.innerHTML);
            console.log(obj.innerText);
            console.log(obj.textContent);

            //设置内容
            obj.innerHTML='<h1>hello</h1>';
            obj.innerText='你\n好';
            obj.innertextContent='你\n好';
        }
    </script>
</head>
<body>
    <button onclick="doContent()">访问内容</button>
    
    <div id="mydiv">
        <h2>hello world</h2>
    </div>
</body>
(3)访问CSS

获取/设置CSS属性

三种方式:

  • 使用style属性

    用法:DOM对象.style.样式属性

    如果CSS属性中有短横线,需要去除短横线,然后将其后的单词首字母改成大写字母,如fontsize

<head>
    <script>
        function doStyle(){
        	/**
        	 *	使用style属性
        	 */
            var obj = document.getElementById('mydiv');

            //获取属性
            console.log(obj.style.width);

            //设置属性
            obj.style.backgroundColor='red';
        }
    </script>
</head>
<body>
    <button onclick="doStyle()">访问CSS</button>
    
    <div id="mydiv" style="width: 300px;height: 300px;background-color:pinck">
        <h2>hello world</h2>
    </div>
</body>
  • 使用className属性

    用法:DOM对象.className

<head>
    <style>
        #mydiv {
            width: 300px;
            height: 300px;
            background-color: pink;
        }
        .hello {
            color: red;
            width: 400px;
            font-size: 30px;
            border-radius: 20px;
        }       
    </style>
    <script>
        function doStyle(){
            /**
             *  使用className属性
             */
            var obj = document.getElementById('mydiv');
            obj.className = 'hello';
            console.log(obj.className);          
        }
    </script>
</head>
<body>
    <button onclick="doStyle()">访问CSS</button>
    
    <div id="mydiv" class="world">
        <h2>hello world</h2>
    </div>
</body>
  • 使用classList属性

    用法:DOM对象.classList

    通过classList的add()、remove()进行样式的添加和删除

<head>
    <style>
        #mydiv {
            width: 300px;
            height: 300px;
            background-color: pink;
        }
        .hello {
            color: red;
            width: 400px;
            font-size: 30px;
            border-radius: 20px;
        }
        .world {
            text-decoration: underline;
        }
    </style>
    <script>
        function doStyle(){
            /**
             *  使用className属性
             */
            var obj = document.getElementById('mydiv');
            obj.classList.add('hello');
            obj.classList.add('world');
            console.log(obj.classList); //获取当前DOM对象上的所有类样式     
        }
    </script>
</head>
<body>
    <button onclick="doStyle()">访问CSS</button>
    
    <div id="mydiv" class="world">
        <h2>hello world</h2>
    </div>
</body>
5. 更新操作

结点的创建、添加、修改、删除等

方法含义
document.createElement("标签名")创建一个元素结点,即标签
document.createTextNode("文本内容")创建一个文本结点,即标签中的文本内容
node.appendChild(newNode)将一个新的结点newNode添加到指定的结点node中子节点末尾
node.insertBefore(newNode,refNode)将一个新的结点newNode插入到node结点的子结点redNode之前
node.replaceChild(newNode,redNode)用一个新的结点newNode替换原有的node结点中的子结点refNode
node removeChild(refNode)删除当前结点中指定的子结点
node remove()删除当前结点
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        function doUpdate(){
            //1.创建元素结点
            var li = document.createElement('li');
            //2.设置文本内容
            li.innerHTML = 'li4';
            var text = document.createTextNode(li4);
            li.appendChild(text);
            //3.设置属性
            li.id = 'fourth';
            //4.添加到结点中
            var myul = document.getElementById('myul');
            //添加到末尾
            myul.appendChild(li);
            //添加到指定结点的前面
            myul.insertBefore(li,document.getElementById('second'));
            //替换指定结点
            myul.replaceChild(li,document.getElementById('second'));
            //删除内部某个结点
            myul.removeChild(document.getElementById('second'));
            //删除当前结点
            document.getElementById('second').remove();
        }
    </script>
</head>
<body>
    <button onclick="doUpdate()">更新</button>
    <ul id="myul">
        <li id="first">li1</li>
        <li id="second">li2</li>
        <li>li3</li>
    </ul>
</body>
</html>

在我们学习完这章的内容之后,可以尝试完成一个简单的计算器。

<!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>
        button {
            width: 80px;
            height: 25px;
        }
    </style>
    <script>
        function $(id){
            return document.getElementById(id);
        }
        function calculate(flag){
            var num1 = Number($('num1').value);
            var num2 = Number($('num2').value);

            var result;
            switch(flag){
                case '+':
                    result = num1+num2;
                    break;
                case '-':
                    result = num1-num2;
                    break;
                case '*':
                    result = num1*num2;
                    break;
                case '/':
                    result = num1/num2;
                    break;
            }
            $('result').value = result;
        }
    </script>
</head>
<body>
    <div>
        <h2>简易计算器</h2>
        <p>
            第一个数:<input type="text" id="num1">
        </p>
        <p>
            第二个数:<input type="text" id="num2">
        </p>
        <p>
            <button onclick="calculate('+')">+</button>
            <button onclick="calculate('-')">-</button>
            <button onclick="calculate('*')">*</button>
            <button onclick="calculate('/')">/</button>
        </p>
        <p>
           结果: <input type="text" id="result" disabled>
        </p>
    </div>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值