1. DOM简介

1.1 什么是DOM

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

1.2 DOM树

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

2. 获取元素

2.1 如何获取页面元素

DOM在我们实际开发中主要用来操作元素
我们如何来获取页面中的元素呢?
获取页面中的元素可以使用以下几种方式:
• 根据ID获取
• 根据标签名获取
• 通过HTML5新增的方法获取
• 特殊元素获取

2.2 根据ID获取

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

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

2.3 根据标签名获取

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

  1. document.getElementsByTagName('标签名');

注意:
1. 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
2. 得到元素对象是动态的

  1. <!-- 根据标签名获取 -->
  2. <ul>
  3. <li>知否知否,应是等你好久1</li>
  4. <li>知否知否,应是等你好久2</li>
  5. <li>知否知否,应是等你好久3</li>
  6. <li>知否知否,应是等你好久4</li>
  7. <li>知否知否,应是等你好久5</li>
  8. </ul>
  9. <script>
  10. // 根据标签名获取
  11. // 1. 返回的是获取过来元素对象的集合 以伪数组的形式存储的
  12. var lis = document.getElementsByTagName('li');
  13. console.log(lis);
  14. console.log(lis[0]);
  15. // 2. 我们想要依次打印里面的元素对象我们可以采取遍历的方式
  16. for (var i = 0; i < lis.length; i++) {
  17. console.log(lis[i]);
  18. }
  19. // 3. 如果页面中只有一个li 返回的还是伪数组的形式
  20. // 4. 如果页面中没有这个元素 返回的是空的伪数组的形式
  21. </script>

还可以获取某个元素(父元素)内部所有指定标签名的子元素

  1. element.getElementsByTagName('标签名');

注意:父元素必须是单个对象(必须指明是哪一个元素对象) 获取的时候不包括父元素自己

  1. <ol id="ol">
  2. <li>生僻字</li>
  3. <li>生僻字</li>
  4. <li>生僻字</li>
  5. <li>生僻字</li>
  6. </ol>
  7. <script>
  8. // 5. element.getElementsByTagName('标签名');
  9. // var ol = document.getElementsByTagName('ol'); // [ol]
  10. // console.log(ol.getElementsByTagName('li'));
  11. var ol = document.getElementById('ol');
  12. console.log(ol.getElementsByTagName('li'));
  13. </script>

2.4 通过HTML5新增的方法获取

  1. 1. document.getElementByClassName('类名'); // 根据类名返回元素对象集合
  1. 2. document.querySelector('选择器'); // 根据指定选择器返回第一个元素对象
  1. 3. document.querySelectAll('选择器'); // 根据指定选择器返回
  1. <div class="box">盒子</div>
  2. <div class="box">盒子</div>
  3. <div id="nav">
  4. <ul>
  5. <li>首页</li>
  6. <li>产品</li>
  7. </ul>
  8. </div>
  9. <script>
  10. // 1. getElementByClassName 根据类名获得某些元素集合
  11. var boxs = document.getElementsByClassName('box');
  12. console.log(boxs);
  13. // 2. querySelector 返回指定选择器的第一个元素对象 切记 里面的选择器需要加符号 .box #nav
  14. var firstBox = document.querySelector('.box');
  15. console.log(firstBox);
  16. var nav = document.querySelector('#nav');
  17. console.log(nav);
  18. var li = document.querySelector('li');
  19. console.log(li);
  20. // 3. queruSelectorAll()返回指定选择器的所有元素对象集合
  21. var allBox = document.querySelectorAll('.box');
  22. console.log(allBox);
  23. var lis = document.querySelectorAll('li');
  24. console.log(lis);
  25. </script>

2.5 获取特殊元素(body,html)

获取body元素

  1. 1. document.body // 返回body元素对象

获取html元素

  1. 2. document.documentElement // 返回html元素对象
  1. // 1. 获取body元素
  2. var bodyEle = document.body;
  3. console.log(bodyEle);
  4. console.dir(bodyEle);
  5. // 2. 获取html元素
  6. var htmlEle = document.documentElement;
  7. console.log(htmlEle);

3. 事件基础

3.1 事件概述

