Go to comments

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>



Leave a comment 0 Comments.

Leave a Reply

换一张