多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # **属性知识小结** >[info] 1、标签属性: > 语法:属性名="属性值" > 使用DOM对象操作: > 获取元素(标签)属性值:对象名.属性名 > 设置元素(标签)属性值:对象名.属性名="属性值" > > 2、DOM对象的属性 > 获取DOM对象属性值:对象名.属性名 > 设置DOM对象属性值:对象名.属性名="属性值" > > 3、样式属性: > 语法,{属性名:属性值}; > 使用DOM对象操作: > 获取元素(样式)属性值:对象名.style.属性名 > 设置元素(样式)属性值:对象名.style.属性名="属性值" > > 通过DOM元素设置样式属性的时候,样式属性是行内样式,优先级最高。在设置样式属性的时候,宽、高、位置样式的值是字符串类型,要加上单位 px # 非表单元素的属性(掌握) &emsp;&emsp;所谓表单元素,就是可以放在form表单标签中存储用户输入的数据的标签,如 input、select标签,而非表单元素就是只能展示数据,不能存储用户输入的数据 的标签,如 a、img标签。 &emsp;&emsp;常用的非表单元素属性有 href、title、id、src、className,使用DOM对象操作属性,常用操作有 使用元素获取属性值,以及使用元素修改属性值。以下以a、img标签为例 html和css代码 ``` <!-- html代码 --> <a id="link" href="http://www.baidu.com" title="百度链接">百度</a> <img id="girl" src="images/a.jpg" alt="美女图片" title="美女"/> ``` JavaScript代码 ``` //获取标签的DOM对象 var link = document.getElementById('link'); var girl = document.getElementById('girl'); //获取DOM对象的属性值 console.log(link.id); console.log(link.href); console.log(link.title); console.log(girl.id); console.log(girl.src); console.log(girl.title); //设置DOM对象的属性值 link.href='http://www.taobao.com'; link.title='淘宝'; ``` ## **需求 1、**点击按钮,显示或隐藏 div** 需求分析: 以下是每一个步骤的功能实现 ****1、全选- 点击父checkbox全选 (1)在父checkbox上注册点击事件; (2)当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致; html和css代码 ~~~ ​ <style>   * {        padding: 0;        margin: 0;   } ​    .wrap {        width: 300px;        margin: 100px auto 0;   } ​    table {        border-collapse: collapse;        border-spacing: 0;        border: 1px solid #c0c0c0;        width: 300px;   } ​    th,    td {        border: 1px solid #d0d0d0;        color: #404060;        padding: 10px;   } ​    th {        background-color: #09c;        font: bold 16px "微软雅黑";        color: #fff;   } ​    td {        font: 14px "微软雅黑";   } ​    tbody tr {        background-color: #f0f0f0;   } ​    tbody tr:hover {        cursor: pointer;        background-color: #fafafa;   } </style> ​ <div class="wrap">    <table>        <thead>            <tr>                <th>                    <input type="checkbox" id="j_cbAll"/>                </th>                <th>商品</th>                <th>价钱</th>            </tr>        </thead>        <tbody id="j_tb">            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>小米Mix2s</td>                <td>3000</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>华为P30</td>                <td>3800</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>iPad Air</td>                <td>2000</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>小米手环</td>                <td>200</td>            </tr> ​        </tbody>    </table>    <input type="button" value=" 反 选 " id="btn"> </div> ~~~ JavaScript代码 ``` // 1: 全选- 点击父checkbox全选    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        var inputs = j_tb.getElementsByTagName('input');        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ``` 2、全选- 点击所有子checkbox全选 (1)在所有的子checkbox上注册点击事件; (2)当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox, 如果有一个子checkbox没有被选中,则父checkbox不要选中; 以下代码是在第一步骤基础上写的,包括了第一部分的代码 ~~~ // ====================== 1: 全选- 点击父checkbox全选 ====================== ​    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取所有的子checkbox    var inputs = j_tb.getElementsByTagName('input'); ​    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ​ ​    // ====================== 2: 全选- 点击所有子checkbox全选 ======================    // (1) 在所有的子checkbox上注册点击事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input是否是复选框,如果不是复选框,则不注册事件        if (input.type !== 'checkbox') {            // 不是复选框            continue;       }        // 在子checkbox上注册点击事件        input.onclick = function () {            // alert('测试子checkbox'); ​            // (2) 当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox,            //     如果有一个子checkbox没有被选中,则父checkbox不要选中; ​            // 记录子checkbox是否都被选中的标记            var isCheckedAll = true;            // 遍历所有input, 获取所有子checkbox            for (var j = 0; j < inputs.length; j++) {                var input = inputs[j];                if (input.type !== 'checkbox') {                    // 不是复选框                    continue;               }                if (input.checked === false) {                    // 存在不选中的子checkbox,则父checkbox同步不选中;                    isCheckedAll = false;               }           } ​            // 如果子checkbox全部被选中,则要去同步选中父checkbox;            // 同步父checkbox            j_cbAll.checked = isCheckedAll;       } ​   } ~~~ 3、反选 (1)在反选按钮上注册点击事件; (2)当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中, 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; 以下代码是在第二步骤基础上写的,包括了第二部分的代码 ~~~ // ======================= 1: 全选- 点击父checkbox全选 ======================= ​    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取所有的子checkbox    var inputs = j_tb.getElementsByTagName('input');    // 获取反选按钮元素    var btn = document.getElementById('btn');    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ​ ​    // ====================== 2: 全选- 点击所有子checkbox全选 =====================    // (1) 在所有的子checkbox上注册点击事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input是否是复选框,如果不是复选框,则不注册事件        if (input.type !== 'checkbox') {            // 不是复选框            continue;       }        // 在子checkbox上注册点击事件        input.onclick = function () {            // alert('测试子checkbox'); ​            // (2) 当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox,            //     如果有一个子checkbox没有被选中,则父checkbox不要选中;            synJcbAll();       } ​   } ​    // 3: ============================== 反选 ==============================    // (1) 在反选按钮上注册点击事件    btn.onclick = function () {        // (2) 当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中,        //     如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; ​        // 将所有的子checkbox的状态取反        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            // 判断当前遍历到的input是否是复选框,如果是,则设置复选框的状态取反            if (input.type !== 'checkbox') {                // 不是复选框,则跳到下一次循环                continue;           }            input.checked = !input.checked; ​            // 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox            synJcbAll(); ​       }   } ​ ​    // 抽取公共代码带函数中, 以便以后重复调用    // 用于将子checkbox的状态同步到父checkbox的函数    function synJcbAll() {        // 记录子checkbox是否都被选中的标记        var isCheckedAll = true;        // 遍历所有input, 获取所有子checkbox        for (var j = 0; j < inputs.length; j++) {            var input = inputs[j];            if (input.type !== 'checkbox') {                // 不是复选框                continue;           }            if (input.checked === false) {                // 存在不选中的子checkbox,则父checkbox同步不选中;                isCheckedAll = false;           }       } ​        // 如果子checkbox全部被选中,则要去同步选中父checkbox;        // 同步父checkbox        j_cbAll.checked = isCheckedAll;   } ~~~ **小结** 重点:全选反选效果; 难点:当选中所有 子checkbox时,选中父checkbox;**以下是每一个步骤的功能实现 1、全选- 点击父checkbox全选 (1)在父checkbox上注册点击事件; (2)当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致; html和css代码 ~~~ ​ <style>   * {        padding: 0;        margin: 0;   } ​    .wrap {        width: 300px;        margin: 100px auto 0;   } ​    table {        border-collapse: collapse;        border-spacing: 0;        border: 1px solid #c0c0c0;        width: 300px;   } ​    th,    td {        border: 1px solid #d0d0d0;        color: #404060;        padding: 10px;   } ​    th {        background-color: #09c;        font: bold 16px "微软雅黑";        color: #fff;   } ​    td {        font: 14px "微软雅黑";   } ​    tbody tr {        background-color: #f0f0f0;   } ​    tbody tr:hover {        cursor: pointer;        background-color: #fafafa;   } </style> ​ <div class="wrap">    <table>        <thead>            <tr>                <th>                    <input type="checkbox" id="j_cbAll"/>                </th>                <th>商品</th>                <th>价钱</th>            </tr>        </thead>        <tbody id="j_tb">            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>小米Mix2s</td>                <td>3000</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>华为P30</td>                <td>3800</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>iPad Air</td>                <td>2000</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>小米手环</td>                <td>200</td>            </tr> ​        </tbody>    </table>    <input type="button" value=" 反 选 " id="btn"> </div> ~~~ JavaScript代码 ~~~ // 1: 全选- 点击父checkbox全选    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        var inputs = j_tb.getElementsByTagName('input');        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ~~~ 2、全选- 点击所有子checkbox全选 (1)在所有的子checkbox上注册点击事件; (2)当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox, 如果有一个子checkbox没有被选中,则父checkbox不要选中; 以下代码是在第一步骤基础上写的,包括了第一部分的代码 ~~~ // ====================== 1: 全选- 点击父checkbox全选 ====================== ​    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取所有的子checkbox    var inputs = j_tb.getElementsByTagName('input'); ​    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ​ ​    // ====================== 2: 全选- 点击所有子checkbox全选 ======================    // (1) 在所有的子checkbox上注册点击事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input是否是复选框,如果不是复选框,则不注册事件        if (input.type !== 'checkbox') {            // 不是复选框            continue;       }        // 在子checkbox上注册点击事件        input.onclick = function () {            // alert('测试子checkbox'); ​            // (2) 当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox,            //     如果有一个子checkbox没有被选中,则父checkbox不要选中; ​            // 记录子checkbox是否都被选中的标记            var isCheckedAll = true;            // 遍历所有input, 获取所有子checkbox            for (var j = 0; j < inputs.length; j++) {                var input = inputs[j];                if (input.type !== 'checkbox') {                    // 不是复选框                    continue;               }                if (input.checked === false) {                    // 存在不选中的子checkbox,则父checkbox同步不选中;                    isCheckedAll = false;               }           } ​            // 如果子checkbox全部被选中,则要去同步选中父checkbox;            // 同步父checkbox            j_cbAll.checked = isCheckedAll;       } ​   } ~~~ 3、反选 (1)在反选按钮上注册点击事件; (2)当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中, 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; 以下代码是在第二步骤基础上写的,包括了第二部分的代码 ~~~ // ======================= 1: 全选- 点击父checkbox全选 ======================= ​    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取所有的子checkbox    var inputs = j_tb.getElementsByTagName('input');    // 获取反选按钮元素    var btn = document.getElementById('btn');    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ​ ​    // ====================== 2: 全选- 点击所有子checkbox全选 =====================    // (1) 在所有的子checkbox上注册点击事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input是否是复选框,如果不是复选框,则不注册事件        if (input.type !== 'checkbox') {            // 不是复选框            continue;       }        // 在子checkbox上注册点击事件        input.onclick = function () {            // alert('测试子checkbox'); ​            // (2) 当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox,            //     如果有一个子checkbox没有被选中,则父checkbox不要选中;            synJcbAll();       } ​   } ​    // 3: ============================== 反选 ==============================    // (1) 在反选按钮上注册点击事件    btn.onclick = function () {        // (2) 当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中,        //     如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; ​        // 将所有的子checkbox的状态取反        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            // 判断当前遍历到的input是否是复选框,如果是,则设置复选框的状态取反            if (input.type !== 'checkbox') {                // 不是复选框,则跳到下一次循环                continue;           }            input.checked = !input.checked; ​            // 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox            synJcbAll(); ​       }   } ​ ​    // 抽取公共代码带函数中, 以便以后重复调用    // 用于将子checkbox的状态同步到父checkbox的函数    function synJcbAll() {        // 记录子checkbox是否都被选中的标记        var isCheckedAll = true;        // 遍历所有input, 获取所有子checkbox        for (var j = 0; j < inputs.length; j++) {            var input = inputs[j];            if (input.type !== 'checkbox') {                // 不是复选框                continue;           }            if (input.checked === false) {                // 存在不选中的子checkbox,则父checkbox同步不选中;                isCheckedAll = false;           }       } ​        // 如果子checkbox全部被选中,则要去同步选中父checkbox;        // 同步父checkbox        j_cbAll.checked = isCheckedAll;   } ~~~ **小结** 重点:全选反选效果; 难点:当选中所有 子checkbox时,选中父checkbox;** 2. 给按钮注册事件; 3. 在事件处理函数中,控制div显示、隐藏,并控制按钮文字的切换; &emsp;&emsp;显示和隐藏效果的控制:定义一个变量,用作控制div显示、隐藏的标记。 html和css代码 ``` <style> #box { background-color: red; width: 200px; height: 200px; } .show{ display: block; } .hidden{ display: none; } </style> <input type="button" id="showOrHidden" value="隐藏"/> <div id="box">我是div</div> ``` JavaScript代码 ``` //1、获取按钮对象 var showOrHidden = document.getElementById('showOrHidden'); var box = document.getElementById('box'); //显示 或 隐藏 标记 var flag = true; // 2、注册事件 showOrHidden.onclick = function () { // 3、点击按钮显示或隐藏div // 4、修改按钮的文字 if (flag) { //隐藏div //class在JS中是关键字,不能作为属性名,DOM中规定了对象中对应标签class属性的名称为className box.className = 'hidden'; // showOrHidden.value='显示'; this.value = '显示'; flag = false; } else { // 显示div box.className = 'show'; // showOrHidden.value='隐藏'; this.value = '隐藏'; flag = true; } } ``` >[info] 在DOM对象中,除了使用 对象.属性名 的格式访问属性,还可以使用 this关键字,下面总结this关键字的使用。 > this在JS代码中表示一个指针,它总是指向某个对象(引用类型),this指向谁是由函数的调用方式来决定的。函数可以作为普通函数、对象的方法、构造函数来调用,如下是this在几种调用方式中的指向。 > 1. 普通函数调用中: this 指向 window对象 > 2. 构造函数调用中: this 指向 当前被正在被创建的对象 > 3. 对象方法调用中: this 指向 调用该方法的对象 > 4. 事件处理函数调用中: this 指向 当前事件源 <br> **2、美女相册** html和css代码 ``` <style type="text/css"> body { font-family: "Helvetica", "Arial", serif; color: #333; background-color: #ccc; margin: 1em 10%; } h1 { color: #333; background-color: transparent; } a { color: #c60; background-color: transparent; font-weight: bold; text-decoration: none; } ul { padding: 0; } li { float: left; padding: 1em; list-style: none; } #imagegallery { } #imagegallery a { margin: 0px 20px 20px 0px; padding: 0px; display: inline; } #imagegallery a img { border: 0; } </style> <h2> 美女相册 </h2> <div id="imagegallery"> <a href="images/1.jpg" title="美女A"> <img src="images/1-small.jpg" width="100px" alt="美女1"/> </a> <a href="images/2.jpg" title="美女B"> <img src="images/2-small.jpg" width="100px" alt="美女2"/> </a> <a href="images/3.jpg" title="美女C"> <img src="images/3-small.jpg" width="100px" alt="美女3"/> </a> <a href="images/4.jpg" title="美女D"> <img src="images/4-small.jpg" width="100px" alt="美女4"/> </a> </div> <div style="clear:both"></div> <img id="image" src="images/placeholder.png" alt="" width="450px"/> <p id="des">选择一个图片</p> ``` 通过案例效果可以知道,我们需要先解决a标签的默认跳转问题,即先取消a标签的默认跳转行为。 ``` <a id="goToGirl" href="images/1.jpg"> <img src="images/1-small.jpg" alt="美女"/> </a> //要在a标签跳转之前取消跳转行为 var goToGirl = document.getElementById('goToGirl'); goToGirl.onclick=function () { alert('a标签'); // 取消a标签的默认跳转行为 return false; } ``` **美女相册实现思路:** 1. 获取所有的a标签对象 2. 循环给所有的a标签对象注册事件 3. 取消a标签的默认跳转行为:在事件处理函数中取消a标签的默认跳转行为,关键代码为 return false; 4. 设置大图片:点击哪张小图就将其对应的大图路径设置到大图位置,此时使用this关键字获取当前事件源(被点击的标签)。 5. 设置图片标题:使用innerText获取或设置p标签中的内容(后面课程会讲解innerText) ``` // (1) 获取到所有的a标签; // 获取div元素 var imagegallery = document.getElementById('imagegallery'); // 从div元素中获取所有的a标签元素 var links = imagegallery.getElementsByTagName('a'); // 遍历集合,获取到集合中所有的a标签元素 for (var i = 0; i < links.length; i++) { var link = links[i]; // (2) 在所有的a标签上注册点击事件; link.onclick = function () { // alert('美女!'); // (4) 设置大图片: 当点击a标签时,获取到被点击的a标签的href属性值,设置到img标签的src属性中; // 获取img标签元素 var image = document.getElementById('image'); // image.src = link.href; image.src = this.href; // link 代表的是什么? // console.log(link); // this 指向什么对象? // console.log(this); // 获取p标签 var des = document.getElementById('des'); // console.dir(des); // console.log(des.innerText); des.innerText = this.title; // (3) 取消a标签的默认跳转行为: 核心代码 return false; return false; } } ``` ## **innerHTML和innerText** &emsp;&emsp;innerHTML和innerText的区别: &emsp;&emsp;nnerHTML中包含HTML标签和文本内容;包含HTML页面中的所有换行和空格。 &emsp;&emsp;innerText中只包含HTML标签中的文本内容,而过滤掉了HTML标签;如果有换行或多个空格,都会当做一个空格处理。 ``` <div id="box"> 我是一个div <span id="sp">我是 一个span</span> </div> ``` ``` var box = document.getElementById('box'); //innerHTML中包含HTML标签和文本内容;包含HTML页面中的所有换行和空格。 console.dir(box); console.log(box.innerHTML); //innerText中只包含HTML标签中的文本内容,而过滤掉了HTML标签;不包含换行和空格, // 如果有换行或多个空格,都会当做一个空格处理。 console.log(box.innerText);//获取标签内部文本 //获取标签内部文本 console.log(box.textContent); ``` 通过上面演示可知,浏览器会将我们写的html标签解析掉,导致我们无法在页面原样输出标签。而在实际开发中,我们有时候需要将标签原样输出标签到浏览器中显示,怎么办?这时候我们就需要用到转义符。 HTML转义符 >[info] " &quot; > ' &apos; > & &amp; > < &lt; // less than 小于 > > &gt; // greater than 大于 > 空格 &nbsp; > © &copy; 转义后的代码 ``` <div id="box"> 我是一个div <span id="sp">我是 一个span</span> <b>&quot;加粗&quot;</b> &nbsp;&nbsp;&nbsp;字体 <!--转义符--> &lt;b&gt;加粗&lt;/b&gt;字体 </div> ``` >[info] 注意:DOM对象中还有一个对象跟innerText的功能相似,就是textContent,innerText 和 textContent 两个属性存在浏览器兼容性问题。 > 在旧版FF中,只支持textContent > 在旧版IE中,只支持innerText 模拟解决 innerText和textContent在浏览器中的兼容性问题 我们知道,在不同的旧版浏览器中,要么只支持 textContent,要么只支持 innerText。如果支持则属性返回string类型的数据,不支持则返回undefined,因此我们可写出以下兼容性代码。 ``` //模拟解决 innerText和textContent在浏览器中的兼容性问题 function getInnerText(element) { if (typeof element.innerText==='string') { return element.innerText; }else { return element.textContent; } } ``` 代码思路: 当元素中innerText属性值不为undefined时,则使用innerText属性,否则使用textContent属性. <br> # 表单元素属性 * value 用于获取和设置表单元素的内容 * type 用于获取和设置input标签的类型 * disabled 获取和设置标签状态(true表示禁用, false表示启用) * checked 复选框选中属性(true表示选中, false表示不选中) * selected 下拉菜单选中属性(true表示选中, false表示不选中) ## 需求 **1、点击按钮禁用文本框** 需求分析:禁用之后的文本框,不能在手动输入值,但是可以使用代码赋值。 html和css代码 ``` <input type="button" id="bnt" value="按钮"/> <br> <input type="text" id="txt" value="你好!"/> ``` JavaScript代码 ``` // 需求:点击按钮时,禁用文本框 //获取标签对应的DOM对象(元素) var bnt = document.getElementById('bnt'); //注册事件 bnt.onclick=function () { var txt = document.getElementById('txt'); //获取标签属性值 console.log(txt.value); console.log(txt.type); console.log(txt.disabled); //设置标签属性值 txt.disabled=true; txt.value='hello world!' } ``` >[info]1、disabled、checked、selected 属性 在HTML中只有两种可能的效果(比如选择/不选中,可编辑/不可编辑),对应DOM中的属性值为 true或false。 >2、在html标签中,只要标签中写了disabled属性,不管disabled的值是什么,标签都会是禁用状态; **2、当页面加载完毕, 先给每个文本框设置任意值,当点击按钮时, 获取所有文本框的值,并使用 | 作为分隔符拼接文本框的值 ;** 需求分析: (1)循环给每个文本框赋值 (2)当点击按钮时,获取文本框的值并使用 | 分隔文本框的值,然后输出 &emsp;&emsp;方式一:使用字符串拼接; &emsp;&emsp;方式二:使用数组; html和css代码 ``` <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="text"/><br> <input type="button" id="btn" value="获取文本框的值"/><br> ``` JavaScript代码 方式一:使用字符串拼接 ``` // 1、给文本框赋值 //获取所有input元素 var inputs = document.getElementsByTagName('input'); //遍历input元素 for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; //判断,如果类型为text,则设置值 if (input.type === 'text') { input.value = i; } } // 2、点击按钮获取文本框的值并按指定格式(| 分割)输出 var bnt = document.getElementById('btn'); var str = ''; bnt.onclick=function () { for (var i = 0; i < inputs.length; i++) { //字符串拼接 var input = inputs[i]; if (input.type === 'text') { str += input.value + '|'; } } //使用substr截取掉最后一个 | str = str.substr(0,str.length-1); console.log(str); } ``` 方式二:使用数组的join方法 我们可以使用数组的方式代替字符串拼接,这样避免了大量的字符串拼接,代码执行效率更高。使用join方法指定分割符为 “ | ” 即可。 ``` //使用数组的方式(效率较高,推荐使用) var bnt = document.getElementById('btn'); var array = []; bnt.onclick=function () { for (var i = 0; i < inputs.length; i++) { //字符串拼接 var input = inputs[i]; if (input.type === 'text') { array.push(input.value); } } var str = array.join('|'); console.log(str); } ``` **3、检测用户名和密码是否合法** 需求描述:检测用户名是否是3-8位,密码是否是6-12位,如果不满足则高亮显示文本框 需求分析: 1. 获取表单元素; ​ \ 2. 判断表单元素中的值是否合法; 3. 如果用户名和密码都合法,则执行登录,否则不能执行登录; html和css代码 ``` c<style> .cls { background-color: lightyellow; } </style> 用户名:<input id="userName" type="text"/><br><br> 密码:<input id="password" type="password"/><br> <input id="login" type="button" value=" 登 录 "/> ``` JavaScript代码 // (1) 获取事件源,注册事件; ``` var login = document.getElementById('login'); login.onclick = function () { // (2) 判断用户名和密码是否合法, 如果不合法,则高亮显示文本框; var userName = document.getElementById('userName'); if (userName.value.length < 3 || userName.value.length > 8) { // 不合法 userName.className = 'cls'; // 终止方法的执行 return; }else { // 合法, 清除文本框高亮 userName.className = ''; } var password = document.getElementById('password'); if (password.value.length < 6 || password.value.length > 12) { // 不合法 password.className = 'cls'; // 终止方法的执行 return; }else { // 合法,清除文本框高亮 password.className = ''; } // (3) 如果用户名和密码都合法, 则执行登录操作, 否则不执行登录操作; console.log('执行登录...'); } ``` **2、点击按钮时,随机选中下拉框中的的某一项** 需求分析: 1. 给按钮注册点击事件 ​ 2. 获取下拉框所有的option ​ 3. 随机生成\[1,5\]之间的一个整数,作为option的随机索引 4. 根据随机索引获取option,并设置该option为选中状态 ​ 获取option的长度:**option.length ** 设置选中:**option.selected = true;** html和css代码 ``` <input type="button" id="btnSet" value="选中"/> ``` JavaScript ``` // 1、注册点击事件 var btnSet = document.getElementById('btnSet'); btnSet.onclick=function () { // 2、获取所有的option元素 var selectCity = document.getElementById('selectCity'); var options = selectCity.getElementsByTagName('option'); console.log(selectCity); console.log(options); // 3、生成option个数之内的随机数 [0, 5) // Math.random() [0, 1) // Math.random() * 5 [0, 5) // Math.random() * options.length [0, options.length) var index = parseInt(Math.random() * options.length); // 4、根据随机数(下标)选中option var option = options[index]; option.selected = true; } ``` **3、实现搜索文本框** 需求分析: 当文本框获得焦点时,如果文本框中的内容是 "请输入关键字",则清空文本框,并将文本框字体颜色设置成黑色。 当文本框失去焦点时,如果文本框中的内容为空,则设置文本框的内容为 "请输入关键字",并将文本框字体颜色设置成灰色。如果文本框中内容为 "请输入关键字",则将文字设置成灰色即可。 html和css代码 ``` c<style> .cls { background-color: lightyellow; } </style> 用户名:<input id="userName" type="text"/><br><br> 密码:<input id="password" type="password"/><br> <input id="login" type="button" value=" 登 录 "/> ``` JavaScript代码 ``` // (1) 获取事件源,注册事件; var login = document.getElementById('login'); login.onclick = function () { // (2) 判断用户名和密码是否合法, 如果不合法,则高亮显示文本框; var userName = document.getElementById('userName'); if (userName.value.length < 3 || userName.value.length > 8) { // 不合法 userName.className = 'cls'; // 终止方法的执行 return; }else { // 合法, 清除文本框高亮 userName.className = ''; } var password = document.getElementById('password'); if (password.value.length < 6 || password.value.length > 12) { // 不合法 password.className = 'cls'; // 终止方法的执行 return; }else { // 合法,清除文本框高亮 password.className = ''; } // (3) 如果用户名和密码都合法, 则执行登录操作, 否则不执行登录操作; console.log('执行登录...'); } ``` **2、点击按钮时,随机选中下拉框中的的某一项** 需求分析: 1. 给按钮注册点击事件 ​ 2. 获取下拉框所有的option ​ 3. 随机生成\[1,5\]之间的一个整数,作为option的随机索引 4. 根据随机索引获取option,并设置该option为选中状态 ​ 获取option的长度:option.length 设置选中:option.selected = true; html和css代码 ``` <input type="button" id="btnSet" value="选中"/> <select id="selectCity"> <option value="1">北京</option> <option value="2">上海</option> <option value="3">深圳</option> <option value="4">广州</option> <option value="5">贵港</option> </select> ``` JavaScript代码 ``` // 1、注册点击事件 var btnSet = document.getElementById('btnSet'); btnSet.onclick=function () { // 2、获取所有的option元素 var selectCity = document.getElementById('selectCity'); var options = selectCity.getElementsByTagName('option'); console.log(selectCity); console.log(options); // 3、生成option个数之内的随机数 [0, 5) // Math.random() [0, 1) // Math.random() * 5 [0, 5) // Math.random() * options.length [0, options.length) var index = parseInt(Math.random() * options.length); // 4、根据随机数(下标)选中option var option = options[index]; option.selected = true; } ``` **3、实现搜索文本框** 需求分析: 当文本框获得焦点时,如果文本框中的内容是 "请输入关键字",则清空文本框,并将文本框字体颜色设置成黑色。 当文本框失去焦点时,如果文本框中的内容为空,则设置文本框的内容为 "请输入关键字",并将文本框字体颜色设置成灰色。如果文本框中内容为 "请输入关键字",则将文字设置成灰色即可。 html和css代码 ``` <style>    .gray {        color: gray;   } ​    .black {        color: black;   } </style> <input type="text" class="gray" id="txtSearch" value="请输入关键字"/> <input type="button" value=" 搜 索 "/> ``` JavaScript代码 ``` var txtSearch = document.getElementById('txtSearch'); ​   // (1)当文本框获得焦点时,如果文本框中的内容是 "请输入关键字",则清空文本框,并将文本框字体颜色设置成黑色。    //注册事件    txtSearch.onfocus = function () {        // alert('666')        if (this.value == '请输入关键字') {            //清空文本框            this.value='';            // this.value.length = 0;       }        //将文本框字体颜色设置成黑色        this.className='black';   } // (2)当文本框失去焦点时,如果文本框中的内容为空,则设置文本框的内容为 "请输入关键字",并将文本框字体颜色设置成灰色。如果文本框中内容为 "请输入关键字",则将文字设置成灰色即可。    //注册事件    txtSearch.onblur=function () {        //txtSearch.value === ''        if (this.value.length===0 || this.value==='请输入关键字'){            this.value='请输入关键字';       }        this.className='gray';   } ``` **4、全选反选(重点)** ``` border-collapse:collapse;/*设置表格为紧缩型表格,即细线表格。*/ ``` 全选和反选功能,在开发中应用得非常多,以下通过需求分析,学习如何使用JS实现全选反选功能。 该功能可分为如下三大步骤: >[info]需求: 全选和反选 需求分析: 1、全选- 点击父checkbox全选 (1)在父checkbox上注册点击事件; (2)当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致; 2、全选- 点击所有子checkbox全选 (1)在所有的子checkbox上注册点击事件; (2)当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选 中父checkbox, 如果有一个子checkbox没有被选中,则父checkbox不要选中; 3、反选 (1)在反选按钮上注册点击事件; (2)当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中, 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; 以下是每一个步骤的功能实现 1、全选- 点击父checkbox全选 (1)在父checkbox上注册点击事件; (2)当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致; html和css代码 ~~~ ​ <style>   * {        padding: 0;        margin: 0;   } ​    .wrap {        width: 300px;        margin: 100px auto 0;   } ​    table {        border-collapse: collapse;        border-spacing: 0;        border: 1px solid #c0c0c0;        width: 300px;   } ​    th,    td {        border: 1px solid #d0d0d0;        color: #404060;        padding: 10px;   } ​    th {        background-color: #09c;        font: bold 16px "微软雅黑";        color: #fff;   } ​    td {        font: 14px "微软雅黑";   } ​    tbody tr {        background-color: #f0f0f0;   } ​    tbody tr:hover {        cursor: pointer;        background-color: #fafafa;   } </style> ​ <div class="wrap">    <table>        <thead>            <tr>                <th>                    <input type="checkbox" id="j_cbAll"/>                </th>                <th>商品</th>                <th>价钱</th>            </tr>        </thead>        <tbody id="j_tb">            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>小米Mix2s</td>                <td>3000</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>华为P30</td>                <td>3800</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>iPad Air</td>                <td>2000</td>            </tr>            <tr>                <td>                    <input type="checkbox"/>                </td>                <td>小米手环</td>                <td>200</td>            </tr> ​        </tbody>    </table>    <input type="button" value=" 反 选 " id="btn"> </div> ~~~ JavaScript代码 ~~~ // 1: 全选- 点击父checkbox全选    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        var inputs = j_tb.getElementsByTagName('input');        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ~~~ 2、全选- 点击所有子checkbox全选 (1)在所有的子checkbox上注册点击事件; (2)当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox, 如果有一个子checkbox没有被选中,则父checkbox不要选中; 以下代码是在第一步骤基础上写的,包括了第一部分的代码 ~~~ // ====================== 1: 全选- 点击父checkbox全选 ====================== ​    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取所有的子checkbox    var inputs = j_tb.getElementsByTagName('input'); ​    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ​ ​    // ====================== 2: 全选- 点击所有子checkbox全选 ======================    // (1) 在所有的子checkbox上注册点击事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input是否是复选框,如果不是复选框,则不注册事件        if (input.type !== 'checkbox') {            // 不是复选框            continue;       }        // 在子checkbox上注册点击事件        input.onclick = function () {            // alert('测试子checkbox'); ​            // (2) 当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox,            //     如果有一个子checkbox没有被选中,则父checkbox不要选中; ​            // 记录子checkbox是否都被选中的标记            var isCheckedAll = true;            // 遍历所有input, 获取所有子checkbox            for (var j = 0; j < inputs.length; j++) {                var input = inputs[j];                if (input.type !== 'checkbox') {                    // 不是复选框                    continue;               }                if (input.checked === false) {                    // 存在不选中的子checkbox,则父checkbox同步不选中;                    isCheckedAll = false;               }           } ​            // 如果子checkbox全部被选中,则要去同步选中父checkbox;            // 同步父checkbox            j_cbAll.checked = isCheckedAll;       } ​   } ~~~ 3、反选 (1)在反选按钮上注册点击事件; (2)当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中, 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; 以下代码是在第二步骤基础上写的,包括了第二部分的代码 ~~~ // ======================= 1: 全选- 点击父checkbox全选 ======================= ​    // 获取tbody元素    var j_tb = document.getElementById('j_tb');    // 获取所有的子checkbox    var inputs = j_tb.getElementsByTagName('input');    // 获取反选按钮元素    var btn = document.getElementById('btn');    // 获取事件源    var j_cbAll = document.getElementById('j_cbAll');    // (1) 在父checkbox上注册点击事件    j_cbAll.onclick = function () {        // (2) 当点击父checkbox时, 让所有子checkbox的状态始终跟父checkbox的状态保持一致;        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            if (input.type === 'checkbox') {                // 所有子checkbox的状态始终跟父checkbox的状态保持一致                input.checked = j_cbAll.checked;           }       }   } ​ ​    // ====================== 2: 全选- 点击所有子checkbox全选 =====================    // (1) 在所有的子checkbox上注册点击事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input是否是复选框,如果不是复选框,则不注册事件        if (input.type !== 'checkbox') {            // 不是复选框            continue;       }        // 在子checkbox上注册点击事件        input.onclick = function () {            // alert('测试子checkbox'); ​            // (2) 当每次点击子checkbox时, 判断所有子checkbox是否全部被选中,如果全部被选中,则要去同步选中父checkbox,            //     如果有一个子checkbox没有被选中,则父checkbox不要选中;            synJcbAll();       } ​   } ​    // 3: ============================== 反选 ==============================    // (1) 在反选按钮上注册点击事件    btn.onclick = function () {        // (2) 当点击反选按钮时, 将所有的子checkbox的状态取反, 然后判断所有的子checkbox是否都被选中,        //     如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox; ​        // 将所有的子checkbox的状态取反        for (var i = 0; i < inputs.length; i++) {            var input = inputs[i];            // 判断当前遍历到的input是否是复选框,如果是,则设置复选框的状态取反            if (input.type !== 'checkbox') {                // 不是复选框,则跳到下一次循环                continue;           }            input.checked = !input.checked; ​            // 如果所有的子checkbox都已经被选中,则要选中父checkbox,否则不选中父checkbox            synJcbAll(); ​       }   } ​ ​    // 抽取公共代码带函数中, 以便以后重复调用    // 用于将子checkbox的状态同步到父checkbox的函数    function synJcbAll() {        // 记录子checkbox是否都被选中的标记        var isCheckedAll = true;        // 遍历所有input, 获取所有子checkbox        for (var j = 0; j < inputs.length; j++) {            var input = inputs[j];            if (input.type !== 'checkbox') {                // 不是复选框                continue;           }            if (input.checked === false) {                // 存在不选中的子checkbox,则父checkbox同步不选中;                isCheckedAll = false;           }       } ​        // 如果子checkbox全部被选中,则要去同步选中父checkbox;        // 同步父checkbox        j_cbAll.checked = isCheckedAll;   } ~~~ **小结** 重点:全选反选效果; 难点:当选中所有 子checkbox时,选中父checkbox; <br> <br> # 定义属性操作 常用的自定义属性相关的方法有 `getAttribute()`、`setAttribute()`、`removeAttribute()` ,这三个方法操作的是标签的行内属性,不存在浏览器兼容性问题,称为标准方法。 * `getAttribute()` 获取标签行内属 * `setAttribute() `设置标签行内属性 * `removeAttribute()` 移除标签行内属性 html和css代码 <div id="box" class="black" age="18" parentId="1"></div> JavaScript代码 ``` // 1: 以前的操作: 获取和设置box元素属性 var box = document.getElementById('box'); console.log(box.id); console.log(box.className); box.className='divClass'; console.log(box.className); // 2: 现在的操作: 自定义属性 // (1) 从DOM元素中获取手动添加到标签中的属性age, parentId console.log(box.age); // undefined console.log(box.parentId); // undefined // (2) 使用标准方法从DOM中获取手动添加到标签中的属性(行内属性) // get 获取, Attribute 属性; 获取属性值 console.log(box.getAttribute('age')); console.log(box.getAttribute('parentId')); // 设置标签的行内属性 // 参数一: 属性名,相当于 键; // 参数二: 属性值,相当于 值; box.setAttribute('sex', true); console.log(box.getAttribute('sex')); box.setAttribute('age', 20);// 已存在age属性,则原来的属性值被覆盖 console.log(box.getAttribute('age')); // 删除行内属性 box.removeAttribute('age'); console.log(box.getAttribute('age')); // null, 表示没有age元素(已经被删除了) ``` <br> <br> # 样式属性操作 CSS中的样式属性: 语法,属性名:属性值; 使用DOM对象操作标签中的样式: 获取样式属性值:对象名.style.属性名 设置元素样式属性值:对象名.style.属性名 = 属性值 + 'px' 通过DOM元素设置样式属性的时候,样式属性是行内样式,优先级最高。在设置样式属性的时候,宽、高、位置样式的值是字符串类型,要加上单位 px html代码 ``` <div id="box" class="boxClass" style="background-color: #0099cc;width: 200px; height: 200px">我是一个div</div> ``` JavaScript代码 ``` // 获取box元素 var box = document.getElementById('box'); // 对象类型: CSSStyleDeclaration  console.dir(box); console.log(box.style); // 获取样式属性 console.log(box.style.backgroundColor); console.log(box.style.width);// 200px console.log(box.style.height);// 200px // 设置样式属性 box.style.backgroundColor = 'red'; box.style.width = 500 + 'px'; console.log(box.style.width); // 500px ``` <br> # 元素属性className和style的区别(掌握) &emsp;&emsp;标签的class属性对应着DOM对象中的className属性,所以修改DOM的className属性相当于修改标签的class属性值。 &emsp;&emsp;注意, 在通过DOM元素设置标签的样式属性的时,我们可以className属性和style属性来设置, 但style属性操作的是标签的行内样式,所以优先级最高。我们可以通过以下代码演示他们的优先级. &emsp;&emsp;在开发中,怎么选择class属性和style属性的使用? 如果样式属性比较多,则使用class进行引用; 如果样式属性比较少,则使用style属性,更灵活; html和css代码 ``` <style> ``` JavaScript代码 ``` // 获取box元素 var box = document.getElementById('box'); // 引用定义好的样式: 操作的是嵌入式的样式 box.className = 'boxClass'; // 获取行内样式 console.log(box.style.backgroundColor); // 设置行内样式 box.style.backgroundColor = 'red'; // 小结: className属性操作的是嵌入样式, style属性操作的是行内样式, 相对于嵌入式和外联式, 行内样式的优先级最高 ``` # 需求 **1、开关灯** 目的: 练习style属性的使用; 需求分析: (1)当点击"关 灯"按钮时,将body背景颜色设置成黑色,同时将 "关 灯" 设置成 "开 灯"; (2)当点击"开 灯"按钮时,将body背景颜色设置成白色,同时将 "开 灯" 设置成 "关 灯"; 通过效果演示可以看出,"开关灯" 效果其实是操作body的样式,使浏览器界面呈现黑白切换。 html和css代码 ``` <input id="btn" type="button" value="关 灯"/> ``` JavaScript代码 ``` // 定义一个变量,用于记录开关灯状态    var isOpen = true;    // 获取按钮元素    var btn = my$('btn');    btn.onclick = function () { ​        // if (isOpen === true) {        if (isOpen) {           //(1)当点击"关 灯"按钮时,将body背景颜色设置成黑色,同时将 "关 灯" 设置成 "开 灯";            document.body.style.backgroundColor = 'black';            btn.value = '开 灯';            isOpen = false;       } else {           //(2)当点击"开 灯"按钮时,将body背景颜色设置成白色,同时将 "开 灯" 设置成 "关 灯";            document.body.style.backgroundColor = 'white';            btn.value = '关 灯';            isOpen = true;       }   }        // 抽取常用的代码: 根据id获取标签元素    function my$(id) {        return document.getElementById(id);   } ``` **2、点击按钮变色** 目的: 练习style属性的使用; 需求描述:点击按钮,随机变换body的背景颜色 需求分析: (1)当点击按钮时,随机生成\[0, 255\]区间的整数作为rgb的颜色值,拼接成rgb(color1, color2, color3); (2)当点击按钮时,将颜色值设置为body的背景; html和css代码 ``` <script src="common.js"></script> <input type="button" id="btn" value="变换颜色"/> ``` JavaScript代码 ``` var oBtn = document.getElementById('btn'); oBtn.onclick = function(){  var color1 = getRandomNum();  var color2 = getRandomNum();  var color3 = getRandomNum();  document.body.style.background = 'rgb('+color1+','+color2+','+color3+')'; } ​ function getRandomNum(){  return Math.floor(Math.random()*255) } ``` **3、切换二维码** 目的: 练习className属性,鼠标移入移出事件; 需求分析: (1)当鼠标移入div时,显示二维码图片; (2)当鼠标移出div时,隐藏二维码图片; html和css代码 ~~~ <style>    .nodeSmall {        width: 50px;        height: 50px;        background: url(images/bgs.png) no-repeat -159px -51px;        position: fixed;        right: 10px;        top: 40%;   }    .erweima {        position: absolute;        top: 0;        left: -150px;   }    .nodeSmall a {        display: block;        width: 50px;        height: 50px;   }    .hide {        display: none;   }    .show {        display: block;   } </style> <script src="common.js"></script> <div class="nodeSmall" id="node_small">    <div class="erweima hide" id="er">        <img src="images/456.png" alt=""/>    </div> </div> ~~~ JavaScript代码 ~~~ var nodeSmall = my$('node_small'); // 当鼠标移入 onmouseover // 当鼠标移出 onmouseout nodeSmall.onmouseover=function () {    //显示二维码    // my$('er').className='erweima show';    my$('er').className = my$('er').className.replace('hide', 'show');    // console.log(my$('er').className); } ​ nodeSmall.onmouseout=function () {    //隐藏二维码    my$('er').className = my$('er').className.replace('show', 'hide');    // my$('er').className='erweima hide'; } ~~~ **4、高亮显示正在编辑的文本框** 目的:练习使用当前事件源(this)的style属性 需求描述:设置正在编辑的文本框为高亮状态,表示用户正在操作(编辑),在开发中也是经常要做的功能。 需求分析: (1)获取所有文本框; (2)给所有文本框注册获得焦点事件; (3)当事件发生时,先清空所有文本框的高亮效果, 再设置当前文本框背景为高亮; html和css代码 ~~~ <script src="common.js"></script> <style>    /*body{*/    /*background-color: lightyellow;*/    /*}*/ </style> ​ <input type="text"><br> <input type="text"><br> <input type="text"><br> <input type="text"><br> <input type="text"><br> <input type="text"><br> <input type="text"><br> <input type="text"><br> <input type="button" value=" 提交 "> ​ ~~~ JavaScript代码 ~~~ // (1)获取所有文本框元素;    var inputs = document.getElementsByTagName('input');    // (2)给所有文本框注册获得焦点事件;    for (var i = 0; i < inputs.length; i++) {        var input = inputs[i];        // 判断当前遍历到的input元素是否是文本框元素        if (input.type !== 'text') {            continue;       }        input.onfocus = function () {            // (3)当事件发生时,先清空所有文本框的高亮效果, 再设置当前文本框背景为高亮; ​            // 先清空所有文本框的高亮效果            for (var j = 0; j < inputs.length; j++) {                var input = inputs[j];                if (input.type !== 'text') {                    continue;               }                input.style.backgroundColor = '';           }            // 设置当前文本框背景为高亮            this.style.backgroundColor = 'lightblue';       }   } ~~~ **5、点击按钮改变div的大小和位置** 目的:练习style中的width,height,top,left,position等属性的使用; 需求分析: (1)给按钮注册点击事件 ; (2)当点击按钮时,改变div的大小和位置。使用DOM操作div的样式,可使用className或style属性 注意:在DOM的样式控制中,ID选择器的优先级高于类选择器 ; html和css代码 ~~~ <style>    /*   #box{       width: 200px;       height: 100px;       background-color: red;   }   */    .cls {        width: 100px;        height: 100px;        background-color: pink;   }    .cls1 {        width: 200px;        height: 200px;        position: absolute;        top: 100px;        left: 100px;        background-color: pink;   } </style> <script src="common.js"></script> <input type="button" value=" 点我 " id="btn"><br> <br> <div id="box" class="cls"></div> ~~~ JavaScript代码 ~~~    // (1)给按钮注册点击事件 ;    var btn = my$('btn');    btn.onclick = function () {        // (2)当点击按钮时,改变div的大小和位置。使用DOM操作div的样式,可使用className或style属性        // 改变div样式的两种方式: className, style        // 方式一: 注意, ID选择器设置样式时,优先级高于其他选择器;        my$('box').className = 'cls1'; ​        // 方式二: style是函内样式, 比className引用的嵌入样式优先级高;        my$('box').style.width = 200 + 'px';        my$('box').style.height = 200 + 'px';        my$('box').style.backgroundColor = 'red';        my$('box').style.position = 'absolute';        my$('box').style.top = 100 + 'px';        my$('box').style.left = 100 + 'px';   } ~~~ **6、列表隔行变色、高亮显示** 目的: 练习style在鼠标移入移出事件中的应用 需求分析: (1)遍历每个li元素,设置样式使其各行变色,利用奇偶性; (2)遍历每个li的时候,注册鼠标移入、移出事件; (3)当鼠标移入时,将原来的颜色变成浅蓝色,鼠标移出时,恢复原来的颜色; html和css代码 ~~~ <style>    /*body{*/    /*background-color: azure;*/    /*background-color: antiquewhite;*/    /*background-color: lightskyblue;*/    /*}*/ </style> <script src="common.js"></script> ​ <ul id="tb">    <li>西施</li>    <li>貂蝉</li>    <li>王昭君</li>    <li>杨玉环</li>    <li>芙蓉姐姐</li> </ul> ~~~ JavaScript代码 ~~~ // (1)遍历每个li元素,设置样式使其各行变色,利用奇偶性;    // 获取所有的li元素    var list = my$('tb').getElementsByTagName('li')    for (var i = 0; i < list.length; i++) {        var li = list[i];        if (i % 2 === 0) {            // 奇数行            li.style.backgroundColor = 'azure';       } else {            // 偶数行            li.style.backgroundColor = 'antiquewhite';       } ​        var bg = '';        // (2)遍历每个li的时候,注册鼠标移入、移出事件;        li.onmouseover = function () {            // console.log('鼠标移入了');            // 获取原来的颜色            bg = this.style.backgroundColor;            // (3)当鼠标移入时,将原来的颜色变成浅蓝色;            this.style.backgroundColor = 'lightskyblue';       }        li.onmouseout = function () {            // console.log('鼠标移出了');            // 鼠标移出时,恢复原来的颜色;            this.style.backgroundColor = bg;       }   } ​ ~~~ **7、 tab选项卡切换** 目的: 自定义属性操作, 样式操作的综合应用 需求分析: (1)给每个span注册鼠标经过事件,当鼠标移入span标签时(tab栏); a、先取消所有span的高亮显示; b、再设置当前span高亮显示; (2)先隐藏所有的div模块, 再设置当前span(tab栏)对应的div模块; 注意, 所有的span标签和所有的div呈对应关系,我们可以利用元素集合的有序性,在span标签中自定义属性index,然后利用index定位到对应的div html和css代码 ~~~ <style>   * {margin:0; padding: 0;}    ul {        list-style-type: none;   }    .box {        width: 400px;        height: 300px;        border: 1px solid #ccc;        margin: 100px auto;        overflow: hidden;   }    .headDiv {        height: 45px;   }    .headDiv span {        display:inline-block;        width: 90px;        background-color: pink;        line-height: 45px;        text-align: center;        cursor: pointer;   }    .headDiv span.current {        background-color: purple;   }    .bodyDiv div {        height: 255px;        background-color: purple;        display: none;   }    .bodyDiv div.current {        display: block;   } </style> ​ <div class="box">    <div class="headDiv" id="headDiv">        <span class="current">体育</span>        <span>娱乐</span>        <span>新闻</span>        <span>综合</span>    </div>    <div class="bodyDiv" id="bodyDiv">        <div class="current">我是体育模块</div>        <div>我是娱乐模块</div>        <div>我是新闻模块</div>        <div>我是综合模块</div>    </div> </div> <script src="common.js"></script> ​ ~~~ JavaScript代码 ~~~ // 1、鼠标放到tab栏时,高亮显示,其他栏取消高亮 //获取元素 var headDiv = my$('headDiv'); var spans = headDiv.getElementsByTagName('span'); for (var i = 0; i < spans.length; i++) {    var span = spans[i];    //给所有的span标签设置一个标记属性    span.setAttribute('index', i);    // 2、注册鼠标经过事件    span.onmouseover = fn; } ​ //事件处理函数 function fn() {    // (1)取消所有span的高亮显示    for (var i = 0; i < spans.length; i++) {        var span = spans[i];        //清空样式        span.className = '';   }    // (2)设置当前span高亮显示    this.className = 'current'; ​    // 3、tab栏对应的div显示,其他div隐藏    var bodyDiv = my$('bodyDiv');    var divs = bodyDiv.getElementsByTagName('div');    for (var i = 0; i < divs.length; i++) {        var div = divs[i];        div.className = '';   }    // 使用span的自定义属性index,定位到对应的div    var index = this.getAttribute('index');    divs[index].className = 'current'; } ~~~