DOM:Document Object Model (文档对象模型)
DOM主要是针对元素的操作:创建、增删改查、属性操作、事件操作
DOM把下面这些东西都当作对象。
在这里插入图片描述

一、获取元素

获取元素有很多种方式
1.根据ID获取
2.根据标签名获取
3.通过html5新增的方法获取
4.特殊元素获取

1、根据ID获取获取元素

如果多个标签id相同,默认选第一个,但是如果多个标签class相同,都会选出来,详见4

document.getElementById()

这里面有这么几个注意点,第一捏就是文档页面是从上往下读的,所以script标签要写到下面
第二就是参数id大小写一定要一致,第三呢就是返回的timer是一个元素对象

<div id="time">2022-6-30</div>
<script>
    var timer = document.getElementById('time');
    console.log(timer);
    console.log(typeof timer);  //object
    console.dir(timer);
</script>

2、根据标签名获取获取元素

document.getElementsByTagName()

返回的是带有指定标签名的对象的集合(伪数组)
如果页面里只有一个li,返回的还是伪数组,如果没有li,返回的是空的伪数组
如果想获取某个单独的元素对象,使用[ ] 即可

<ul>
    <li>一挑十,别超时,现在开始计时一小时</li>
    <li>一挑十,别超时,现在开始计时一小时</li>
    <li>一挑十,别超时,现在开始计时一小时</li>
    <li>一挑十,别超时,现在开始计时一小时</li>
</ul>
//通过标签名获取元素,这里的意思是获取全部的li
// 如果页面里只有一个li,返回的还是伪数组,如果没有li,返回的是空的伪数组
var lis = document.getElementsByTagName('li');
console.log(lis);  //伪数组[li, li, li, li]
// 我们可以遍历得到里面的每个元素对象
for (var i = 0; i < lis.length; i++) {
    console.log(lis[i]);
}
console.log(typeof lis);  //object
console.log(lis[0]);  //li

3、获取某个父标签内的所有指定标签子元素

父元素对象.getElementsByTagName(‘子元素标签名’)

<ul>
    <li>一挑十,别超时,现在开始计时一小时</li>
    <li>一挑十,别超时,现在开始计时一小时</li>
    <li>一挑十,别超时,现在开始计时一小时</li>
    <li>一挑十,别超时,现在开始计时一小时</li>
</ul>
<ol id="aoligei">
    <li>从蓬莱写到仙台,哥们儿代码信手拈来</li>
    <li>从蓬莱写到仙台,哥们儿代码信手拈来</li>
    <li>从蓬莱写到仙台,哥们儿代码信手拈来</li>
</ol>

比如我要获取ol里面的li:olli[0]意思是第一个ol

//获取某个父标签内的所有指定标签子元素
//获取ol里面的li
var olli = document.getElementsByTagName('ol');  //返回的是伪数组[ol]
console.log(olli[0].getElementsByTagName('li'));  //这样就是还要[0],容易出错

当然啊,最好还是getElementById()比较好,可以直接选出来想要的父元素ol,不用再[]了

//当然啊,最好还是byid比较好,可以直接选出来想要的父元素ol
var olli = document.getElementById('aoligei');
console.log(olli.getElementsByTagName('li'));

4、H5新增通过类名获取元素

如果多个标签id相同,默认选第一个(详见1),但是如果多个标签class相同,都会选出来,返回的也是伪数组

document.getElementsByClassName('类名')

举例:

<div class="box">盒子1</div>
<div class="box">盒子2</div>
var boxes = document.getElementsByClassName('box');
console.log(boxes);  //[div.box, div.box]

5、H5新增牛逼获取方式

切记里面的选择器要加符号,比如.box ,#nav
假设我这里有这样几个标签

<div class="box">盒子1</div>
<div class="box">盒子2</div>
    <ol id="nav">
    <li>从蓬莱写到仙台,哥们儿歌词信手拈来</li>
    <li>从蓬莱写到仙台,哥们儿歌词信手拈来</li>
    <li>从蓬莱写到仙台,哥们儿歌词信手拈来</li>
</ol>

(1)querySelecter返回指定选择器的第一个对象

在这里插入图片描述

(2)querySelecterAll返回指定选择器的全部对象集合

在这里插入图片描述

6、获取body和html元素在这里插入图片描述

二、事件基础

1.事件三要素:事件源,事件类型,事件处理程序

