zoukankan      html  css  js  c++  java
  • Web APIs---2. DOM(1)

    1 DOM简介

    1.1 定义

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

    1.2 DOM树

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

    2. 获取元素

    2.1 获取元素的方法:

    • 根据ID获取:
      getElementById()
    • 根据标签名获取:
      getElementsByTagName()
    • 通过HTML5新增的方法获取:
      getElementsByClassName() // querySelector() // querySelectorAll()
    • 特殊元素获取:
      document.body // document.documentElement
      (ps:访问https://developer.mozilla.org/zh-CN/,输入对应的方法名进行查找,可以获得该方法的使用方法)

    2.2 根据ID获取---->getElementById()

    • 语法:
    var element = document.getElementById("id");
    
    • 说明:Document的方法 getElementById()返回一个匹配特定 ID的元素. 由于元素的 ID 在大部分情况下要求是独一无二的,这个方法自然而然地成为了一个高效查找特定元素的方法。

    • 参数:id是大小写敏感的字符串,代表了所要查找的元素的唯一ID.

    • 返回值:返回一个匹配到 ID 的 DOM Element 对象。若在当前 Document 下没有找到,则返回 null。

    • 举例:

    <body>
        <div id="time">2019-9-9</div>
        <script>
            //1. 因为文档是从上往下加载,所以先得有标签 所以script写道下面来了 
            //后面有解决方案可以将script提上去,这个后面再说
            //2. get获取 element 元素 by 通过  
            //3. 参数id是大小写敏感的字符串
            //4. 返回值的一个element(元素)对象
            var timer = document.getElementById("time");
            console.log(timer); //<div id="time">2019-9-9</div>
            console.log(typeof timer); //object
            //5. console.dir(对象) 打印返回的元素对象 更好地查看里面的属性和方法
            console.dir(timer); //div#time里面含有很多方法
        </script>
    </body>
    

    2.3 根据标签名获取某些元素---->getElementsByTagName()

    • 语法:
    var element = document.getElementsByTagName("tagName");
    
    • 使用getElementsByTagName()方法可以返回带有指定标签的对象的集合。
    • 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
    <body>
        <ul>
            <li>知否知否,应是等你好久1</li>
            <li>知否知否,应是等你好久2</li>
            <li>知否知否,应是等你好久3</li>
            <li>知否知否,应是等你好久4</li>
            <li>知否知否,应是等你好久5</li>
        </ul>
        <ul id="nav">
            <li>生僻字1</li>
            <li>生僻字2</li>
            <li>生僻字3</li>
            <li>生僻字4</li>
            <li>生僻字5</li>
        </ul>
        <script>
            //得到所有的li
            //1.返回的是 获取过来元素对象的集合 以伪数组的形式存储的
            var lis = document.getElementsByTagName('li');
            console.log(lis); //HTMLCollection(10) [li, li, li, li, li, li, li, li, li, li]
            console.log(lis[0]); //<li>知否知否,应是等你好久1</li>
            //2. 依次打印里面的元素对象可以采取遍历的方式
            for (var i = 0; i < lis.length; i++) {
                console.log(lis[i]);
            }
    
            //得到生僻字所有的li
            //3. element.getElementsByTagName()可以得到这个元素里面的某些标签。搜索从element开始。请注意只有element的后代元素会被搜索,不包括元素自己。
            //不一定非要写document.xxx。document开头是只从文档里开始向下查找子标签
            var nav = document.getElementById('nav'); //获得Nav元素
            var navLis = nav.getElementsByTagName('li');
            console.log(navLis); //TMLCollection(5) [li, li, li, li, li]
        </script>
    </body>
    

    2.3 通过HTML5新增的方法获取(不兼容ie678)---->getElementsByClassName()、querySelector('选择器')、querySelectorAll('选择器')

    • 语法1:
    var element = document.getElementsByClassName('类名');//根据类名返回元素对象集合
    
    • 语法2:
    var element = document.querySelector('选择器');//返回指定选择器的第一个元素对象
    
    • 语法3:
    var element = document.querySelectorALL('选择器');//返回指定选择器的所有元素对象集合
    
    • 举例:
    <body>
        <div class="box">盒子1</div>
        <div class="box">盒子2</div>
        <div id="nav">
            <ul>
                <li>首页</li>
                <li>产品</li>
            </ul>
        </div>
        <script>
            //1. getElementsByClassName('类名') 根据类名获取某些元素集合
            var boxs = document.getElementsByClassName('box');
            console.log(boxs); //HTMLCollection(2) [div.box, div.box]
    
            //2. querySelector('选择器')返回指定选择器的第一个元素对象 切记:里面的选择器需要加符号.box #nav
            var firstBox = document.querySelector('.box'); //.box默认是类名
            console.log(firstBox); //<div class="box">盒子1</div>
    
            var nav = document.querySelector('#nav') //#nav表示nav是id名
            console.log(nav); //<div id="nav">...</div>
    
            var li = document.querySelector('li');
            console.log(li); //<li>首页</li>
    
            //3. querySelectorAll('选择器');返回指定选择器的所有元素对象  集合 伪数组
            var allBox = document.querySelectorAll('.box');
            console.log(allBox);//NodeList(2) [div.box, div.box]
        </script>
    </body>
    

    2.4 获取特殊元素body、html---->document.body、document.documentElement

    <body>
        <script>
            //其实也可以通过取类名和id名来获得 但是很少这么做
            //1. 获取body元素
            var bodyEle = document.body;
            console.log(bodyEle); //<body>...</body>
            console.dir(bodyEle); //返回的是一个元素对象
    
            //2. 获取html元素
            var htmlEle = document.documentElement;
            console.log(htmlEle);
            // <html lang = "en">
            //     <head>...</head>
            //     <body>...</body>
            // </html>
        </script>
    </body>
    

    3. 事件基础

    js使我们有能力创建动态页面,而事件是可以被js侦测到的行为,网页中每个元素都可以产生某些可以触发Js的事件。

    3.1 事件

    • 事件三要素:事件源 事件类型 事件处理程序
      (1)事件源:事件被触发的对象(按钮)
      (2)事件类型:如何触发,eg:鼠标点击(onclick)、鼠标经过、键盘按下
      (3)事件处理程序:通过一个函数赋值的方式完成
    <body>
        <button id="btn">唐伯虎</button>
        <script>
            //实现功能:点击一个按钮,弹出对话框
    
            //(1)事件源(按钮)
            var btn = document.getElementById('btn'); //获取事件源
            //(2)事件类型
            //(3)事件处理程序
            btn.onclick = function() {
                alert('点秋香');
            }
        </script>
    </body>
    

    3.2 事件执行步骤

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

    3.3 常见鼠标事件

    4. 操作元素

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

    4.1 改变元素内容---->innerText、innerHTML

    innerText
    • 语法:
    element.innerText = "xxx";//innerText可以修改元素的内容
    
    • 举例
    <body>
        <button>显示当前系统时间</button>
        <div>点击按钮后,我会显示当前时间</div>
        <p>我不用点击,自动获取时间</p>
        <script>
            //要求:点击按钮之后将把当前时间显示到div中
            // 1. 获取元素 获取两个元素 按钮是事件源
            var btn = document.querySelector('button');
            var div = document.querySelector('div');
            //2. 注册事件
            btn.onclick = function() {
                div.innerText = getDate();
            }
    
            //要求:p元素自动获取事件   不给p元素添加事件
            var p = document.querySelector('p');
            p.innerText = getDate();
    
            //分装成的获取当前时间函数
            function getDate() {
                var date = new Date();
                var year = date.getFullYear();
                var month = date.getMonth() + 1;
                var dates = date.getDate();
                var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
                var day = date.getDay();
                console.log(day);
    
                return '今天是:' + year + '年' + month + '月' + dates + '日' + arr[day];
            }
        </script>
    </body>
    
    <style>
        div,
        p {
             300px;
            height: 30px;
            line-height: 30px;
            color: #fff;
            background-color: pink;
        }
    </style>
    
    innerHTML和innerText的区别

    区别1:innerText不识别html标签,而innerHTML识别html标签

    <body>
        <div></div>
        <script>
            var div = document.querySelector('div');
            div.innerText = '<strong>今天是:</strong> 2020.1.18';
            //1. innerText不识别html标签,所以div中的内容只会变成:<strong>今天是:</strong> 2020.1.18
            div.innerHTML = '<strong>今天是:</strong> 2020.1.18';
            //2. innerHTML识别html标签,所以div中的内容会变成:今天是:2020.1.18,同时“今天是:”会加粗显示
        </script>
    </body>
    

    区别2:虽然这两个属性都是可读写的,可以获取元素内容,但是innerText忽略标签,删除空格和换行,而innerHTML保留标签空格和换行

    <body>
        <p>
            我是文字
            <span>123</span>
        </p>
        <script>
            var p = document.querySelector('p');
            //这两个属性都是可读写的,可以获取元素内容
            
            console.log(p.innerText);//忽略标签,删除空格和换行
            //我是文字 123
            
            console.log(p.innerHTML);//保留标签空格和换行
            //      我是文字
            //      <span>123</span>
        </script>
    </body>
    

    综上:innerHTML是最常用的写法

    4.2 常用元素的属性操作

    (1)innerText、innerHTML改变元素内容
    (2)src、href
    (3)id、alt、title
    (ps:href 表示超文本引用(hypertext reference),在 link和a 等元素上使用。src 表示来源地址,在 img、script、iframe 等元素上。
    src 的内容,是页面必不可少的一部分,是引入。href 的内容,是与该页面有关联,是引用。区别就是,引入和引用。)

    • 语法
    \元素.属性 = "xxx";
    
    • 举例
    <body>
        <button id="ldh">刘德华</button>
        <button id="zxy">张学友</button><br>
        <img src="images/ldh.jpg" alt="" title="刘德华">
        <script>
            //案例要求:点击张学友按钮出现张学友的图片,点击刘德华出现刘德华的图片
            //通过修改img元素的src属性和title属性来实现
            //1. 获取元素
            var ldh = document.getElementById('ldh');
            var zxy = document.getElementById('zxy');
            var img = document.querySelector('img');
            //2. 绑定事件 3. 处理程序
            zxy.onclick = function() {
                //通过为 “元素.属性 ”赋值来修改该元素对应的属性  
                img.src = 'images/zxy.jpg';
                img.title = '张学友'
            }
            ldh.onclick = function() {
                img.src = 'images/ldh.jpg';
                img.title = '刘德华';
            }
        </script>
    </body>
    
    案例

    根据不同的时间显示不同的图片和问候语,如:上午打开页面显示上午好,显示上午图片;中午打开页面显示中午好,显示中午图片;下午打开页面显示下午好,显示下午图片

    <body>
        <img src="images/s.gif" alt="">
        <div>上午好</div>
        <script>
            //获取元素
            var img = document.querySelector('img');
            var div = document.querySelector('div');
            //得到当前的小时数
            var date = new Date();
            var h = date.getHours();
            //判断小时数,改变图片和文字信息
            if (h < 12) {
                img.src = "images/s.gif";
                div.innerHTML = "亲,上午好!";
            } else if (h < 18) {
                img.src = "images/x.gif";
                div.innerHTML = "亲,下午好!";
            } else {
                img.src = "images/w.gif";
                div.innerHTML = "亲,晚上好!";
            }
        </script>
    </body>
    

    4.3 表单元素的属性操作

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

    • value:修改表单里的文字内容,不是通过innerHTML。eg:input.value = 'xxx';
    • disabled:禁用表单,不能再次点击.eg:btn.disabled = true
    • checked:如表单的type="checkbox",有一个属性checked,若写成checked='checked'则表示被选中,若不写该属性则默认未被选中。eg:input.checked = "true"表示该表单被选中,若为false则表示没有被选中。
    <body>
        <button>按钮</button>
        <input type="text" value="输入内容">
        <script>
            //1. 获取元素
            var btn = document.querySelector('button');
            var input = document.querySelector('input');
            //2. 注册事件 处理程序
            btn.onclick = function() {
                //input.innerHTML('被点击了');
                //表单里的文字内容是通过value来修改的,而不是通过innerHTML
                input.value = '被点击了';
                //想要表单禁用 不能再次点击
                //btn.disabled = true;
                //还可以
                this.disabled = true; //this指向事件函数的调用者 btn
                //这里是表单禁用,若是隐藏某个div盒子应该在样式里该,所以应该写成:div.style.display = 'none';
            }
        </script>
    </body>
    
    案例:仿京东显示密码案例


    点击按钮将密码框切换为文本框,查看密码明文;一个按钮两个状态,点击一次切换为文本框,继续点击一次切换为密码框。

    <body>
        <div class="box">
            <label for="">
                <img src="images/close.png" alt="" id="eye">
            </label>
            <input type="password" id="pwd">
            <script>
                //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>
        </div>
    </body>
    
    <style>
        .box {
            position: relative;
             400px;
            border-bottom: 1px solid #ccc;
            margin: 100px auto;
        }
        
        .box input {
             370px;
            height: 30px;
            border: 0;
            outline: 0;
        }
        
        .box img {
            position: absolute;
            top: 2px;
            right: 2px;
             24px;
        }
    </style>
    

    4.4 样式属性操作---->element.style、element.className

    通过js修改元素的大小、颜色、位置等信息。

    • 语法
    element.style.样式 = "样式";//行内样式操作
    
    element.className = "类名";
    

    element.style 行内样式操作

    • js里面的样式采取驼峰命名法,比如fontSize、backgroundColor
    • js修改style样式操作,产生的是行内样式,css权重较高,所以可以覆盖原先的样式
    <body>
        <div></div>
        <script>
            //要求:点击div之后,div的样式发生改变
            //1. 获取元素
            var div = document.querySelector('div');
            //2. 注册事件  3. 处理程序
            div.onclick = function() {
                //div.style.backgroundColor
                this.style.backgroundColor = 'purple';
                this.style.width = '250px';
            }
        </script>
    </body>
    
    <style>
        div {
             200px;
            height: 200px;
            background-color: pink;
        }
    </style>
    

    案例:关闭二维码
    思路:利用样式的显示和隐藏完成,display:none;隐藏元素。display:block;显示元素。

    <body>
        <div class="box">
            淘宝二维码
            <img src="images/tao.png" alt="">
            <i class="close-btn">×</i>
        </div>
        <script>
            //1. 获取元素
            var btn = document.querySelector('.close-btn');
            var box = document.querySelector('.box');
            //2. 注册事件 3. 程序处理
            btn.onclick = function() {
                box.style.display = 'none';
            }
        </script>
    </body>
    

    已经省略相样式

    案例:循环精灵图背景

    • 精灵图的排列有规律 竖着排列
    • 利用for循环修改精灵图片的位置背景background-position
    • 第一个图y坐标:0;第二个图y坐标:44px;第三个图y坐标: 88px;每个图的x坐标都是0
    <body>
        <div class="box">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>
        <script>
            //1. 获取元素  获取所有的小li
            var lis = document.querySelectorAll('li');
            for (var i = 0; i < lis.length; i++) {
                var index = i * 44;
                lis[i].style.backgroundPosition = '0 -' + index + 'px';
            }
        </script>
    </body>
    

    样式部分已经省略

    案例:显示隐藏的文本框的内容

    • 首先表单需要两个新事件,获得焦点和失去焦点
    • 获得焦点之后,判断表单里的内容是否为默认文字,若是默认文字则清空表单内容
    • 失去焦点后,判断表单内容是否为空,如果为空则将表单内容还原为默认内容
    <body>
        <input type="text" value="手机">
        <script>
            //1. 获取元素
            var text = document.querySelector('input');
            //2. 注册事件
            text.onfocus = function() {
                    //console.log('得到了焦点');
                    if (this.value === '手机') {
                        this.value = ''; //清空
                    }
                    //获得焦点需要把文本框里面的文字变黑
                    this.style.color = '#333';
                }
                //3. 注册事件 失去焦点事件
            text.onblur = function() {
                //console.log('失去了焦点');
                if (this.value === '') {
                    this.value = '手机';
                }
                //获得焦点需要把文本框里面的文字色号复原
                this.style.color = '#999';
            }
        </script>
    </body>
    
    <style>
        input {
            color: #999;
        }
    </style>
    

    element.className 类名样式操作

    在将要修改的样式比较少的情况下可用用element.style来修改样式,但是若修改的样式比较多则使用element.className来修改样式

    <body>
        <div>文本</div>
        <script>
            var text = document.querySelector('div');
            text.onclick = function() {
                //1. 使用element.style 修改元素样式 用于样式较少 或者功能简单的情况下使用
                // this.style.backgroundColor = 'purple';
                // this.style.color = '#fff';
                // this.style.fontsize = '25px';
                // this.style.marginTop = '100px';
    
                // 2. 使用element.className 修改元素样式 用于样式较多 或者功能复杂的情况下使用
                this.className = 'change'; //将当前元素的类名变成change,这里采取的是赋值的方式,就算原先有类名也会被覆盖掉
                //3. 若又想保留原先的类名,又想添加新类名的技巧如下:
                //利用多类名选择器this.className = 'first change'; 其中first为原先的类名;change为新添加的类名
    
            }
        </script>
    </body>
    
    <style>
        div {
             100px;
            height: 100px;
            background-color: pink;
        }
        
        .change {
            background-color: purple;
            color: #fff;
            font-size: 25px;
            margin-top: 100px;
        }
    </style>
    

    案例:密码框格式提示错误信息

    • 首先判断的事件是表单失去焦点
    • 如果输入正确则提示正确信息,小图标为绿色
    • 如果输入不到6到16位,则提示错误信息,小图标为红色
    • 如果里面变化样式较多,采取className修改样式
    <body>
        <div class="register">
            <input type="password" class="ipt">
            <p class="message">请输入6~16位密码</p>
        </div>
        <script>
            //1. 获取元素
            var ipt = document.querySelector('.ipt');
            var message = document.querySelector('.message');
            //2. 注册事件 失去焦点
            ipt.onblur = function() {
                //根据表单里面值的长度ip.value.length
                if (this.value.length < 6 || this.value.lengh > 16) {
                    message.className = 'message wrong';
                    message.innerHTML = '您输入的位数不对,要求0~16位';
                } else {
                    message.className = 'message right';
                    message.innerHTML = '输入正确';
                }
            }
        </script>
    </body>
    
    <style>
        div {
             600px;
            margin: 100px auto;
        }
        
        .message {
            display: inline-block;
            font-size: 12px;
            color: #999;
            background: url(images/mess.png) no-repeat left center;
            padding-left: 20px;
        }
        
        .wrong {
            color: red;
            background: url(images/wrong.png) no-repeat left center;
        }
        
        .right {
            color: green;
            background: url(images/right.png) no-repeat left center;
        }
    </style>
    

    操作元素总结

    作业:(1)世纪佳缘案例(2)JD关闭广告(3)新浪下拉菜单(4)开关灯

  • 相关阅读:
    1. 单个文件下载
    16. js方法传多个参数的实例
    15. combobox、combotree获取显示值和value值方式
    38. 查看oracle表空间存放的位置(查看所有的数据库文件的存放位置)
    Vuejs 高仿饿了么外卖APP 百度云视频教程下载
    mysql 5.7 百度云网盘下载
    mysql 5.1 下载地址 百度云网盘下载
    Zookeeper学习笔记-概念介绍
    JavaScript工程师都应懂的33个概念
    IIS部署asp.net MVC 出现错误 403.14-Forbidden解决办法
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12205753.html
Copyright © 2011-2022 走看看