DOM 在我们实际开发中主要用来操作元素
我们如何来获取页面中的元素呢?
获取页面中的元素可以使用以下几种方式:
使用 getElementById() 方法可以获取带有 ID 的元素对象
<div id="time">2022-4-23</div>
<script>
var timer = document.getElementById('time');
console.log(timer);
</script>
结果:<div id="time">2022-4-23</div>
它返回的结果是一个对象
console.log(typeof timer);
结果:object
console.dir 可以打印我们返回元素对象,更好的查看里面的属性和方法
console.dir(timer);
使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合
<ul>
<li>知否知否,应是等你很久</li>
<li>知否知否,应是等你很久</li>
<li>知否知否,应是等你很久</li>
<li>知否知否,应是等你很久</li>
<li>知否知否,应是等你很久</li>
</ul>
<script>
var lis = document.getElementsByTagName('li');
console.log(lis);
</script>
结果:五个<li>知否知否,应是等你很久</li>
返回的是获取过来元素对象的集合,以伪数组的形式储存的
可以获取这五个元素里面的第一个
<ul>
<li>知否知否,应是等你很久1</li>
<li>知否知否,应是等你很久2</li>
<li>知否知否,应是等你很久3</li>
<li>知否知否,应是等你很久4</li>
<li>知否知否,应是等你很久5</li>
</ul>
<script>
var lis = document.getElementsByTagName('li');
console.log(lis[0]);
</script>
结果:<li>知否知否,应是等你很久1</li>
我们想要一次打印里面的元素对象我们可以采用遍历的方式
for (var i = 0; i < lis.length; i++) {
console.log(lis[i]);
}
结果:
<li>知否知否,应是等你很久1</li>
<li>知否知否,应是等你很久2</li>
<li>知否知否,应是等你很久3</li>
<li>知否知否,应是等你很久4</li>
<li>知否知否,应是等你很久5</li>
注意:
如果页面中只有一个 li 返回的还是伪数组的形式
如果页面中没有该元素呢?
<ul>
</ul>
<script>
for (var i = 0; i < lis.length; i++) {
console.log(lis[i]);
}
</script>
结果:[]
如果页面中没有元素,则返回的是一个空数组
还可以获取某个元素(父元素)内部所有指定标签名的子元素
element.getElementsByTagName('标签名');
注意:父元素必须是单个对象(必须指明是哪一个元素对象) 获取的时候不包括父元素而已
<ol>
<li>知否知否,应是等你很久1</li>
<li>知否知否,应是等你很久2</li>
<li>知否知否,应是等你很久3</li>
<li>知否知否,应是等你很久4</li>
<li>知否知否,应是等你很久5</li>
</ol>
<script>
var ol = document.getElementsByTagName('ol');
console.log(ol[0].getElementsByTagName('li'));
</script>
结果:[li, li, li, li, li]
这样就可以把5个 li 获取出来了
也可以这样写,结果是一样的
var ol = document.getElementById('ol');
console.log(ol.getElementsByTagName('li'));
结果:[li, li, li, li, li]
getElementsByClassName('类名'); 可以根据 Class 类名返回元素对象集合
比如说要获取 box
<box class="box">盒子</box>
<box class="box">盒子</box>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
var boxs = document.getElementsByClassName('box');
console.log(boxs);
</script>
结果:[div.box, div.box]
querySelector('选择器'); 可以根据指定选择器返回第一个元素对象
<box class="box">盒子1</box>
<box class="box">盒子2</box>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
var firstBox = document.querySelector('.box');
console.log(firstBox);
</script>
结果:<box class="box">盒子1</box>
如果想要得到 ID 选择器里面的内容,可以这样输入
var firstBox2 = document.querySelector('#nav');
console.log(firstBox2)
结果:<div id="nav">...</div>
也可以直接选择元素
<box class="box">盒子1</box>
<box class="box">盒子2</box>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
var firstBox3 = document.querySelector('li');
console.log(firstBox3);
</script>
结果:<li>首页</li>
切记,使用 querySelector() 必须加符号
querySelectorAll(); 返回指定选择器所有元素对象
<box class="box">盒子1</box>
<box class="box">盒子2</box>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
var allBox = document.querySelectorAll('.box');
console.log(allBox);
</script>
结果:[div.box, div.box]
1. 获取 body 元素
var bodyEle = document.body;
console.log(bodyEle);
结果:body
它是一个元素对象
2. 获取 html 元素
var htmlEle = documenthtml;
console.log(htmlEle);
结果:undefind
因为 html 比较特殊,所以不能通过这种方法来获取
通过以下方法获取
var htmlEle = document.documentElement;
console.log(htmlEle);
结果:<html>...</html>
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为
简单理解:触发---响应机制
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后取执行某些操作
比如说,点击一个按钮,弹出对话框
1. 事件时由三部分组成:事件源、事件类型、事件处理程序,我们也称为事件三要素
<button id='btn>唐伯虎</button>
<script>
// (1) 事件源,事件被触发的对象
var btn = document.getElementById('btn');
// (2) 事件类型,如果触发?什么事件?比如鼠标点击(onclick),或者鼠标经过,还是键盘按下
// (3) 事件处理程序,通过一个函数赋值的方式完成
btn.onclick = function() {
alert('点秋香');
}
</script>
实例:
执行事件步骤
<div>123</div>
<script>
// 获取事件源
var div = document.querySelector('div');
// 绑定事件和添加事件处理程序
div.onclick = function() {
console.log('我被选中了');
}
</script>
| 鼠标事件 | 触发条件 |
|---|---|
| onclick | 鼠标点击左键触发 |
| onmouseover | 鼠标经过时触发 |
| onmouseout | 鼠标离开时触发 |
| onfocus | 获得鼠标焦点触发 |
| onblur | 失去鼠标焦点触发 |
| onmousemove | 鼠标移动触发 |
| onmouseup | 鼠标弹起触发 |
| onmousedown | 鼠标按下触发 |
JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容、属性等。注意以下都是属性
element.innerText 从其实位置到终止位置的内容,但它去除 html 标签,同时空格和换行也会去掉
element.innerHTML 其实位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行
比如点击按钮替换元素显示系统时间
<button>显示当前系统时间</button>
<div>某个时间</div>
<script>
// 1. 获取元素
var btn = document.querySelector('button');
var div = document.querySelector('div');
// 2. 注册事件
btn.onclick = function() {
div.innerText = '2022-4-23';
}
</script>
结果:2022-4-23 (是死的)
实例:
但是时间并不是动态的,可以通过以前使用过的方法来获取动态时间
<button>显示当前系统时间</button>
<div>某个时间</div>
<script>
var btn = document.querySelector('button');
var div = document.querySelector('div');
btn.onclick = function () {
div.innerText = getDate();
}
function getDate() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
return '今天是' + year + '年' + month + '月' + dates + '日' +
arr[day];
}
</script>
结果:今天是2022年4月23日星期六 (动态)
实例:
如果想要实现刷新浏览器就显示时间的效果可以这样
<p></p>
<script>
function getDate() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
return '今天是' + year + '年' + month + '月' + dates + '日' +
arr[day];
}
var p = document.querySelector('p');
p.innerText = getDate();
</script>
时间会显示到最上面的空 <p></p> 标签
innerText 和 innerHTML 都可以改变 HTML 的内容,但它们有什么区别呢?
首先是 innerText
<div></div>
<script>
var div = document.querySelector('div');
div.innerText = '2022';
</script>
结果:div是 '2022'
但是如果把文字尝试加粗
<div></div>
<script>
var div = document.querySelector('div');
div.innerText = '<strong>2022</strong>';
</script>
结果:div 是 '<strong>2022</strong>'
它不仅没有把文字加粗,反而把标签显示出来了,因为它不识别 HTML 标签
但是如果用的是 innerHTML 呢?
<div></div>
<script>
var div = document.querySelector('div');
div.innerHTML = '<strong>2022</strong>';
</script>
结果:div是'2022'
innerHTML 是 W3C 标准,也是使用最多的
innerText 和 innerHTML 还有另外一个区别,innerText 会去除空格和换行,但是 innerHTML 会保留空格和换行
比如说修改一张图片,需要修改 src 属性
<button id="on">开启</button>
<button id="off">关闭</button>
<img src="images/off.jpg" title="关灯">
<script>
var on = document.getElementById('on');
var off = document.getElementById('off');
var img = document.querySelector('img');
on.onclick = function () {
img.src = 'images/on.jpg';
img.title = '开灯';
}
off.onclick = function () {
img.src = 'images/off.jpg';
img.title = '关灯';
}
</script>
实例:
1. innerText innerHTML 改变元素内容
2. src href
3. id alt title
根据不同时间,页面显示不同图片,同时显示不同问候语。
如果上午时间打开页面,显示上午好,显示上午的图片。
如果下午时间打开页面,显示下午好,显示下午图片。
如果晚上时间打开页面,显示晚上好,显示晚上图片。
案例分析:
代码:
<div> </div>
<img src="">
<script>
var img = document.querySelector('img');
var div = document.querySelector('div');
var date = new Date();
var h = date.getHours();
if (h < 12) {
img.src = 'https://url.cy/WhUPj3';
div.innerHTML = '上午好'
console.log('上午时间');
} else if (h < 18) {
img.src = 'https://url.cy/XvQDk3';
div.innerHTML = '下午好';
console.log('下午时间');
} else {
img.src = 'https://url.cy/sIb5K2';
div.innerHTML = '晚上好';
console.log('晚上时间');
}
</script>
案例:
利用 DOM 可以操作如下表单元素属性:
type、value、checked、selected、disabled
input 标签是 value 属性的,所以不能使用 innerHTML 来修改内容,需要使用 input.value = '内容'; 来修改内容
<button>按钮</button>
<input type="text" value="输入内容">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function () {
input.value = '被点击了';
}
</script>
如果想要某个表单被禁用,不能被再点击,可以使用 disabled
btn.disabled = true;
而 this.disabled 的效果是一样的
this.disabled = true;
代码:
<button>按钮</button>
<input type="text" value="输入内容">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function () {
input.value = '被点击了';
// btn.disabled = true; 也可以这样输入
this.disabled = true; // 经常使用
}
</script>
示例:
点击按钮将密码框切换为文本乱搞,并可以查看密码明文
案例分析:
代码:
<div>
<a id="eye" href="#eye">显示密码</a>
<input type="password" 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.innerHTML = '隐藏密码';
flag = 1;
} else {
pwd.type = 'password';
eye.innerHTML = '显示密码';
flag = 0;
}
}
</script>
我们可以通过 JS 修改元素的大小、颜色、位置等样式
使一个 div 的背景颜色改变
var div = document.querySelector('div');
div.onclick = function () {
this.style.backgroundColor = 'purple';
}
注意:
代码:
<div id="box">
<i id="close">x</i>
<div>我是小广告</div>
</div>
<script>
var box = document.querySelector('#box');
var close = document.querySelector('#close');
close.onclick = function () {
box.style.display = 'none';
}
</script<
示例:
当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示
案例分析:
代码:
<input type="text" value="输入框">
<script>
// 1.获取元素
var text = document.querySelector('input');
// 2.注册事件
text.onfocus = function () { // onfocus 代表获得焦点
if (this.value === '输入框') {
this.value = '';
// 获得焦点需要把文本框里面的文字颜色变黑
this.style.color = '#333';
}
}
text.onblur = function () { // onblur 代表失去了焦点
if (this.value === '') {
this.value = '输入框';
}
// 失去焦点需要把文本框里面的文字颜色变成浅色
this.style.color = '#999';
}
</script>
实例:
如果你尝试给元素点击变换效果实在是很麻烦
test.onclick = function() {
this.style.backgroundColor = 'purple';
this.style.color = #fff;
this.style.fontSize = '25px';
this.style.marginTop = '100px';
}
你可以通过这个代码改变元素的类名
test.onclick = function() {
this.className = 'change';
}
这样就可以改变元素类名了,新类名时 change
注意:
用户如果离开密码框,里面输入个数不是6~16则提示错误信息,否则提示输入正确信息
案例分析:
代码:
<div class="register">
<input type="password" class="ipt">
<p class="message">请输入6~16位密码</p>
</div>
<script>
var ipt = document.querySelector('.ipt');
var message = document.querySelector('.message');
ipt.onblur = function () {
if (this.value.length == 0) {
message.innerHTML = '您没有输入!请输入6~16位密码!';
message.className = 'wrong';
} else if (this.value.length < 6 || this.value.length >
16) {
message.innerHTML =
'您输入的位数错误!请输入6~16位密码!';
message.className = 'wrong';
} else {
message.className = 'right';
message.innerHTML = '您输入的位数正确!';
}
}
</script>
实例:
操作元素是 DOM 核心内容
操作元素:
操作常见元素属性:
操作表单元素属性:
操作元素样式属性
比如有五个按钮,如何实现点击哪个按钮让那个按钮变色,其他按钮复原呢?
利用 for 循环,下面是 JS 代码:
var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
// 我们先把所有的按钮背景颜色去掉
for (var i = 0; i < btns.length; i++) {
btns[i].style.backgroundColor = '';
}
// 然后让当前元素背景颜色位 pink
this.style.backgroundColor = 'pink';
}
}
如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:
代码:自己想去!!
实例:
代码:
var trs = document.querySelector('tbody').querySelectorAll('tr');
for (var i = 0; i < trs.length; i++) {
trs[i].onmouseover = function () {
this.className = 'bg';
}
trs[i].onmouseout = function () {
this.className = '';
}
}
实例:
1. 获取元素的属性值
var 属性 = document.querySelector('元素');
console.log(属性.id);
或者
console.log(div.getAttribute('id'));
添加自定义属性值
<div id='demo' index='1'></div>
element.setAttribute('属性', '值'); 主要针对于自定义属性
属性.setAttribute('index', 2);
修改自定义属性从 1 修改到 2
修改 class 元素
div.setAttribute('class', 'footer');
即能修改自定义属性也能修改 class 属性,因为比较特殊,所以不是 chassName 直接是 class
使用 removeAttribute(属性) 移除属性
属性.removeAttribute('index');
自定义属性 index 就不见了
当鼠标点击上面相应的选项卡(tab),下面内容跟随变化
案例分析:
代码:太长了,所以略
实例:
点我试试