JavaScript DOM操作初探
一、什么是DOM?
DOM — > Document Object Model
DOM定义了表示和修改文档所需的对象、这些对象的行为和属性以及这些对象之间的关系。DOM对象即为宿主对象,由浏览器厂商定义,用来操作html和css功能的一类对象的集合。也有人称DOM是对HTML以及XML的标准编程接口。
DOM 是一套方法的集合的统称,也就是说 DOM 里面提供了一系列方法,这一系列方法是干什么的呢?
这一系列方法是有利于我们操作 HTML 和 XML 的。
为什么是操作 HTML 和 XML 不应该是 HTML 和 CSS 吗?
可以通过间接的方式改变 CSS 行间样式,DOM 只能操作 HTML 任何东西都操作不了 CSS。
但是 HTML 和 XML 本质上是一个东西,XML 是 HTML 最早的一个版本,最开始 XML -> Xhtml -> HTML4.0 -> HTML5.0。
xml 现在是不用了,xml 和 html 最大的不同是 xml 里面的标签是可以自定义的,比如 xml 如果想定义一个 studen 标签
<student> <name>GLee</name> <age>37</age> </studen>
xml 什么都干不了,它只能表示一种数据格式,
DOM 提供的这一套方法用来操作 HTML 和 XML的,DOM 是这一套方法的集合,所以也有人称 DOM 是 html 和 xml 的编程借口。
什么叫接口?
我这有方法,你那有东西,我这方法要操作你的东西,
DOM 就是用来链接,DOM 给出了一套方法用来操作 HTML 和 XML,编程借接口就是一个实现途径。
二、DOM简单应用
DOM 想操作 html 先选择 html,可以通过标签名的方法把 div 标签全选出来,选择之后封装到一个类数组里面
<div><div/>
<script>
var box = document.getElementsByTagName('div')[0]; // div被选择到js里面后,可以被我们操作了
console.log(box); // <div>box</div>
// 给div添加属性,选出来是一个对象叫"dom对象",操作跟对象是一样的
box.style.width = "100px";
box.style.height = "100px";
box.style.backgroundColor = "red";
</script>有 dom 操作之后就可变成交互的了,交互就是我们动一下它能给我们一个反应
1、交互效果
box 代表 div,box 上面可以加一个交互效果的事件监听
<div>box</div>
<script>
var box = document.getElementsByTagName('div')[0];
box.style.width = "100px";
box.style.height = "100px";
box.style.backgroundColor = "red";
box.onclick = function(){ // "onclick"代表这个div一旦被点击了,就会触发后面的function执行
this.style.backgroundColor = 'green'; // 谁调用的函数谁是this
this.style.width = "200px";
this.style.height = "200px";
this.style.borderRadius = '50%';
}
</script>利用基础的操作就可以变得很好玩,点击一次变红色再点击一次变黄色,再点击变黄色再变红色。
第一种方法计数器的方式(颜色取模)
<div><div/>
<script>
var box = document.getElementsByTagName('div')[0];
box.style.backgroundColor = "red";
box.style.width = '200px';
box.style.height = '200px';
var count = 0; // 计数器
box.onclick = function () {
count ++; // 计数器每次都加加
if(count % 2 == 1){
this.style.backgroundColor = "yellow";
}else{
this.style.backgroundColor = "red";
}
}
</script>第二种方法
<div><div/>
<script>
var box = document.getElementsByTagName('div')[0];
box.style.backgroundColor = "red";
box.style.width = '200px';
box.style.height = '200px';
var lock = true;
box.onclick = function () {
if(lock){
this.style.backgroundColor = "yellow";
this.style.width = '200px';
this.style.height = '100px';
lock = false;
}else{
this.style.backgroundColor = "red";
this.style.width = '100px';
this.style.height = '200px';
lock = true;
}
}
</script>getElementsByTagName() 方法
document 上有方法 getElementsByTagName 通过标签名(TagName)的方式把标签选出来,
里面填写 div 就能把所有的 div 元素都选出来,选出来后封装到一个“类数组”里面,
所有 div 元素按照“类数组”的索引位进行排序,通过“类数组”的索引拿到特定的一个div
<div><div/>
<script>
var box = document.getElementsByTagName("div")[0]; // 这样div就被选到javascript里面,可以被我们操作了
console.log(box); // <div>box</div>
</script>2、选项卡
写一个稍微难一点的选项卡
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>选项卡</title>
<style>
ul, div{margin:0;padding:0;font-size:14px;}
section{display:block;width:300px;height:230px;margin:0 auto;}
ul{width:300px;height:30px;}
li{
list-style-type: none;
width:100px;height:30px;line-height:30px;
float:left;text-align:center;
}
.active{
width:98px;
border-top:1px solid rgba(0,0,0,.3);
border-left:1px solid rgba(0,0,0,.3);
border-right:1px solid rgba(0,0,0,.3);
background-color: #fff;
}
div{
width:298px;height:200px;text-align:center;line-height:200px;
border:1px solid rgba(0,0,0,.3);
display:none;
}
</style>
</head>
<body>
<section>
<ul>
<li class="active">HTML</li>
<li>Glee</li>
<li>JavaScript</li>
</ul>
<div style="display:block;">HTML</div>
<div>Glee</div>
<div>JavaScript</div>
</section>
<script>
var btn = document.getElementsByTagName("li");
var div = document.getElementsByTagName("div");
for(var i = 0; i < btn.length; i++){ // 循环给每个按钮一个事件
// 当btu被点击的时候执行一个函数,函数里面执行体是
// 1.让所有的btu去掉className样式,
// 2.然后让当前被点击的but加上className
btn[i].onclick = function () {
for(var j = 0; j < btn.length; j++){
btn[j].className = "";
}
this.className = "active";
}
}
</script>
</body>
</html>接着实现点那个按钮,对应的 div 显示出来
var btn = document.getElementsByTagName("li");
var div = document.getElementsByTagName("div");
for(var i = 0; i < btn.length; i++){
btn[i].onclick = function () {
for(var j = 0; j < btn.length; j++){
btn[j].className = "";
div[j].style.display = "none"; // 让所有的div都设置隐藏
}
this.className = "active";
// 然后让当前点击对应的的div显示
// 这里没法用this因为在btn里面只能用div[]
// 但是这里的div[i]不对应,因为绑定了函数不是立即执行的,一旦执行的式i就变了
div[i].style.display = "block";
}
}用立即执行函数形成一个闭包
var btn = document.getElementsByTagName("li");
var div = document.getElementsByTagName("div");
for(var i = 0; i < btn.length; i++){
(function(n){ // 用立即执行函数形成一个闭包,把i传进去
btn[i].onclick = function () {
for(var j = 0; j < btn.length; j++){
btn[j].className = "";
div[j].style.display = "none";
}
this.className = "active";
div[n].style.display = "block";
}
}(i))
}3、小方块的运动
再写一个小方块的运动
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小方块的运动</title>
</head>
<body>
<script>
var div = document.createElement('div'); // 不在页面上写div了创建一个div
document.body.appendChild(div); // 把在js里创建的div插入后页面上
// 页面上有div后就可以操作div
div.style.width = "100px";
div.style.height = "100px";
div.style.backgroundColor = "red";
div.style.position = "absolute";
div.style.left = "0";
div.style.top = "0";
// 持续移动div一秒移动一下。
setInterval(function () {
div.style.left = parseInt(div.style.left) + 1 + 'px'; // div.style.left取出来的值是字符串,把字符串变成数字在加1
div.style.top = parseInt(div.style.top) + 1 + 'px';
//div.innerText = parseInt(div.style.left);
}, 50);
</script>
</body>
</html>还可以绑定键盘方向键(上:38、下:40、左:37、右:39)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小方块的运动</title>
</head>
<body>
<script>
var div = document.createElement('div');
document.body.appendChild(div);
div.style.width = "100px";
div.style.height = "100px";
div.style.backgroundColor = "red";
div.style.position = "absolute";
div.style.left = "0";
div.style.top = "0";
document.onkeydown = function (e) { // 绑定键盘方向键
switch(e.which){
case 38 :
div.style.top = parseInt(div.style.top) - 5 + 'px'; // 往上走top减
break;
case 40 :
div.style.top = parseInt(div.style.top) + 5 + 'px'; // 往下周top加。知道俄罗斯方块是怎么做的吗?往下按加速。
break;
case 37 :
div.style.left = parseInt(div.style.left) - 5 + 'px';
break;
case 39 :
div.style.left = parseInt(div.style.left) + 5 + 'px';
break;
}
}
</script>
</body>
</html>实现按住一个键加速怎么办?
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小方块的运动</title>
</head>
<body>
<script>
var div = document.createElement('div');
document.body.appendChild(div);
div.style.width = "100px";
div.style.height = "100px";
div.style.backgroundColor = "red";
div.style.position = "absolute";
div.style.left = "0";
div.style.top = "0";
var time = new Date().getTime(); // 时间戳节点,该时刻的时间片。让下一次执行减去这一刻执行的时间。
var speed = 5;
// 按住加速。什么叫按住?这一秒触发时间和下妙触发事件和再触发时间,间隔时间十分短。间隔事件十分短就认为是加速了。
// 间隔时间是能求的。
// 思路:
// 让每一次按下的时候都记录一次新的时间片段,然后减去上一次执行的那个时间片段。如果时间片段小于一定的毫秒数的话,我们让一个计数器去加加,当连续小于的时候就让这个计数器连续加加。
// 如果加加到一定数的时候,我们认为是连续按了,如果再按的话就加速了。
// 然后让每一次按的时候判断一下,如果这一次按的毫秒数减去上一次按的毫秒数,如果间隙过大的话,还得让计时器重新归零。如果不重新规律怎么判断他是连续的呢?
// 这个代码比较复杂,先看一下思路!
document.onkeydown = function (e) {
switch(e.which){
case 38 :
div.style.top = parseInt(div.style.top) - speed + 'px'; // 操作这个speed就可以了
break;
case 40 :
div.style.top = parseInt(div.style.top) + speed + 'px';
break;
case 37 :
div.style.left = parseInt(div.style.left) - speed + 'px';
break;
case 39 :
div.style.left = parseInt(div.style.left) + speed + 'px';
break;
}
// new Date().getTime() - time;
}
</script>
</body>
</html>3、画板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>画板</title>
<style>
*{
margin:0;
padding:0;
}
body{
background-color: rgba(0, 0, 0, .2);
}
li{
width:30px;
height:30px;
float: left;
list-style-type: none;
/* background-color: #B8860B; */
}
ul{
width:420px;
height:420px;
/* border:1px solid rgba(0,0,0 ,.3); */
position:absolute;
top:50%;
left:50%;
margin-left:-210px;
margin-top: -210px;
background-color: #fff;
}
</style>
</head>
<body>
<ul></ul>
<script>
var oul = document.getElementsByTagName('ul')[0];
var lis = '';
for(var i = 0; i < 196; i++){
lis += '<li img-data = "0"></li>';
}
oul.innerHTML = lis;
oul.onmouseover = function(e){
var event = e || window.event;
var target = event.target || event.srcElement;
target.style.backgroundColor = "rgb(0 ,255, " + target.getAttribute('img-data') + ")";
target.setAttribute('img-data', parseInt(target.getAttribute('img-data')) + 20);
}
</script>
</body>
</html>