Bootstrap

WebAPI—DOM (HTTL、CSS、Java Script应用及案例)

WebAPI—DOM (HTTL、CSS、Java Script应用)

1. DOM 基本概念

DOM 全称为 Document Object Model

一个页面的结构是一个树形结构,称为 DOM 树

2. 选择元素 querySelector

querySelector

querySelector 选择器选中的元素如果有多个,只能获取到其中的第一个

let div = document.querySelector('div');
// 使用 log 打印一个元素对象 (element), 此时看到的是 html 片段
console.log(div);
// 使用 dir 打印一个元素对象,此时就能看到里面的具体属性
console.dir(div);

querySelectorAll

可以选中多个元素返回一个“伪数组”

3. 事件 .onclick

用户的一些操作,就会触发事件。根据用户的操作,做出不同的响应

    <!-- 点击事件 -->
	<input type="button" value="按钮" onclick="test()">

    <script>
        // 法一
        function test() {
            console.log("用户点击了按钮");
        }
    </script>
    <input type="button" value="按钮">

    <script>
        // 法二
        let button = document.querySelector('input');
        button.onclick = function () {
            console.log("用户点击了按钮");
        }
	</script>

其他标签也可以实现相同效果

    <style>
        div {
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            background-color: gray;
            color: white;
        }
        div:active {
            background-color: orange;
        }
    </style>

    <div>按钮</div>

    <script>
        let button = document.querySelector('div');
        button.onclick = function () {
            console.log("用户点击了按钮");
        }
	</script>

4. 元素操作innerHTML

操作一个HTML对应的对象

  • 获取/修改 元素里面的内容

innerText 只能获取/修改元素里面的文本

innerHTML 可以获取/修改文本,也可以获取修改里面的嵌套的标签

let button = document.querySelector('div');
console.log(button.innerHTML);
button.innerHTML = '<span>按钮</span>';

👉案例 - 显示/隐藏密码

    <input type="password" id="input">
    <input type="button" id="button" value="显示密码">

    <script>
        let input = document.querySelector('#input');
        let button = document.querySelector('#button');
        button.onclick = function() {
            if (input.type == 'text') {
                input.type = 'password';
                button.value = '隐藏密码';
            } else if (input.type == 'password') {
                input.type = 'text';
                button.value = '隐藏密码';
            }
        }
    </script>

👉案例 - 自增

    <input type="text" id="number" value="0">
    <input type="button" value="自增" id="button">

    <script>
        let button = document.querySelector('#button');
        button.onclick = function() {
            let number = document.querySelector('#number');
            let value = parseInt(number.value);
            value += 1;
            number.value = value;
        }
    </script>

👉案例-字体变化

    <div style="font-size: 20px;">这是一行字</div>

    <script>
        // 先获取到 div 对象, 关联点击事件, 
        let div = document.querySelector('div');
        div.onclick = function () {
            let fontSize = parseInt(div.style.fontSize);
            fontSize += 5;
            div.style.fontSize = fontSize + 'px';
        }
	</script>

👉案例-夜间模式切换

    <!-- 切换夜间模式 -->
    <style>
        .light {
            background-color: white;
            color: black;
        }
        .night {
            background-color: #666;
            color: #eee;
        }
    </style>
    <div class="light">
        这是一大堆话<br>
        这是一大堆话<br>
    </div>
    <script>
        let div = document.querySelector('div');
        div.onclick = function() {
            if (div.className == 'light') {
                div.className = 'night';
            } else if (div.className == 'night') {
                div.className = 'light';
            }
        }
	</script>

5. 节点操作

新增节点 createElement

        let div = document.createElement('div');
        div.innerHTML = '这是一个div';
        div.style.fontSize = '30px';

插入节点 appendChild

不能重复插入,如果将同一个元素插入两次,则最终效果为最后一次插入的位置

appendChild 插入该类中最后位置

    <div class="container"></div>
    <script>
        let div = document.createElement('div');
        div.innerHTML = '这是一个div';
        div.style.fontSize = '30px';

        let container = document.querySelector('.container');
        container.appendChild(div);
    </script>

