DOM核心知识点 + 节点操作
关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。
创建
innerHTML
createElement
增
appendChild
insertBefore
删
removeChild
改
主要修改dom的元素属性,dom元素的内容、属性, 表单的值等
-
修改元素属性: src、href、title等 (分时显示不同图片,显示不同问候语)
-
修改普通元素内容: innerHTML 、innerText
-
修改表单元素: value、type、disabled等 (仿京东显示密码)
-
修改元素样式: style、className (淘宝点击关闭二维码 循环精灵图背景 显示隐藏文本框内容)
1. 如果样式修改较多,可以采取操作类名方式更改元素样式。
2. class因为是个保留字,因此使用className来操作元素类名属性
3. className 会直接更改元素的类名,会覆盖原先的类名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0lKkWjIf-1631246678902)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910114212413.png)]
- 排他思想 (百度换肤效果 表格隔行变色效果)
如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
查
- 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('你好吗');
};
给元素注册事件, 采取 事件源.事件类型 = 事件处理程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLYHJz5D-1631246678903)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910102859841.png)]
案例
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. 仿京东显示密码
点击按钮将密码框切换为文本框,并可以查看密码明文。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7fYBbPO-1631246678904)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910104741010.png)]
分析:
① 核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
② 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
③ 算法:利用一个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. 淘宝点击关闭二维码
当鼠标点击二维码关闭按钮的时候,则关闭整个二维码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOGaJwtg-1631246678906)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910105458465.png)]
分析:
① 核心思路: 利用样式的显示和隐藏完成, 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 循环设置一组元素的精灵图背景
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JDBzW662-1631246678907)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910105641306.png)]
① 首先精灵图图片排列有规律的
② 核心思路: 利用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. 显示隐藏文本框内容
当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iK8DnAVs-1631246678907)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910110023913.png)]
分析:
① 首先表单需要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,则提示错误信息,否则提示输入正确信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KavObbOD-1631246678908)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910114108787.png)]
<!-- 大体就是失去焦点之后,要进行判断密码的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. 表格隔行变色
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5CkyWpR-1631246678908)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910115123458.png)]
① 用到新的鼠标事件 鼠标经过 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>
文章来源: blog.csdn.net,作者:花花叔叔,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_52077949/article/details/120219345
- 点赞
- 收藏
- 关注作者
评论(0)