JavaScript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为
简单理解:触发—-响应机制
网页中的每个元素都可以产生某些可以触发JavaScript的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作

  1. <button id="btn">唐伯虎</button>
  2. <script>
  3. // 点击一个按钮 弹出对话框
  4. // 1. 时间是由三部分组成 事件源 事件类型 事件处理程序 我们也称为事件三要素
  5. // (1) 事件源 事件被触发的对象 谁 按钮
  6. var btn = document.getElementById('btn');
  7. // (2) 事件类型 如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下
  8. // (3) 事件处理程序 通过一个函数赋值的方式完成
  9. btn.onclick = function () {
  10. alert('点秋香');
  11. }
  12. </script>

3.2 执行事件的步骤

  1. 获取事件源
    2. 注册事件(绑定事件)
    3. 添加事件处理程序(采取函数赋值形式) ```javascript
    123

  1. <a name="icZla"></a>
  2. ## 3.3 常见的鼠标事件
  3. | **鼠标事件** | **触发条件** |
  4. | --- | --- |
  5. | onclick | 鼠标点击左键触发 |
  6. | onmouseover | 鼠标经过触发 |
  7. | onmouseout | 鼠标离开触发 |
  8. | onfocus | 获得鼠标焦点触发 |
  9. | onblur | 失去鼠标焦点触发 |
  10. | onmousemove | 鼠标移动触发 |
  11. | onmouseup | 鼠标弹起触发 |
  12. | onmousedown | 鼠标按下触发 |
  13. <a name="Ke0ru"></a>
  14. ## 3.4 分析事件三要素
  15. 下拉菜单三要素<br />关闭广告三要素
  16. <a name="zvlCi"></a>
  17. # 4. 操作元素
  18. JavaScript的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等
  19. <a name="q9WCp"></a>
  20. ## 4.1 改变元素内容
  21. ```javascript
  22. element.innerText

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

  1. element.innerHTML

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

  1. <style>
  2. div,
  3. p {
  4. width: 300px;
  5. height: 30px;
  6. line-height: 30px;
  7. color: #fff;
  8. background-color: pink;
  9. }
  10. </style>
  11. <button>显示当前系统时间</button>
  12. <div>某个时间</div>
  13. <p>123</p>
  14. <script>
  15. // 当我们点击了按钮 div里面的文字会发生变化
  16. // 1. 获取元素
  17. var btn = document.querySelector('button');
  18. var div = document.querySelector('div');
  19. // 2. 注册时间
  20. btn.onclick = function () {
  21. div.innerText = getDate();
  22. }
  23. function getDate() {
  24. var date = new Date();
  25. var year = date.getFullYear();
  26. var month = date.getMonth() + 1;
  27. var dates = date.getDate();
  28. var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
  29. var day = date.getDay();
  30. return '今天是:' + year + '年' + month + '月' + dates + '日' + arr[day];
  31. }
  32. // 我们元素可以不用添加事件
  33. var p = document.querySelector('p');
  34. p.innerHTML = getDate();
  35. </script>

4.2 innerText 和 innerHTML的区别

• innerText 不识别html标签 非标准 去除空格和换行
• innerHTML 识别html标签 W3C标准
• 这两个属性是可读写的 可以获取元素里面的内容

  1. <div></div>
  2. <p>
  3. 我是文字
  4. <span>123</span>
  5. </p>
  6. <script>
  7. // innerText 和 innerHTML的区别
  8. // 1. innerText 不识别html标签 非标准 去除空格和换行
  9. var div = document.querySelector('div');
  10. div.innerText = '<strong>今天是:</strong> 2019';
  11. // 2. innerHTML 识别html标签 W3C标准
  12. div.innerHTML = '<strong>今天是:</strong> 2019';
  13. // 这两个属性是可读写的 可以获取元素里面的内容
  14. var p = document.querySelector('p');
  15. console.log(p.innerText);
  16. console.log(p.innerHTML);
  17. </script>

4.3 常用元素的属性操作

  1. 1. innerTextinnerHTML改变元素内容
  2. 2. srchref
  3. 3. idalttitle

4.3.1 操作元素之修改元素属性

  1. <style>
  2. img {
  3. width: 300px;
  4. }
  5. </style>
  6. <button id="ldh">刘德华</button>
  7. <button id="zxy">张学友</button><br />
  8. <img src="images/ldh.jpg" alt="" title="刘德华">
  9. <script>
  10. // 修改元素属性 src
  11. // 1. 获取元素
  12. var ldh = document.getElementById('ldh');
  13. var zxy = document.getElementById('zxy');
  14. var img = document.querySelector('img');
  15. // 2.注册事件 处理程序
  16. zxy.onclick = function () {
  17. img.src = 'images/zxy.jpg';
  18. img.title = '张学友'
  19. }
  20. ldh.onclick = function () {
  21. img.src = 'images/ldh.jpg';
  22. img.title = '刘德华';
  23. }
  24. </script>