insertBefore(要插入的元素, 插入的位置); 插入任意位置

    <div class="container">
        <div class="one">第一个元素</div>
        <div class="two">第二个元素</div>
    </div>

    <script>
        let div = document.createElement('div');
        div.innerHTML = '这是一个div';
        div.style.fontSize = '30px';

        let container = document.querySelector('.container');
        // let two = document.querySelector('.two');
        let two = container.children[1];
        container.insertBefore(div, two);
    </script>

**删除节点 ** removeChild

		container.removeChild(div);

👉案例-猜数字

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>猜数字游戏</title>
</head>
<body>
    <input type="button" value="重新开始一局游戏" id="reset">
    <div>
        <span>请输入要猜的数组:</span>
        <input type="text" id="num">
        <input type="button" value="" id="guess">
    </div>
    <div>
        <span>已经猜的次数:</span>
        <span id="count">0</span>
    </div>
    <div>
        <span>猜的结果:</span>
        <span id="result"></span>
    </div>

    <script>
        // 先把需要用到的 JS 对象准备好
        let resultButton = document.querySelector('#reset');
        let numInput = document.querySelector('#num');
        let guessButton = document.querySelector('#guess');
        let countSpan = document.querySelector('#count');
        let resultSpan = document.querySelector('#result');

        // 生成一个 1-100 之间的随机的整数
        let toGuess = Math.floor(Math.random()*100) + 1;
        let count = 0;
        console.log("toGuess: " + toGuess);

        guessButton.onclick = function() {
            // 用户点击 猜 这个按钮,首先先更新点击次数的显示
            count++;
            countSpan.innerHTML = count;
            // 读取到输入框的内容,进行判定
            let num = parseInt(numInput.value);
            console.log("num: " + num);

            if (num < toGuess) {
                resultSpan.innerHTML = '猜低了';
                resultSpan.style.color = 'red';
            } else if (num > toGuess) {
                resultSpan.innerHTML = '猜高了';
                resultSpan.style.color = 'orange';
            } else {
                resultSpan.innerHTML = '猜对了';
                resultSpan.style.color = 'green';
            }
        }

        resultButton.onclick = function() {
            // 把 toGuess 和 count 清空,同时重新生成一个随机的整数
            toGuess = Math.floor(Math.random()*100) + 1;
            count = 0;
            resultSpan.innerHTML = '';
            countSpan.innerHTML = '';
            numInput.value = '';
        }
    </script>
</body>
</html>

👉案例-表白墙/留言板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表白墙</title>
</head>
<body>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .container {
            width: 600px;
            margin: 0 auto;
        }
        h1 {
            text-align: center;
            padding: 20px 0;
        }
        p {
            font-size: 12px;
            color: #666;
            padding: 10px 0;
            text-align: center;
        }
        .row {
            display: flex;
            height: 40px;
            align-items: center;
            justify-content: center;
        }
        .row span {
            width: 100px;
        }

        .row .edit {
            width: 200px;
            height: 36px;
        }

        .row .submit {
            width: 300px;
            height: 40px;
            color: #fff;
            background-color: orange;
            /* 去掉边框 */
            border: none;
        }

        .row .submit:active {
            background-color: green;
        }
    </style>
    <div class="container">
        <h1>表白墙</h1>
        <p>输入后点击提交,将会把消息显示在墙上</p>
        <div class="row">
            <span>谁:</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <span>对谁:</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <span>说什么:</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <input type="button" value="提交" class="submit">
        </div>
    </div>

    <script>
        let submitButton = document.querySelector('.submit');
        submitButton.onclick = function() {
            // 1. 获取到输入框里面的内容
            let edits = document.querySelectorAll('.edit');
            let from = edits[0].value;
            let to = edits[1].value;
            let message = edits[2].value;
            console.log(from + ", " + to + ", " + message);
            if (from == '' || to == '' || message == '') {
                return;
            }
            // 2. 根据输入框的内容,构造 HTML 元素,添加到页面中
            //      接下来的每个消息,都使用 div.row 来去表示
            let row = document.createElement('div');
            row.className = 'row';
            row.innerHTML = from + '对' + to + '说:' + message;

            let container = document.querySelector('.container');
            container.appendChild(row);

            // 3. 把上次输入的内容清空
            for (i = 0; i < 3; i++) {
                edits[i].value = '';
            }
        }
    </script>
</body>
</html>
;