事件要包括:
1.事件源,事件出发的对象,我们要对谁操作?
2.事件类型,事件是如何出发的,是点击(onclick)?还是鼠标经过,还是键盘按下
3.事件处理程序,通过一个函数赋值,这个事件能实现什么功能

<button id="btn">点击开始rap</button>
<script>
    var my = document.getElementById('btn');
    my.onclick = function () {
        alert('从蓬莱写到仙台,哥们儿代码信手拈来');
    }
</script>

切记tagname返回的是伪数组

var you = document.getElementsByTagName('div');
//切记tagname返回的是伪数组
you[0].onclick = function () {
    console.log('你被选中了');
}

2.常见的鼠标事件:

在这里插入图片描述

三、操作元素(核心)

1.修改元素内容

(1)innerText和innerHTML的区别:

1、innerText不识别html标签,但是innerHTML可以识别
比如下面这个:

<div>嗷嗷嗷</div>
var ao = document.querySelector('div');
ao.innerText = '<strong>aoaoao</strong>嘻嘻嘻';
ao.innerHTML = '<strong>aoaoao</strong>嘻嘻嘻';

显示的结果是不一样的
在这里插入图片描述
在这里插入图片描述
2、innerText会去除空格和换行,innerHTML会保留原版写法

(2)这两个属性都是既可以读,又可以写的

可以ao.innerText或者ao.innerHTML显示里面的内容,也可以改,改的话可以直接改,也可以给个事件

(3)innerHTML用的比较多

        //1.先把元素选出来
        var btn = document.querySelector('button');
        var ao = document.querySelector('div');
        //2.操作它
        //可以直接改
        ao.innerText = '现在的时间';
        //也可以给点功能
        btn.onclick = function () {
            ao.innerText = getTime();
        }

        //封装一个函数,返回当前的时分秒
        function getTime() {
            var now = new Date();
            var hour = now.getHours();
            var minutes = now.getMinutes();
            var seconds = now.getSeconds();
            // 为了更好的视觉效果,如果小于10应该补0
            hour = hour < 10 ? '0' + hour : hour;
            minutes = minutes < 10 ? '0' + minutes : minutes;
            seconds = seconds < 10 ? '0' + seconds : seconds;
            return hour + ':' + minutes + ':' + seconds;
        }

2.修改元素属性

元素.属性名 = ‘属性值’
看看下面这个案例就明白了:
点击按钮切换图片

	//1.先把元素选出来
	var one = document.getElementById('one');
	var two = document.getElementById('two');
	var demo = document.querySelector('img');
	//2.给个事件
	one.onclick = function () {
	    demo.src = './images/1.jpg';
	    demo.title = 'one';
	}
	two.onclick = function () {
	    demo.src = './images/2.jpeg';
	    demo.title = 'two';
	}

案例:根据不同时间,显示不同的图片和问候语
如果上午时间打开页面,显示上午好,显示上午的图片
如果下午时间打开页面,显示下午好,显示下午的图片
如果晚上时间打开页面,显示晚上好,显示晚上的图片

	<div>上午</div>
	<img src="./images/1.jpg" alt="">
	var time = document.querySelector('div');
	var img = document.querySelector('img');
	var date = new Date();
	var now = date.getHours();
	
	if (now >= 6 && now < 12) {
	    alert('上午好北鼻');
	    time.innerHTML = '上午';
	    img.src = './images/1.jpg';
	}
	else if (now >= 12 && now < 20) {
	    alert('下午好北鼻');
	    time.innerHTML = '下午';
	    img.src = './images/2.jpg';
	}
	else {
	    alert('晚上好北鼻');
	    time.innerHTML = '晚上';
	    img.src = './images/3.jpg';
	} 

3.修改表单属性

和上边差不多
注意这个this的巧用
在这里插入图片描述

京东显示密码明文案例:

	.box {
	    position: relative;
	    margin: 100px auto;
	    width: 500px;
	    border-bottom: 1px solid #ccc;
	}
	
	.box input {
	    width: 400px;
	    height: 40px;
	    outline: none;
	    border: 0;
	}
	
	.box span {
	    display: block;
	    position: absolute;
	    top: 5px;
	    right: 10px;
	    width: 30px;
	    height: 30px;
	    background-color: pink;
	    border-radius: 15px;
	}
<div class="box" id="box">
    <label for="pwd"></label>
    <input type="password" name="" id="pwd">
    <span id="btn"></span>
</div>