4.3.2 案例:分时显示不同图片,显示不同问候语

根据不同事件,页面显示不同图片,同时显示不同的问候语
如果上午时间打开页面,显示上午好,显示上午的图片
如果下午时间打开页面,显示下午好,显示下午的图片
如果晚上时间打开页面,显示晚上好,显示晚上的图片
案例分析:
① 根据系统不同事件来判断,所以需要用到日期内置对象
② 利用多分支语句来设置不同的图片
③ 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
④ 需要一个div元素,显示不同问候语,修改元素内容即可

  1. <style>
  2. img {
  3. width: 300px;
  4. }
  5. </style>
  6. <img src="images/s.gif" alt="">
  7. <div>上午好</div>
  8. <script>
  9. // 根据系统不同时间来判断,所以需要用到日期内置对象
  10. // 利用多分支语句来设置不同的图片
  11. // 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
  12. // 需要一个div元素,显示不同问候语,修改元素内容即可
  13. // 1.获取元素
  14. var img = document.querySelector('img');
  15. var div = document.querySelector('div');
  16. // 2. 得到当前的小时数
  17. var date = new Date();
  18. var h = date.getHours();
  19. // 3. 判断小时数改变图片和文字信息
  20. if (h < 12) {
  21. img.src = 'images/s.gif';
  22. div.innerHTML = '亲,上午好,好好写代码';
  23. } else if (h < 18) {
  24. img.src = 'images/x.gif';
  25. div.innerHTML = '亲,下午好,好好写代码';
  26. } else {
  27. img.src = 'images/w.gif';
  28. div.innerHTML = '亲,晚上好,好好写代码';
  29. }
  30. </script>

4.4 表单元素的属性操作

利用DOM可以操作如下表单元素的属性:

  1. typevaluecheckedselecteddisabled

4.4.1 操作元素之修改元素属性

  1. <button>按钮</button>
  2. <input type="text" value="输入内容">
  3. <script>
  4. // 1. 获取元素
  5. var btn = document.querySelector('button');
  6. var input = document.querySelector('input');
  7. // 2. 注册事件 处理程序
  8. btn.onclick = function () {
  9. // input.innerHTML = '点击了'; // 这个是普通盒子 比如div标签里面的内容
  10. // 表单里面的值 文字内容是通过value来修改的
  11. input.value = '被点击了';
  12. // 如果想要某个表单被禁用 不能再点击 disabled 我们想要这个按钮button禁用
  13. // btn.disabled = true;
  14. // this执行的是事件函数的调用者 btn
  15. this.disabled = true;
  16. }
  17. </script>

4.4.2 案例:仿京东显示密码

点击按钮将密码框切换为文本框,并可以查看密码明文
image.png
案例分析:
① 核心思路:点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
② 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
③ 算法:利用一个flag变量,来判断flag的值,如果是1就切换为文本框,flag设置为0,如果是0就切换为密码框,flag设置为1

  1. <style>
  2. .box {
  3. position: relative;
  4. width: 400px;
  5. border-bottom: 1px solid #ccc;
  6. margin: 100px auto;
  7. }
  8. .box input {
  9. width: 370px;
  10. height: 30px;
  11. border: 0;
  12. outline: none;
  13. }
  14. .box img {
  15. position: absolute;
  16. top: 2px;
  17. right: 2px;
  18. width: 24px;
  19. }
  20. </style>
  21. <div class="box">
  22. <label for="">
  23. <img src="images/close.png" alt="" id="eye">
  24. </label>
  25. <input type="password" name="" id="pwd">
  26. </div>
  27. <script>
  28. // 1. 获取元素
  29. var eye = document.getElementById('eye');
  30. var pwd = document.getElementById('pwd');
  31. // 2. 注册事件 处理程序
  32. var flag = 0;
  33. eye.onclick = function() {
  34. // 点击一次之后, flag 一定要变化
  35. if (flag == 0) {
  36. pwd.type = 'text';
  37. eye.src = 'images/open.png';
  38. flag = 1; // 赋值操作
  39. } else {
  40. pwd.type = 'password';
  41. eye.src = 'images/close.png';
  42. flag = 0;
  43. }
  44. }
  45. </script>

