关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。
创建
innerHTML
createElement
增
appendChild
insertBefore
删
removeChild
改
主要修改dom的元素属性,dom元素的内容、属性, 表单的值等
修改元素属性: src、href、title等 (分时显示不同图片,显示不同问候语)
修改普通元素内容: innerHTML 、innerText
修改表单元素: value、type、disabled等 (仿京东显示密码)
修改元素样式: style、className (淘宝点击关闭二维码 循环精灵图背景 显示隐藏文本框内容)
1. 如果样式修改较多,可以采取操作类名方式更改元素样式。
2. class因为是个保留字,因此使用className来操作元素类名属性
3. className 会直接更改元素的类名,会覆盖原先的类名
排他思想 (百度换肤效果 表格隔行变色效果)
如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
查
DOM提供的API 方法: getElementById、getElementsByTagName 古老用法 不太推荐
H5提供的新方法: querySelector、querySelectorAll 提倡
利用节点操作获取元素: 父(parentNode)、子(children)、兄(previousElementSibling、
nextElementSibling) 提倡
1. document.getElementById('id'); 2. document.getElementsByTagName('标签名'); 3. document.getElementsByClassName(‘类名’);// 根据类名返回元素对象集合 4. document.querySelector('选择器'); // 根据指定选择器返回第一个元素对象 5. document.querySelectorAll('选择器'); // 根据指定选择器返回 6. doucumnet.body // 返回body元素对象 7. document.documentElement // 返回html元素对象
注意:querySelector 和 querySelectorAll里面的选择器需要加符号,比如:document.querySelector(’#nav’);
属性操作
setAttribute:设置dom的属性值
getAttribute:得到dom的属性值
removeAttribute移除属性
<div id="demo" index="1" class="nav"></div> console.log(div.getAttribute('id')); //demo console.log(div.getAttribute('index')); //1 div.setAttribute('index', 2); div.removeAttribute('index');
事件操作
① 获取事件源(按钮)
② 注册事件(绑定事件),使用 onclick
③ 编写事件处理程序,写一个函数弹出 alert 警示框
var btn = document.getElementById('btn'); btn.onclick = function() { alert('你好吗'); };
给元素注册事件, 采取 事件源.事件类型 = 事件处理程序
案例
1. 分时显示不同图片,显示不同问候语
根据不同时间,页面显示不同图片,同时显示不同的问候语。
如果上午时间打开页面,显示上午好,显示上午的图片。
如果下午时间打开页面,显示下午好,显示下午的图片。
如果晚上时间打开页面,显示晚上好,显示晚上的图片。
分析:
① 根据系统不同时间来判断,所以需要用到日期内置对象
② 利用多分支语句来设置不同的图片
③ 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
④ 需要一个div元素,显示不同问候语,修改元素内容即可
<body> <button id="ldh">刘德华</button> <button id="zxy">张学友</button> <br> <img src="./images/zxy.jpg" alt=""> <script> // 1. 获取事件 var ldh = document.getElementById('ldh'); var zxy = document.getElementById('zxy'); var img = document.querySelector('img'); // 2. 绑定事件 + 实现功能函数 ldh.onclick = function () { // 图片的地址进行修改 img.src = './images/ldh.jpg' ; } zxy.onclick = function () { img.src = './images/zxy.jpg' ; } </script> </body>
2. 仿京东显示密码
点击按钮将密码框切换为文本框,并可以查看密码明文。
分析:
① 核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
② 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
③ 算法:利用一个flag变量,来判断flag的值,如果是1 就切换为文本框,flag 设置为0,如
果是0 就切换为密码框,flag设置为1
<body> <div class="box"> <label for=""> <img src="./images/close.png" alt="" id="eye"> </label> <input type="password" name="" id="pwd"> </div> <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> </body>
3. 淘宝点击关闭二维码
当鼠标点击二维码关闭按钮的时候,则关闭整个二维码
分析:
① 核心思路: 利用样式的显示和隐藏完成, display:none 隐藏元素 display:block 显示元素
② 点击按钮,就让这个二维码盒子隐藏起来即可
var btn = document.querySelector('.close-btn'); var box = document.querySelector('.box'); // 2.注册事件 程序处理 btn.onclick = function() { box.style.display = 'none';
4 .循环精灵图背景
可以利用 for 循环设置一组元素的精灵图背景
① 首先精灵图图片排列有规律的
② 核心思路: 利用for循环 修改精灵图片的 背景位置 background-position
③ 剩下的就是考验你的数学功底了
④ 让循环里面的 i 索引号 * 44 就是每个图片的y坐标
var lis = document.querySelectorAll('li'); for (var i = 0; i < lis.length; i++) { // 让索引号 乘以 44 就是每个li 的背景y坐标 index就是我们的y坐标 var index = i * 44; lis[i].style.backgroundPosition = '0 -' + index + 'px'; }
要注意 ‘++’的书写格式
5. 显示隐藏文本框内容
当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示
分析:
① 首先表单需要2个新事件,获得焦点 onfocus 失去焦点 onblur
② 如果获得焦点, 判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容
③ 如果失去焦点, 判断表单内容是否为空,如果为空,则表单内容改为默认文字
<!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> <input type="text" value="手机"> <script> // 获取元素 var text = document.querySelector('input') ; // 注册事件 得到焦点 text.onfocus = function () { // console.log('得到了焦点'); if (text.value == '手机') { this.value = '' ; } // 获得焦点需要把文本框里面的文字颜色变黑 this.style.color = '#333' ; } // 注册事件 失去焦点 text.onblur = function () { // console.log('失去了焦点'); if (text.value == '') { this.value = '手机' ; } this.style.color = '#999' ; } </script> </body> </html>
6. 密码框提示错误信息
用户如果离开密码框,里面输入个数不是6~16,则提示错误信息,否则提示输入正确信息
<!-- 大体就是失去焦点之后,要进行判断密码的value的length是否满足需求,然后更改相应的样式 更改样式的时候使用的是className --> <body> <div class="register"> <input type="password" class="ipt"> <p class="message">请输入6~16位密码</p> <script> var ipt = document.querySelector('.ipt'); var message = document.querySelector('.message'); ipt.onblur = function () { if (this.value.length < 6) { message.className = 'message wrong'; message.innerHTML = '您输入的位数不对,要求是6~16位'; } else { message.className = 'message right'; message.innerHTML = '您输入的正确'; } } </script> </div> </body>
① 首先判断的事件是表单失去焦点 onblur
② 如果输入正确则提示正确的信息颜色为绿色小图标变化
③ 如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化
④ 因为里面变化样式较多,我们采取className修改样式
7. 百度换肤效果
① 这个案例练习的是给一组元素注册事件
② 给4个小图片利用循环注册点击事件
③ 当我们点击了这个图片,让我们页面背景改为当前的图片
④ 核心算法: 把当前图片的src 路径取过来,给 body 做为背景即可
<body> <ul class="baidu"> <li><img src="images/1.jpg"></li> <li><img src="images/2.jpg"></li> <li><img src="images/3.jpg"></li> <li><img src="images/4.jpg"></li> </ul> <script> var imgs = document.querySelector('.baidu').querySelectorAll('img') ; for ( var j = 0 ; j < imgs.length ; j++ ) { imgs[j].onclick = function () { // console.log(this.src); document.body.style.backgroundImage = 'url('+ this.src +')' ; } } </script> </body>
8. 表格隔行变色
① 用到新的鼠标事件 鼠标经过 onmouseover 鼠标离开 onmouseout
② 核心思路:鼠标经过 tr 行,当前的行变背景颜色, 鼠标离开去掉当前的背景颜色
③ 注意: 第一行(thead里面的行)不需要变换颜色,因此我们获取的是 tbody 里面的行
<script> // 获取元素 var trs = document.querySelector('tbody').querySelectorAll('tr') ; for ( var i = 0 ; i < trs.length ; i ++ ) { trs[i].onmouseover = function () { // console.log('11'); this.className = 'bg' ; } trs[i].onmouseout = function () { this.className = '' ; } } </script>
9. tab 栏切换(重点案例)
当鼠标点击上面相应的选项卡(tab),下面内容跟随变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RMVu1kO4-1631246678909)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910120215342.png)]
分析:
① Tab栏切换有2个大的模块
② 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类
名的方式
③ 下面的模块内容,会跟随上面的选项卡变化。所以下面模块变化写到点击事件里面。
④ 规律:下面的模块显示内容和上面的选项卡一一对应,相匹配。
⑤ 核心思路: 给上面的tab_list 里面的所有小li 添加自定义属性,属性值从0开始编号。
⑥ 当我们点击tab_list 里面的某个小li,让tab_con 里面对应序号的 内容显示,其余隐藏(排他思想)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> * { margin: 0; padding: 0; } li { list-style-type: none; } .tab { width: 978px; margin: 100px auto; } .tab_list { height: 39px; border: 1px solid #ccc; background-color: #f1f1f1; } .tab_list li { float: left; height: 39px; line-height: 39px; padding: 0 20px; text-align: center; cursor: pointer; } .tab_list .current { background-color: #c81623; color: #fff; } .item_info { padding: 20px 0 0 20px; } .item { display: none; } </style> </head> <body> <div class="tab"> <div class="tab_list"> <ul> <li class="current">商品介绍</li> <li>规格与包装</li> <li>售后保障</li> <li>商品评价(50000)</li> <li>手机社区</li> </ul> </div> <div class="tab_con"> <div class="item" style="display: block;"> 商品介绍模块内容 </div> <div class="item"> 规格与包装模块内容 </div> <div class="item"> 售后保障模块内容 </div> <div class="item"> 商品评价(50000)模块内容 </div> <div class="item"> 手机社区模块内容 </div> </div> </div> <script> // 1. 背景色 var tab_list = document.querySelector('.tab_list') ; var lis = tab_list.querySelectorAll('li') ; var items = document.querySelectorAll('.item') ; for ( var i = 0 ; i < lis.length ; i ++ ) { // 开始给五个小li设置索引号,使用自定义属性 lis[i].setAttribute('index' ,i) ; lis[i].onclick = function () { // 排他思想 for ( var i = 0 ;i < lis.length ; i ++ ) { lis[i].className = '' ; } this.className = 'current' ; //不需要加. var index = this.getAttribute('index') ; // console.log(index); for ( var i = 0 ; i < items.length ; i ++ ) { items[i].style.display = 'none' ; } items[index].style.display = 'block' ; } } </script> </body> </html>