<script>
    //获取元素
    var box = document.getElementById('box');
    var btn = document.getElementById('btn');
    var pwd = document.getElementById('pwd');
    var flag = 0;
    btn.onclick = function () {
        if (flag == 0) {
            pwd.type = 'text';
            flag = 1;
        } else {
            pwd.type = 'password';
            flag = 0;
        }
    }
</script>

4.修改CSS样式属性

(1)元素.style.属性名 = ‘属性值’

比如我要实现鼠标点击元素,实现宽度改变,背景颜色改变

div {
    width: 200px;
    height: 200px;
    background-color: pink;
}

1.第一步仍然是获取元素,然后element.style.属性名 = ‘修改后的’,就可以
2.这里this指向的是被调用者,也就是谁调用的事件
3.属性名都是驼峰命名法,这个要注意,容易出错
4.这些改变,都是放在了行内样式的style里,所以权重比较高,会优先执行,也就是说js里改样式权重比较高
在这里插入图片描述

<div id="div"></div>
<script>
    //1.获取元素
    var a = document.getElementById('div');
    a.onclick = function () {
        // this指向的是被调用者,这里是a,也就是div
        this.style.backgroundColor = 'purple';  //注意驼峰命名法
        this.style.width = '300px';
    }
</script>

点击叉号关闭广告案例:

   * {
        box-sizing: border-box;
    }

    .box {
        position: relative;
        text-align: center;
        margin: 100px auto;
        width: 150px;
        height: 200px;
        border: 1px solid #ccc;
    }

    .close-btn {
        position: absolute;
        display: block;
        top: -1px;
        left: -20px;
        width: 20px;
        height: 20px;
        line-height: 20px;
        padding-left: 1px;
        border: 1px solid #ccc;
    }
<div class="box">
    <p>淘宝二维码</p>
    <img src="./images/tb.png" alt="aaaa">
    <i class="close-btn"></i>
</div>

<script>
    var box = document.querySelector('.box');
    var btn = document.querySelector('.close-btn');
    btn.onclick = function () {
        box.style.display = 'none';
    }
</script>

(2)元素.className = ‘类名’

如果我们在一个事件中要同时更改多个样式,比如这样

var div = document.getElementById('div');
div.onclick = function () {
    this.style.backgroundColor = 'red';
    this.style.fontSize = '16px';
    this.style.width = '100px';
    this.style.color = 'black';
}

那么写起来会相当的麻烦,但是我们可以把这些都写到css里,然后起个类名

.change {
    width: 100px;
    color: black;
    font-size: 16px;
    background-color: red;
}

这样的话,我们就可以把第一块儿代码改成

var div = document.getElementById('div');
div.onclick = function () {
    this.className = 'change';
}

so easy
不过这里要注意,如果标签本来就有类名,那么这样写会把原类名直接覆盖,如果想保留原类名,要这么写:
this.className = ‘change 原类名’;
就是把原类名也添进去

5.循环精灵图

前提是精灵图是竖着按照一定规律拍好的,x轴坐标为0,y轴按一定规律排列
这里写个大概的思路,这里要注意
变量要有,单位要有,负号要有,xy轴之间的空格也要有

var ul = document.getElementsByTagName('ul');
var lis = ul[0].getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
    //注意这个写法,变量要有,单位要有,负号要有,xy轴之间的空格也要有
    lis[i].style.backgroundPosition = '0 -' + 44 * i + 'px';
}

6.密码框验证信息

实现一个密码框,输入密码长度不对的时候提示不对,颜色变红。输入密码长度正确时提示正确,颜色变绿

 .box {
            padding-left: 20px;
            margin: 100px auto;
            width: 400px;
            height: 50px;
            border: 1px solid #ccc;
        }

        .check {
            display: inline-block;
            padding-left: 30px;
        }

        .wrong {
            color: red;
        }

        .correct {
            color: green;
        }
  <div class="box">
        <input type="password" class="pwd">
        <p class="check">请输入6~16位的密码</p>
    </div>

    <script>
        var pwd = document.querySelector('.pwd');
        var check = document.querySelector('.check');
        //出发离开焦点事件
        pwd.onblur = function () {
            //根据表单里内容的长度来判断 pwd.value.length
            var tag = pwd.value.length;
            if (tag < 6 || tag > 16) {
                check.className = 'check wrong';
                check.innerHTML = '你输入的密码长度不对!'
            } else {
                check.className = 'check correct';
                check.innerHTML = '密码格式正确'
            }
        }
    </script>
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