4.5 样式属性操作

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

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

注意:
1. JS里面的样式采取驼峰命名法 比如 fontSize、backgroundColor
2. JS修改style样式操作,产生的是行内样式,css权重比较高
3. className会直接更改元素的类名,会覆盖原先的类名

  1. <style>
  2. div {
  3. width: 200px;
  4. height: 200px;
  5. background-color: pink;
  6. }
  7. </style>
  8. <div></div>
  9. <script>
  10. // 1. 获取元素
  11. var div = document.querySelector('div');
  12. // 2. 注册事件 处理程序
  13. div.onclick = function() {
  14. // div.style里面的属性 采取驼峰命名法
  15. this.style.backgroundColor = 'purple';
  16. this.style.width = '250px';
  17. }
  18. </script>

4.5.1 案例:淘宝点击关闭二维码

当鼠标点击二维码关闭按钮的时候,则关闭整个二维码
image.png
案例分析:
① 核心思路:利用样式的显示和隐藏完成,display: none 隐藏元素 display: block 显示元素
② 点击按钮,就让这个二维码盒子隐藏起来即可

  1. <style>
  2. .box {
  3. position: relative;
  4. width: 74px;
  5. height: 88px;
  6. border: 1px solid #ccc;
  7. margin: 100px auto;
  8. font-size: 12px;
  9. text-align: center;
  10. color: #f40;
  11. /* display: block; */
  12. }
  13. .box img {
  14. width: 60px;
  15. margin-top: 5px;
  16. }
  17. .close-btn {
  18. position: absolute;
  19. top: -1px;
  20. left: -16px;
  21. width: 14px;
  22. height: 14px;
  23. border: 1px solid #ccc;
  24. line-height: 14px;
  25. font-family: Arial, Helvetica, sans-serif;
  26. cursor: pointer;
  27. }
  28. </style>
  29. <div class="box">
  30. 淘宝二维码
  31. <img src="images/tao.png" alt="">
  32. <i class="close-btn">×</i>
  33. </div>
  34. <script>
  35. // 1. 获取元素
  36. var btn = document.querySelector('.close-btn');
  37. var box = document.querySelector('.box');
  38. // 2.注册事件 程序处理
  39. btn.onclick = function() {
  40. box.style.display = 'none';
  41. }
  42. </script>

4.5.2 案例:循环精灵图背景

可以利用for循环设置一组元素的精灵图背景
image.png
案例分析:
① 首先精灵图图片排序有规律的
② 核心思路:利用for循环,修改精灵图片的背景位置background-position

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. li {
  7. list-style-type: none;
  8. }
  9. .box {
  10. width: 250px;
  11. margin: 100px auto;
  12. }
  13. .box li {
  14. float: left;
  15. width: 24px;
  16. height: 24px;
  17. background-color: pink;
  18. margin: 15px;
  19. background: url(images/sprite.png) no-repeat;
  20. }
  21. </style>
  22. <div class="box">
  23. <ul>
  24. <li></li>
  25. <li></li>
  26. <li></li>
  27. <li></li>
  28. <li></li>
  29. <li></li>
  30. <li></li>
  31. <li></li>
  32. <li></li>
  33. <li></li>
  34. <li></li>
  35. <li></li>
  36. </ul>
  37. </div>
  38. <script>
  39. // 1. 获取元素 所有的小li
  40. var lis = document.querySelectorAll('li');
  41. for (var i = 0; i < lis.length; i++) {
  42. // 让索引号 乘以 44 就是每个li 的背景y坐标 index就是我们的y坐标
  43. var index = i * 44;
  44. lis[i].style.backgroundPosition = '0 -' + index + 'px';
  45. }
  46. </script>

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

当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示
image.png
① 首先表单需要2个新事件,获得焦点onfocus 失去焦点 onblur
② 如果获得焦点,判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容

  1. <style>
  2. input {
  3. color: #999;
  4. }
  5. </style>
  6. <input type="text" value="手机">
  7. <script>
  8. // 1.获取元素
  9. var text = document.querySelector('input');
  10. // 2.注册事件 获得焦点事件 onfocus
  11. text.onfocus = function() {
  12. // console.log('得到了焦点');
  13. if (this.value === '手机') {
  14. this.value = '';
  15. }
  16. // 获得焦点需要把文本框里面的文字颜色变黑
  17. this.style.color = '#333';
  18. }
  19. // 3. 注册事件 失去焦点事件 onblur
  20. text.onblur = function() {
  21. // console.log('失去了焦点');
  22. if (this.value === '') {
  23. this.value = '手机';
  24. }
  25. // 失去焦点需要把文本框里面的文字颜色变浅色
  26. this.style.color = '#999';
  27. }
  28. </script>

