17 DOM之操作元素

技术交流QQ群:1027579432,欢迎你的加入!

欢迎关注我的微信公众号:CurryCoder的程序人生

1.操作元素

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

2.改变元素内容

  • 语法格式:
    element.innerText
    
  • 说明:从起始位置到终止位置的内容,但它去除HTML标签,同时空格和换行也会去掉。
    <button>显示当前系统时间</button>
    <div>某个时间</div>
    <p>123</p>
    
    <script>
        // (1)操作元素之改变元素内容
        // 需求:当点击了按钮后,div标签中的文字会发生变化
        // 1.获取元素
        var btn = document.querySelector('button');
        var div = document.querySelector('div');
        // 2.注册事件和事件处理程序
        btn.onclick = function () {
            // div.innerText = '2020-02-17';
            div.innerText = getDate();
        }
        
        function getDate() {
            var date = new Date();
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var dates = date.getDate();
            var day = date.getDay();
            var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
            return '今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day];
        }
        // 元素也可以不用添加事件---操作DOM
        var p = document.querySelector('p');
        p.innerText = getDate();
    </script>
    
  • 语法格式[重点]:
    element.innerHTML
    
  • 说明:起始位置到终止位置的全部内容,包括HTML标签,同时保留空格和换行。
  • innerText和innerHTML的异同
    • innerText:不识别html标签 非标准;
    • innerHTML:识别HTML标签 W3C标准,保留空格和换行;
    • 这两个属性是可读写的,可以获取元素里面的内容;
      <div id="nav"></div>
      <p id="page">
          123
          <span>我是文字</span>
      </p>
      
      <script>
          
          // innerText和innerHTML的区别
          // 1.innerText:不识别html标签 非标准
          var div = document.querySelector('div');
          div.innerText = '<strong>今天是:</strong>2020';
          // 2.innerHTML:识别HTML标签  W3C标准,保留空格和换行
          var div = document.getElementById('nav');
          div.innerHTML = '<strong>今天是:</strong>2020';
          // 3.这两个属性是可读写的,可以获取元素里面的内容
          var p = document.getElementById('page');
          console.log(p.innerText);
          console.log(p.innerHTML);
      </script>
      

