zoukankan      html  css  js  c++  java
  • DOM

    1.DOM简介

    1.1 什么是DOM

    文档对象模型(DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口
    W3C 已经决定了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构、样式

    1.2 DOM树

    • 文档:一个页面就是一个文档,DOM中使用document表示
    • 元素:页面中的所有标签都是元素,DOM中使用element表示
    • 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node 表示。
      DOM把以上内容都看做是对象

    2.获取元素

    2.1 如何获取页面元素

    DOM在我们实际开发中主要用来操作对象。
    我们如何来获取页面中的元素呢?
    获取页面中的元素可以使用以下几种方法:

    • 根据ID获取
    • 根据标签名获取
    • 通过 HTML5 新增的方法获取
    • 特殊元素的获取

    2.2 根据 ID 获取

    使用getElementById()方法可以获得带有ID的元素对象。

    <body>
        <div id="time">2021-03-16</div>
        <script>
            // 1. 因为我们文档页面从上往下加载,所以先得有标签 所以我们script写到标签的下面
            // 2. get 获得 element 元素 bu 通过 驼峰命名法
            // 3. 参数 id 是大小写敏感的字符串
            // 4. 返回的是一个元素对象
            var timer = document.getElementById('time');
            console.log(timer);
            console.log(typeof timer);
            // 5. console.dir 打印我们返回的元素对象 更好的查看里面的属性和方法
            console.dir(timer);
        </script>
    </body>
    

    2.3 根据标签名获取

    使用getElementsByTagName()方法可以返回带有指定标签名的对象的集合

         <ul>
            <li>知否知否,应是等你好久1</li>
            <li>知否知否,应是等你好久2</li>
            <li>知否知否,应是等你好久3</li>
            <li>知否知否,应是等你好久4</li>
            <li>知否知否,应是等你好久5</li>
        </ul>
        <ul id="nav">
            <li>生僻字</li>
            <li>生僻字</li>
            <li>生僻字</li>
            <li>生僻字</li>
            <li>生僻字</li>
        </ul>
        <script>
            // 1. 返回的是 获取过来元素对象的集合 以伪数组的形式显示
            var lis = document.getElementsByTagName('li');
            console.log(lis);
            console.log(lis[0]);
            // console.log(typeof lis);
            // console.dir(lis);
            // // 2. 我们想要一次打印里面的元素对象 我们可以采用遍历的方式
            // for (var i = 0; i < lis.length; i++) {
            //     console.log(lis[i]);
    
            // }
            // 3.Element.getElementsByTagName()  可以得到这个元素里面的某些标签
            var nav = document.getElementById('nav');
            var navLis = nav.getElementsByTagName('li');
            console.log(navLis);
        </script>
    

    2.4 通过 HTML5 新增的方法获取

        <div class="box">盒子1</div>
        <div class="box">盒子2</div>
        <div id="nav">
            <ul>
                <li>首页</li>
                <li>产品</li>
            </ul>
        </div>
        <script>
            // 1. document.getElementsByClassName() 根据类名获得某些元素合集
            // 任然以伪数组得形式存储
            var boxs = document.getElementsByClassName('box');
            console.log(boxs);
            // 2. document.querySelector('选择器')  根据指定选择器返回第一个元素对象
            // 切记 里面的选择器需要加符号 如:.box #nav li
            var firstDiv = document.querySelector('.box');
            console.log(firstDiv);
            var nav = document.querySelector('#nav');
            console.log(nav);
            var li = document.querySelector('li');
            console.log(li);
            // 3. document.querySelectorAll('选择器') 返回指定选择器的所有对象集合
            var allBox = document.querySelectorAll('.box');
            console.log(allBox);
            var lis = document.querySelectorAll('li');
            console.log(lis);
        </script>
    

    2.5 通过获取特殊元素(body、html)获取

    1. 获取body 元素

            // 返回的是一个元素对象
            var bodyEle = document.body;
            console.log(bodyEle);
            console.dir(bodyEle);
    

    2. 获取html 元素

            // var htmlEle = document.html;
            var htmlEle = document.documentElement;
            console.log(htmlEle);
    

    3. 事件基础

    3.1 事件概述

    JavaSctipt 使我们有能力创建动态页面,而事件是可以被JavaScript帧测到的行为。

    简单理解:触发——相应机制。

    页面中的每个元素都可以产生某些可以触发JavaScript的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。

    3.2 事件的三要素

    事件三要素: 事件源、事件类型、事件处理程序

    其中:
    事件源:事件被触发的对象;如:按钮
    事件类型:如何触发 触发什么事件 如:鼠标点击(onclick)、鼠标经过、键盘按下
    事件处理程序:通过一个函数赋值的方式 完成。

            var btn = document.getElementById('btn');
            btn.onclick = function() {
                alert('点秋香');
            }
    

    3.3 执行事件的步骤

    1. 获取事件源
    2. 注册事件(绑定事件)
    3. 添加事件处理程序(采用函数赋值形式)
        <div>123</div>
        <script>
            // 执行事件的步骤
            // 点击div 控制台输出 我被选中了
            // 1. 获取事件源
            var div = document.querySelector('div');
            // 2. 绑定事件 注册事件
            // div.ondblclick
            // 3. 添加事件处理程序
            div.onclick = function() {
                console.log('我被选中了');
            }
        </script>
    

    4. 操作元素

    JavaScript 的 DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等。注意以下都是属性

    4.1 改变元素的内容

    element.innerText
    

    从起始位置到终止位置的内容,但它去除了html标签,同时1空格和换行也会去掉

    <button>显示当前系统时间</button>
        <div>某个时间</div>
        <p>123</p>
        <script>
            // 1. 获取事件源
            var btn = document.querySelector('button');
            var div = document.querySelector('div');
            // 2. 注册事件
            btn.onclick = function() {
                // div.innerText = '2021-03-18';
                div.innerText = getDate();
            }
    
            function getDate() {
                var date = new Date();
                // 我们写一个 2021年 3月 13 日 星期六
                var year = date.getFullYear();
                var month = date.getMonth() + 1;
                var dates = date.getDate();
                var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
                var day = date.getDay();
                return '今年是:' + year + '年' + month + '月' + dates + '日 ' + arr[day];
            }
            // 我们可以不用添加事件
            var p = document.querySelector('p');
            p.innerText = getDate();
        </script>
    
    element.innerHTML
    

    起始位置到终止位置的全部内容,包括html标签,同时保留空格的换行

    innerText 和 innerHTML之间的区别

        <div></div>
        <p>
            我是文字
            <span>1234</span>
        </p>
        <script>
            // innerText 和 innerHTML的区别
            // 1. innerText 不识别html的标签 非标准 去除空格和换行
            var div = document.querySelector('div');
            div.innerText = '<strong>今年是:</strong>2021年';
            // 2. innerHTML 识别html的标签 W3C标准  保留空格和换行的
            div.innerHTML = '<strong>今年是:</strong>2021年';
            var p = document.querySelector('p');
            console.log(p.innerText);
            console.log(p.innerHTML);
        </script>
    

    4.2 常见元素的属性操作

    1. innerText 、innerHTMl 改变元素内容

    2. src 、href

    3. id 、alt 、title

        <button id="ldh">刘德华</button>
        <button id="zxy">张学友</button>
        <img src="images/ldh.jpg" alt="" title="刘德华">
        <script>
            // 修改元素属性
            // 1. 获取事件源
            var ldh = document.getElementById('ldh');
            var zxy = document.getElementById('zxy');
            var img = document.querySelector('img');
            // 2. 注册事件
            zxy.onclick = function() {
                img.src = 'images/zxy.jpg';
                img.title = '张学友';
            }
            ldh.onclick = function() {
                img.src = 'images/ldh.jpg'
                img.title = '刘德华';
            }
        </script>
    

    4.3 表单元素的属性操作

    利用 DOM 可以操作如下表单元素的属性:
    type 、value 、checked 、selected 、disabled

        <button>按钮</button>
        <input type="text" value="请输入内容">
        <script>
            // 1. 获取元素
            var btn = document.querySelector('button');
            var input = document.querySelector('input');
            // 2. 注册事件 处理程序
            btn.onclick = function() {
                // input.innerHtml = '点击了'; 这个是 普通盒子 比如 div 标签里面的内容
                // 表单里面的值,即文字内容是通过value来修改的
                input.value = '被点击了';
                // 如果想要某个表单被禁用,即不能再点击 用disabled 我们想要按钮 button禁用
                // btn.disabled = true;
                // this指向的是时间函数的调用者 btn
                this.disabled = true;
            }
        </script>
    

    案例:显示密码

       /* 此处为CSS部分 */
        <style>
            .box {
                position: relative;
                 400px;
                border-bottom: 1px solid #ccc;
                margin: 100px auto;
            }
            
            .box input {
                 370px;
                height: 30px;
                border: none;
                outline: none;
            }
            
            .box img {
                position: absolute;
                top: 2px;
                right: 2px;
                 24px;
            }
        </style>
    
        <-- ! 此处以下为为HTML和 js 部分 -->
        <div class="box">
            <label for="">
                <img src="images/close.png" alt="" id="eye">
            </label>
            <input type="password" id="pwd">
        </div>
        <script>
            // 点击按钮将密码框切换为文本框,并可以查看密码明文
            // 案例分析:
            // 核心思路:点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
            // 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
            // 算法:利用一个flag变量,来判断flag的值,如果是1就切换为文本框,flag设置为0;如果是0就切换为密码框,flag设置为1
            // 1. 获取元素
            var eye = document.getElementById('eye');
            var pwd = document.getElementById('pwd');
            // 2. 注册事件 处理程序
            var flag = 0;
            eye.onclick = function() {
                if (flag == 0) {
                    pwd.type = 'text';
                    eye.src = 'images/open.png'
                    flag = 1;
                } else {
                    pwd.type = 'password';
                    eye.src = 'images/close.png'
                    flag = 0;
                }
            }
        </script>
    

    4.4 样式属性操作

    我们可以通过 JS 修改元素的大小、颜色、位置等样式

    1. element.style 行内样式操作
    2. element.className 类名样式操作

      注意:
    3. JS 里面的样式采用驼峰命名法。 比如:fontSize、backgroundColor
    4. JS 修改 style 样式操作,产生的是行内样式,css 权重比较高

      element.style 行内样式操作
       <style>
            div {
                 100px;
                height: 100px;
                background-color: pink;
            }
        </style>
        <div>文本</div>
        <script>
            // 1. 使用element.style 获得修改元素样式 如果样式比较少 或者功能简单的情况下使用
            var div = document.querySelector('div');
    
            div.onclick = function() {
                div.style.backgroundColor = 'purple';
                div.style.width = '150px';
                div.style.color = '#fff';
                div.style.marginTop = '50px';
                div.style.fontSize = '14px';
            }
        </script>
    

    element.className 类名样式操作

    4.5 排他思想

    如果有同一个元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想:
    **1. 所有元素全部清除样式(干掉其他人)
    **2. 给当前元素设置样式(留下我自己)
    **3. 注意顺序不能颠倒,首先干掉其他人,再设置自己

    <body>
        <button>按钮1</button>
        <button>按钮2</button>
        <button>按钮3</button>
        <button>按钮4</button>
        <button>按钮5</button>
        <script>
            // 1. 获取所有元素按钮
            var btns = document.getElementsByTagName('button')
                // btns得到的是伪数组 里面的每一个元素 btns[i]
            for (var i = 0; i < btns.length; i++) {
                btns[i].onclick = function() {
                    // (1) 我们先把所有的按钮背景颜色去掉 干掉所有人
                    for (var i = 0; i < btns.length; i++) {
                        btns[i].style.backgroundColor = '';
                    }
                    // (2) 然后才让当前的元素背景颜色为pink 留下自己
                    this.style.backgroundColor = 'pink';
                }
            }
            // 2. 首先先排除其他人,然后才设置自己的样式,这种排除其他人的思想我们称之为排他思想
        </script>
    </body>
    
    </html>
    

    案例:百度换肤效果

    案例分析:

      1. 这个案例练习的是给一组元素注册事件
      1. 给4个小图片利用循环注册点击事件
      1. 我们点击这个图片,让我们页面背景改为当前的图片
      1. 核心算法:把当前图片的src路劲取过来,给body做为背景即可
    <!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>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            
            body {
                background: url(images/1.jpg) no-repeat center top;
            }
            
            li {
                list-style-type: none;
            }
            
            .baidu {
                overflow: hidden;
                margin: 100px auto;
                background-color: #fff;
                 410px;
                padding-top: 3px;
            }
            
            .baidu li {
                float: left;
                margin: 0 1px;
                cursor: pointer;
            }
            
            .baidu img {
                 100px;
            }
        </style>
    </head>
    
    <body>
        <ul class="baidu">
            <li><img src="images/1.jpg" alt=""></li>
            <li><img src="images/2.jpg" alt=""></li>
            <li><img src="images/3.jpg" alt=""></li>
            <li><img src="images/4.jpg" alt=""></li>
        </ul>
        <script>
            // 1. 获取元素
            var imgs = document.querySelector('.baidu').getElementsByTagName('img');
            // console.log(imgs);
            // 2. 循环注册事件
            for (var i = 0; i < imgs.length; i++) {
                imgs[i].onclick = function() {
                    // this.src 就是我们点击图片的路劲 images/2.jpg
                    // console.log(this.src);
                    // 把这个路劲 this.src 给body 就可以了
                    document.body.style.backgroundImage = 'url(' + this.src + ')'
                }
            }
        </script>
    </body>
    
    </html>
    

    案例:表格隔行变色

    案例分析:

      1. 用到新的鼠标事件 :鼠标经过onmouseover 鼠标离开: onmouseout
      1. 核心思路:鼠标经过 tr 行,当前的行变背景颜色,鼠标离开去掉当前的背景颜色
      1. 注意:第一个(thead里面的行)不需要变换颜色,因此我们获取的是tbody里面的行
    <!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>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            
            table {
                 800px;
                margin: 100px auto;
                text-align: center;
                border-collapse: collapse;
                font-size: 14px;
            }
            
            thead tr {
                height: 30px;
                background-color: skyblue;
            }
            
            tbody tr {
                height: 30px;
            }
            
            tbody td {
                border-bottom: 1px solid #ccc;
                font-size: 12px;
                color: blue;
            }
            
            .bg {
                background-color: pink;
            }
        </style>
    </head>
    
    <body>
        <table>
            <thead>
                <tr>
                    <th>代码</th>
                    <th>名称</th>
                    <th>最新公布净值</th>
                    <th>累计净值</th>
                    <th>前单位净值</th>
                    <th>净值增长率</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>003526</td>
                    <td>农行金穗3月份定期开放债卷</td>
                    <td>1.075</td>
                    <td>1.079</td>
                    <td>1.074</td>
                    <td>+0.047%</td>
                </tr>
                <tr>
                    <td>270047</td>
                    <td>广发理财30天债券B</td>
                    <td>0.903</td>
                    <td>3.386</td>
                    <td>0.000</td>
                    <td>0.000%</td>
                </tr>
                <tr>
                    <td>163417</td>
                    <td>兴全合宜混合A</td>
                    <td>0.860</td>
                    <td>10.860</td>
                    <td>0.863</td>
                    <td>-0.382%</td>
                </tr>
                <tr>
                    <td>003929</td>
                    <td>中银证券安进债券A</td>
                    <td>1.034</td>
                    <td>1.088</td>
                    <td>1.034</td>
                    <td>+0.077%</td>
                </tr>
                <tr>
                    <td>360020</td>
                    <td>光大添天盈月度理财债券B</td>
                    <td>0.985</td>
                    <td>0.263</td>
                    <td>1.263</td>
                    <td>0.000%</td>
                </tr>
            </tbody>
        </table>
        <script>
            // 1. 获得元素 获得的是 tbody 里面的所有行
            var rows = document.querySelector('tbody').querySelectorAll('tr');
            // 2. 利用循环绑定注册事件
            for (var i = 0; i < rows.length; i++) {
                // 3. 鼠标经过事件 onmouseover
                rows[i].onmouseover = function() {
                        // console.log(11);
                        this.className = 'bg';
                    }
                    // 4. 鼠标离开事件 onmouseout
                rows[i].onmouseout = function() {
                    this.className = '';
                }
            }
        </script>
    </body>
    
    </html>
    

    案例:表单全选取消全选按钮

  • 相关阅读:
    王歆瑶20191128-1 总结
    王歆瑶 20191121-1 每周例行报告
    王歆瑶20191114-1 每周例行报告
    王歆瑶20191107-1 每周例行报告
    王歆瑶20191031-1 每周例行报告
    王歆瑶20191024-1 每周例行报告
    王歆瑶20191017-1 每周例行报告
    王歆瑶20191010-2 每周例行报告
    王歆瑶20190919-4 单元测试,结对
    LeetCode 11 盛水最多的容器
  • 原文地址:https://www.cnblogs.com/counter/p/14542217.html
Copyright © 2011-2022 走看看