4.5.4 使用className修改样式属性操作

  1. <style>
  2. div {
  3. width: 100px;
  4. height: 100px;
  5. background-color: pink;
  6. }
  7. .change {
  8. background-color: purple;
  9. color: #fff;
  10. font-size: 25px;
  11. margin-top: 100px;
  12. }
  13. </style>
  14. <div class="first">文本</div>
  15. <script>
  16. // 1. 使用 element.style 获得修改元素样式 如果样式比较少 或者 功能简单的情况下使用
  17. var test = document.querySelector('div');
  18. test.onclick = function() {
  19. // this.style.backgroundColor = 'purple';
  20. // this.style.color = '#fff';
  21. // this.style.fontSize = '25px';
  22. // this.style.marginTop = '100px';
  23. // 让我们当前元素的类名改为了 change
  24. // 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况
  25. // 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器
  26. // this.className = 'change';
  27. this.className = 'first change';
  28. }
  29. </script>

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

用户如果离开密码框,里面输入个数不是6~16,则提示错误信息,否则提示输入正确信息
image.png
案例分析:
① 首先判断的事件是表单失去焦点onblur
② 如果输入正确则提示正确的信息颜色为绿色小图标变化
③ 如果输入不是6到16位,则提示错误信息颜色为红色小图标变化

  1. <style>
  2. div {
  3. width: 600px;
  4. margin: 100px auto;
  5. }
  6. .message {
  7. display: inline-block;
  8. font-size: 12px;
  9. color: #999;
  10. background: url(images/mess.png) no-repeat left center;
  11. padding-left: 20px;
  12. }
  13. .wrong {
  14. color: red;
  15. background-image: url(images/wrong.png);
  16. }
  17. .right {
  18. color: green;
  19. background-image: url(images/right.png);
  20. }
  21. </style>
  22. <div class="register">
  23. <input type="password" class="ipt">
  24. <p class="message">请输入6~16位密码</p>
  25. </div>
  26. <script>
  27. // 首先判断的事件是表单失去焦点 onblur
  28. // 如果输入正确则提示正确的信息颜色为绿色小图标变化
  29. // 如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化
  30. // 因为里面变化样式较多,我们采取className修改样式
  31. // 1.获取元素
  32. var ipt = document.querySelector('.ipt');
  33. var message = document.querySelector('.message');
  34. //2. 注册事件 失去焦点
  35. ipt.onblur = function() {
  36. // 根据表单里面值的长度 ipt.value.length
  37. if (this.value.length < 6 || this.value.length > 16) {
  38. // console.log('错误');
  39. message.className = 'message wrong';
  40. message.innerHTML = '您输入的位数不对要求6~16位';
  41. } else {
  42. message.className = 'message right';
  43. message.innerHTML = '您输入的正确';
  44. }
  45. }
  46. </script>

4.6 操作元素总结

操作元素是DOM核心内容
image.png