3.修改元素属性

  • 常见元素的属性操作
    1.innerText、innerHTML改变元素内容
    2.src、href
    3.id、alt、title
    
  • 实例演示:
    <button id="zxy">张学友</button>
    <button id="ldh">刘德华</button> <br>
    <img src="../CSS3/images/ldh.jpg" alt="" title="刘德华">
    <script>
        // (2)操作元素之修改元素属性
        // 1.获取元素
        var ldh = document.getElementById("ldh");
        var zxy = document.getElementById("zxy");
        var img = document.querySelector("img");
        // 2.注册事件和事件处理程序
        zxy.onclick = function() {
            img.src = '../CSS3/images/zxy.jpg';
            img.title = '歌神张学友';
        }
        ldh.onclick = function() {
            img.src = '../CSS3/images/ldh.jpg';
            img.title = '刘德华';
        }
    </script>
    
  • 操作元素案例之分时显示不同图片,显示不同的问候语
    <style>
        img {
                    width: 300px;
                }
    </style>
    
    <img src="../CSS3/images/s.gif" alt="">
    <div id="morning">上午好</div>
    
    // 1.获取元素
    <script>
        var img = document.querySelector('img');
        var div = document.getElementById("morning");
        // 2.得到当前的小时
        var date = new Date();
        var h = date.getHours();
        // 3.判断小时来改变图片和文字信息
        if (h < 12) {
            img.src = '../CSS3/images/s.gif';
            div.innerHTML = '上午好,好好写代码';
        } else if(h < 18) {
            img.src = '../CSS3/images/x.gif';
            div.innerHTML = '下午好,好好写代码';
        }else {
            img.src = '../CSS3/images/w.gif';
            div.innerHTML = '晚上好,好好写代码';
        }
    </script>
    
  • 表单元素的属性操作
    • 利用DOM可以操作如下表单的属性
      type、value、checked、selected、disabled
      
  • 实际案例:
    <!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>
        .box {
            position: relative;
            width: 400px;
            border-bottom: 1px solid #ccc;
            margin: 100px auto;
            }
    
        .box input {
            width: 370px;
            height: 30px;
            border: 0;
            outline: none;
            }
    
        .box img {
            position: absolute;
            top: 2px;
            right: 2px;
            width: 24px;
            }
    </style>
    </head>
    
    <body>
        <!-- 需求:点击按钮将密码框切换为文本框,并可以查看密码明文 -->
        <div class="box">
        <label for=""><img src="../CSS3/images/close.png" alt="" id="eye"></label>
        <input type="password" id="pwd">
        </div>
    <script>
        // 1.获取元素
        var eye = document.getElementById('eye');
        var pwd = document.getElementById('pwd');
        // 2.注册事件与处理程序
        var flag = 0;
        eye.onclick = function () {
        // 鼠标点击一次后,flag一定要变化
        if (flag == 0) {
            pwd.type = 'text';
            eye.src = '../CSS3/images/open.png';
            flag = 1;
            } else {
                pwd.type = 'password';
                eye.src = '../CSS3/images/close.png';
                flag = 0;
            }
        }
    </script>
    </body>
    </html>
    
  • 样式属性操作
    • 可以通过JS修改元素的大小、颜色、位置等样式。
  • 语法格式:
    1.element.style  行内样式操作
    
    2.element.className  类名样式操作
    
  • 注意点
    • JS中的样式采用驼峰命名法,比如fontSize、backgroundColor;
    • JS修改style样式操作,产生的是行内样式,CSS权重比较高;
  • 案例:淘宝点击关闭二维码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>操作元素案例之淘宝点击关闭二维码</title>
        <!-- 思路:利用样式的显示和隐藏完成,display:none隐藏元素; display:block显示元素-->
        <style>
            .box {
                position: relative;
                width: 74px;
                height: 88px;
                border: 1px solid #ccc;
                margin: 100px auto;
                font-size: 12px;
                text-align: center;
                color: #f40;
            }
            .box img {
                width: 60px;
                margin-top: 5px;
            }
            .close-btn {
                position: absolute;
                top: -1px;
                left: -16px;
                width: 14px;
                height: 14px;
                border: 1px solid #ccc;
                line-height: 14px;
                font-family: Arial, Helvetica, sans-serif;
                cursor: pointer;
            }
        </style>
    </head>
    <body>
        <div class="box">淘宝二维码
            <img src="../CSS3//images/tao.png" alt="">
            <i class="close-btn"></i>
        </div>
       
        <script>
            // 1.获取元素
            var btn = document.querySelector('.close-btn');
            var box = document.querySelector('.box');
            // 2.注册事件与事件处理程序
            btn.onclick = function() {
                box.style.display = 'none';
            }
        </script>
    </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>
            * {
                padding: 0;
                margin: 0;
            }
    
            li {
                list-style-type: none;
            }
    
            .box {
                width: 250px;
                margin: 100px auto;
            }
    
            .box li {
                float: left;
                width: 24px;
                height: 24px;
                background-color: pink;
                margin: 15px;
                background: url(../CSS3/images/sprite.png) no-repeat;
            }
    
        </style>
    </head>
    <body>
        <!-- 操作元素案例之循环精灵图背景 -->
        <!-- 思路:利用for循环设置一组元素的精灵图背景即修改精灵图片的背景位置background-position -->
        <!-- 规律:让循环中的i索引号*44就是每个图片的y坐标 -->
        <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.获取元素
            var lis = document.querySelectorAll('li');
            for(var i = 0; i < lis.length; i++) {
                // 核心:让索引号*44就是每个li的y坐标
                var index_y = i * 44;
                lis[i].style.backgroundPosition = '0 -' + index_y + 'px';
            }
        </script>
    </body>
    </html>
    
  • 两个新的表单事件:获得焦点onfocus和失去焦点onblur
    <input type="text" value="手机">
    
    <script>
        // 1.获取元素
        var text = document.querySelector('input');
        // 2.注册事件,获得焦点事件onfocus
        text.onfocus = function() {
            console.log('得到了焦点');
        }
        // 3.注册事件,失去焦点事件onblur
        text.onblur = function() {
            console.log('失去了焦点');
        }
    </script>
    
  • 操作元素案例之显示隐藏文本框内容
    <!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>
            input {
                color: #999;
            }
        </style>
    </head>
    <body>
        <!-- 需求:当鼠标点击文本框时,里面的默认文字隐藏;当鼠标离开文本框时,里面的文字显示-->
        <!-- 思路:首先表单需要2个新的事件,获得焦点onfocus和失去焦点onblur -->
        <!-- 如果获得焦点,判断表单中的内容是否是默认文字,如果是默认文字,就清空表单内容 -->
        <!-- 如果失去焦点,判断表单内容是否为空,如果为空,则表单内容改成默认文字 -->
        <input type="text" value="手机">
    
        <script>
            // 1.获取元素
            var text = document.querySelector('input');
            // 2.注册事件,获得焦点事件onfocus
            text.onfocus = function() {
                // console.log('得到了焦点');
                if(text.value === '手机') {
                    this.value = '';
                }
                // 获得焦点后,需要把文本框中的文字变黑
                this.style.color = '#333';
            }
            // 3.注册事件,失去焦点事件onblur
            text.onblur = function() {
                // console.log('失去了焦点');
                if(text.value === ''){
                    this.value = '手机';
                }
                // 失去焦点需要把文本框中的文字颜色变为浅色
                this.style.color = '#999';
            }
        </script>
    </body>
    </html>
    
  • 通过className更改元素样式
    • 注意
      • 如果样式修改较多,可以采取操作类名方式更改元素样式;
      • class因为是关键字,因此使用className来操作元素类名属性;
      • className会直接更改元素的类名,会覆盖原先的类名;
    使用element.style获得修改元素样式,如果样式比较少或功能简单时适合
    <div>文本</div>
    <script>
    1.使用element.style获得修改元素样式,如果样式比较少或功能简单时适合
        var test = document.querySelector('div');
        test.onclick = function() {
            this.style.backgroundColor = 'purple';
            this.style.color = '#fff';
            this.style.fontSize = '25px';
            this.style.marginTop = '100px';
        }
    </script>
    2.通过修改元素的className更改元素的样式,适合于样式较多或功能复杂的情况
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color:pink;
            margin: 100px auto;
        }
        /* 鼠标点击后,新增的样式 */
        .change {
            background-color:purple;
            color: #fff;
            font-size: 25px;
            margin-top: 100px;
        }
    </style>
    
    <div class="first">文本</div>
    <script>
        var test = document.querySelector('div');
        test.onclick = function() {
            // 让当前元素的类名,改成了change
    
            // 2.通过修改元素的className更改元素的样式,适合于样式较多或功能复杂的情况
            // 3.如果想要保留原先的类名,可以用下面的方法即多类名选择器
            this.className = 'first change';
            // this.className = 'change';
        }
    </script>
    
  • 操作元素案例之密码格式提示错误信息
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>操作元素案例之密码格式提示错误信息</title>
        <style>
            div {
                width: 600px;
                margin: 100px auto;
            }
    
            .message {
                display: inline-block;
                font-size: 12px;
                color: #999;
                background: url(../CSS3/images/mess.png) no-repeat left center;
                padding-left: 20px;
            }
    
            .wrong {
                color: red;
                background-image: url(../CSS3/images/wrong.png);
            }
    
            .right {
                color: green;
                background-image: url(../CSS3/images/right.png);
            }
        </style>
    </head>
    <body>
        <!-- 分析:首先判断的事件是表单失去焦点onblur -->
        <!-- 如果输入正确则提示正确的信息,颜色为小绿色小图标变化 -->
        <!-- 如果输入错误,则提示错误信息颜色为红色小图标变化 -->
        <!-- 因为里面样式变化较多,采用className来修改样式 -->
        <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() {
                // 根据表单中值的长度ipt.value.length
                if(this.value.length < 6 || this.value.length > 16) {
                   message.className = 'message wrong';
                   message.innerHTML = '您输入的密码位数不对,要求6~16位之间';
                }else {
                    message.className = 'message right';
                    message.innerHTML = '您输入的正确';
                }
            }
    
        </script>
    </body>
    </html>
    

4.操作元素总结

  • 操作元素是DOM中的核心内容,主要知识如下:


    操作元素总结.png

5.操作元素之排他思想[算法]

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

6.操作元素之自定义属性操作

  • 获取属性值
    • element.属性:获取属性值;
    • element.getAttribute('属性');
  • 上述两种方法的区别
    • element.属性:获取内置属性值(元素本身自带的属性);
    • element.getAttribut('属性'):主要获得自定义的属性(标准),程序员自己定义的属性;
  • 设置属性值
    • element.属性 = '值':设置内置属性值;
    • element.setAttribute('属性', '值'),主要用于设置自定义属性;
  • 移除属性
    • element.removeAttribute('属性');

7.H5自定义属性

  • 自定义属性的目的:为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
  • 自定义属性获取是通过getAttribute('属性')获取;
  • 但是,有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
  • H5新增了自定义属性:
    • 设置H5自定义属性
      • H5规定自定义属性data-开头作为属性名并且赋值;
        <div data-index="1"></div>
        
      • 或者使用JS设置
        element.setAttribute('data-index', 2);
        
    • 获取H5自定义属性
      • 兼容性获取
        element.getAttribute('data-time');
        
      • H5新增element.dataset.index或者element.dataset['index'] IE11才开始支持;dataset是一个集合,里面存放了所有以data开头的自定义属性;如果自定义属性中有多个-连接的单词,获取的时候必须采用驼峰命名法。

8.资料下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容