4.7 作业

  1. 世纪佳缘 用户名 显示隐藏内容
    2. 京东关闭广告(直接隐藏即可)
    3. 新浪下拉菜单(微博即可)
    4. 开关灯案例(见素材)

    1. <button id="btn">开关灯</button>
    2. <script>
    3. var btn = document.getElementById('btn');
    4. var flag = 0;
    5. btn.onclick = function() {
    6. if (flag == 0) {
    7. document.body.style.backgroundColor = 'black';
    8. flag = 1;
    9. } else {
    10. document.body.style.backgroundColor = '#fff';
    11. flag = 0;
    12. }
    13. }
    14. </script>

    4.8 排他思想

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

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

    4.8.1 案例:百度换肤

    案例分析:
    ① 这个案例练习的是给一组元素注册事件
    ② 给4个小图片利用循环注册点击事件
    ③ 当我们点击了这个图片,让我们页面背景改为当前的图片
    ④ 核心算法:把当前图片的src路径取过来,给body作为背景即可 ```javascript

  • 19.DOM - 图9
  • 19.DOM - 图10
  • 19.DOM - 图11
  • 19.DOM - 图12

  1. <a name="cCWZV"></a>
  2. ### 4.8.2 案例:表格隔行变色
  3. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21624327/1634620982265-d72ebd95-9485-4a32-95f3-1fbb67ff1a6c.png#height=169&id=GO2dl&margin=%5Bobject%20Object%5D&name=image.png&originHeight=304&originWidth=1141&originalType=binary&ratio=1&size=309208&status=done&style=none&width=636)<br />**案例分析:**<br />① 用到新的鼠标事件 鼠标经过onmouseover 鼠标离开 onmouseout<br />② 核心思路:鼠标经过tr行,当前的行变背景颜色,鼠标离开去掉当前的背景颜色<br />③ 注意:第一行(thea里面的行)不需要变化颜色,因此我们获取的是tbody里面的行
  4. ```javascript
  5. <style>
  6. table {
  7. width: 800px;
  8. margin: 100px auto;
  9. text-align: center;
  10. border-collapse: collapse;
  11. font-size: 14px;
  12. }
  13. thead tr {
  14. height: 30px;
  15. background-color: skyblue;
  16. }
  17. tbody tr {
  18. height: 30px;
  19. }
  20. tbody td {
  21. border-bottom: 1px solid #d7d7d7;
  22. font-size: 12px;
  23. color: blue;
  24. }
  25. .bg {
  26. background-color: pink;
  27. }
  28. </style>
  29. <table>
  30. <thead>
  31. <tr>
  32. <th>代码</th>
  33. <th>名称</th>
  34. <th>最新公布净值</th>
  35. <th>累计净值</th>
  36. <th>前单位净值</th>
  37. <th>净值增长率</th>
  38. </tr>
  39. </thead>
  40. <tbody>
  41. <tr>
  42. <td>003526</td>
  43. <td>农银金穗3个月定期开放债券</td>
  44. <td>1.075</td>
  45. <td>1.079</td>
  46. <td>1.074</td>
  47. <td>+0.047%</td>
  48. </tr>
  49. <tr>
  50. <td>003526</td>
  51. <td>农银金穗3个月定期开放债券</td>
  52. <td>1.075</td>
  53. <td>1.079</td>
  54. <td>1.074</td>
  55. <td>+0.047%</td>
  56. </tr>
  57. <tr>
  58. <td>003526</td>
  59. <td>农银金穗3个月定期开放债券</td>
  60. <td>1.075</td>
  61. <td>1.079</td>
  62. <td>1.074</td>
  63. <td>+0.047%</td>
  64. </tr>
  65. <tr>
  66. <td>003526</td>
  67. <td>农银金穗3个月定期开放债券</td>
  68. <td>1.075</td>
  69. <td>1.079</td>
  70. <td>1.074</td>
  71. <td>+0.047%</td>
  72. </tr>
  73. <tr>
  74. <td>003526</td>
  75. <td>农银金穗3个月定期开放债券</td>
  76. <td>1.075</td>
  77. <td>1.079</td>
  78. <td>1.074</td>
  79. <td>+0.047%</td>
  80. </tr>
  81. <tr>
  82. <td>003526</td>
  83. <td>农银金穗3个月定期开放债券</td>
  84. <td>1.075</td>
  85. <td>1.079</td>
  86. <td>1.074</td>
  87. <td>+0.047%</td>
  88. </tr>
  89. </tbody>
  90. </table>
  91. <script>
  92. // 1.获取元素 获取的是 tbody 里面所有的行
  93. var trs = document.querySelector('tbody').querySelectorAll('tr');
  94. // 2. 利用循环绑定注册事件
  95. for (var i = 0; i < trs.length; i++) {
  96. // 3. 鼠标经过事件 onmouseover
  97. trs[i].onmouseover = function() {
  98. // console.log(11);
  99. this.className = 'bg';
  100. }
  101. // 4. 鼠标离开事件 onmouseout
  102. trs[i].onmouseout = function() {
  103. this.className = '';
  104. }
  105. }
  106. </script>

4.8.3 案例:表单全选取消全选案例

业务需求:
image.png
案例分析:
① 全选和取消全选做法:让下面所有复选框的checked属性(选中状态)跟随全选按钮即可
② 下面复选框需要全部选中,上面全选才能选中做法:给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的,上面全选就不选中