JavaSciipt之DOM(三):操作(增删改查)元素的内容、属性、样式

 
白龙网看来,JS不仅可以改变网页的结构,内容,样式,还可以改变元素的内容与属性。

1、修改元素内容

(1)修改文本内容
修改元素的文本内容,可以添加静态内容,例如,添加一个字符串;也可以添加动态内容,例如通过函数把当前日期加载到页面。
<body>
  <div>点击</div>
  <p>1235</p>
  <h1></h1>
<script>
  //innerText 修改元素文本内容
  var div = document.querySelector('div');
  var p = document.querySelector('p');
  var h1 = document.querySelector('h1');
  h1.innerHTML = getDate();//直接在页面加载当前日期
  div.onclick = function() {
    p.innerText = getDate();//当鼠标点击时才加载当前日期
    
  }
function getDate() {
    var date = new Date();
    var yaer = date.getFullYear();
    var month = date.getMonth() + 1;
    var dates = date.getDate();
    var day = date.getDay();
    var arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
  return  yaer + '年' + month + '月' + dates + '日' + arr[day];
}
</script>
</body>
(2)修改html内容
修改元素内容,还可以使用innerHTML。但是与innerText相比,他们是有区别,也是有联系的。他们的共同点,都可以获取元素内容,修改元素内容。不同点是innerText不支持HTML标签,不保留空格和换行;而innerHTML支持HTML标签,保留空格与换行。
<body>
  <p>
    白龙网
    <span>是一个从建站到SEO的在线服务平台</span>
  </p>
<script>
 var p = document.querySelector('p');
 p.innerHTML = '<b>今天是</b>17号';
 p.innerText = '<b>今天是</b>17号';
 console.log(p.innerText);// innerText 无法识别html标签,并且去除空格、换行
 console.log(p.innerHTML);//innerHTML 支持html标签,并且保留空格、换行
</script>
</body>

2、修改元素属性

(1)基本步骤
修改元素的属性分为三步,一是获取元素,二是添加事件,三是在实现程序中,通过"元素名.属性名 = ‘属性值’"的方式添加、修改属性即可。
<body>
  <button class="btn1">a图片</button>
  <button class="btn2">b图片</button><br>
  <img src="./a.jpg" alt="">
<script>
//获取元素
var ldh = document.querySelector('.btn1');
var zxy = document.querySelector('.btn2');
var img = document.querySelector('img');
//添加事件类型
zxy.onclick = function() {
  img.src = './b.jpg';
   img.title = '第二张图片';
};
ldh.onclick = function() {
  img.src = './a.jpg';
   img.title = '第一张图片';
}
//添加实现程序
</script>
</body>
案例1:根据一天不同时间段,显示不同图片、问候语
这个案例没有添加任何事件,只是在一天不同的时间段内,修改了不同的图片属性与问候语
<body>
  <img src="./a.jpg" alt="">
  <div>上午好</div>
<script>
  //获取元素
  var img = document.querySelector('img');
  var div = document.querySelector('div');
  //获取当前小时
  var time = new Date();
  var h = time.getHours();
  if (h < 12) {
    img.src = './a.jpg';
    div.innerText = '上午好';
  } else if (h < 18) {
    img.src = './b.jpg';
    div.innerText = '下午好';
  } else {
    img.src = './c.jpg';
    div.innerText = '晚上好';
  }
</script>
</body>
案例2:修改表单属性值
<body>
  <button>按钮</button>
  <input type="text" value="请输入关键词">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function() {
  input.value = 'search';//修改input的值要用value,非凡不是innerText
  // btn.disabled = true;
  this.disabled =true;//禁用当前调用者
  
}
</script>
</body>
案例3:修改表单类型,实现密码明文、加密切换功能
这个案例把HTML/CSS/JS融合在一块,实现了密码的明文、加密显示交互效果
<body>
  <style>
    .box {
      position: relative;
      width: 400px;
      height: 35px;
      background-color: #ccc;
      margin: 100px auto;
      border-bottom: 1px solid red;
    }
    .box input {
      height: 29px;
      width: 370px;
      outline: none;
    }
    .box img {
      position: absolute;
      top: 2px;
      right: 2px;
      width: 18px;
      height: 30px;
    }
  </style>
<div class="box">
  <input type="password" name="" id="psd">
  <img src="./close.png" alt="" id="pic">
</div>
<script>
var img = document.getElementById('pic');
var input = document.getElementById('psd');
var flag = 0;//使用flag标记不同的状态,实现在一张图片上点击图片时,显示不同的图片
img.onclick = function() {
  if(flag == 0) {
    input.type = 'text';//修改inpu元素type属性为文本,让密码显示出来
    img.src = './open.png';
    flag = 1;
  }
  else {
    input.type = 'password';//修改input元素的type属性为password,隐藏密码
    img.src = './close.png';
    flag = 0;
  }
}
</script>
</body>

3、修改元素样式

(1)行内样式修改
以 元素.style.属性名 = ‘属性值’ 的形式修改元素的样式;产生了行内样式的效果,因此其优先级最高。样式少,功能简单时,可以使用该方式。
<body>
  <style>
    div {
      width: 200px;
      height: 200px;
      background-color: pink;
    }
  </style>
  <div>白龙网</div>
<script>
  var bgc = document.querySelector('div');
  bgc.onclick = function() {
    bgc.style.backgroundColor = 'red';
    bgc.style.width = '300px';
    bgc.style.fontSize = '50px';
    bgc.style.color = 'white';
    bgc.style.fontWeight = '700';
  }
</script>
</body>
案例1:点击x号,关闭浮选框
这个案例应用到的知识点是,修改元素的样式,当鼠标点击指定按钮时,让目标标签的样式隐藏起来。
<body>
  <style>
    div {
      width: 200px;
      height: 200px;
      padding: 5px 10px 0 0;
      background-color: pink;
      text-align: right;
    }
  </style>
  <div class="box">
    <button class="close">x</button>
  </div>
<script>
  var btn =document.querySelector('.close');
  var boxs = document.querySelector('.box');
  btn.onclick = function() {
    boxs.style.display = 'none';
  }
</script>
</body>
案例2:循环打印精灵图  21
该案例的核心在于循环打印竖着的精灵图片的坐标位置,因为是坚排精灵图片,所以横坐标不用管,肯定是0,而动态变化的是Y坐标位置,并且精灵图片的Y坐标位置有规律0,44,88……所以可以知道背景图片上的所有精灵图片的坐标位置是:0 -44i
案例3:显示隐藏的文本内容
获取焦点文字消失+颜色变化,失去焦点文字出现+颜色恢复
增加了获取焦点、失去焦点两个方法,同时,在这两个方法下,要判断input的值是存在与否,决定给value写入什么,以及字体颜色的变化。这里的text可以用this代替。
<body>
  <style>
    input {
      color: #999;
    }
  </style>
  <input type="text" value="白龙网">
<script>
var text = document.querySelector('input');
text.onfocus = function() {
  if (text.value == '白龙网') {
    text.value = '';
    text.style.color = '#333';
  }
}
text.onblur = function() {
  if (text.value == '') {
    text.value = '白龙网';
    text.style.color = '#999';
  }
}
</script>
</body>
(2)类名样式修改
当要添加的样式比较多时,再使用元素.style就不方便了,可以使用  元素.className = ‘类名’ 的方式给目标元素添加一个类,在类中任意添加样式;如果要删除类名对应的样式,只需要把className的属性值设置为空''即可。
另外,这种添加类,会覆盖掉魇标签中的类,如果要保留原标签中的类,则在等号右侧的引号内先写上原类名,再写上新类名,多类名选择器,不同的类名之间用空格隔开,即:元素.className = ‘原类名 新类名’。
同时,也可以参考上述方法使用tagName添加、修改id。
<body>
  <style>
    div {
      width: 200px;
      height: 200px;
      background-color:red;
    }
    .change {
      font-size: 30px;
      text-align: center;
      line-height: 200px;
    }
    
  </style>
 <div>白龙网</div>
<script>
var ele = document.querySelector('div');
ele.onclick = function() {
ele.className = 'change';
}
</script>
</body>
案例1:失去焦点后,判断输入值的长度,正确与错误信息的显示
<body>
  <style>
 .icon-zhengque {
  color: greenyellow;
 }
 em {
  font-style: normal;
 }
 .spanChange {
  color: red;
 } 
 .emChange {
  color: red;
 }
  </style>
<div class="regist">
  <input type="text" class="sr">
  <span class="iconfont icon-zhengque sp"></span>
  <em class="emtext">请输入6~16位的密码</em>
</div>
<script>
var inputs = document.querySelector('.sr');
var spans = document.querySelector('.sp');
var ems = document.querySelector('.emtext');
inputs.onblur = function() {
  if (inputs.value.length < 6 || inputs.value.length > 16) {
    spans.className = 'iconfont icon-cuowu sp spanChange';
    ems.className = 'emtext emChange';
    ems.innerHTML = '你输入的位置不正确,只能输入6~16位之间哦';
  } else {
    spans.className = 'iconfont icon-zhengque sp';
    ems.className = 'emtext';
    ems.innerHTML = '恭喜你,密码太强悍了';
  }
}
</script>
</body>
案例2:开关灯效果
用flag状态,控制开关两种可能。
<body>
  <button>关灯</button>
 <script>
  var btn = document.querySelector('button');
  var bodys = document.body;
  var flag = 0;
  btn.onclick = function() {
    if (flag == 0) {
    bodys.style.backgroundColor = '#000';
    btn.innerHTML = '开灯';
      flag = 1;
    } else {
      bodys.style.backgroundColor = '#fff';
      btn.innerHTML = '关灯';
      flag = 0;
    } 
  }
 </script>
</body>
案例3:下拉菜单
<body>
  <style>
    .box {
      
    }
    ul {
      list-style: none;
      display: none;
    }
    nav {
      float: left;
    }
  </style>
<div class="box">
  <nav>首页</nav><span class="iconfont icon-zhengque"></span>
  <ul>
    <li>名师</li>
    <li>名师</li>
    <li>名师</li>
    <li>名师</li>
    <li>名师</li>
  </ul>
</div>
<script>
  var span = document.querySelector('span');
  var ul = document.querySelector('ul');
  var flag = 0;
  span.onclick = function() {
    if (flag == 0) {
      ul.style.display = 'block';
      flag = 1;
    } else {
      ul.style.display = 'none';
      flag = 0;
    }
  }
</script>
</body>
案例4:导航条点击变色功能实现,排它思想,双重循环
外层循环控制每一次点击之后目标LI的背景变色,而内层循环控制未变色的其它LI背景色。
<body>
  <style>
    ul {
      list-style: none;
    }
    ul li {
      float: left;
      width: 30px;
      margin-right: 5px;
      border: 1px solid #000;  
    }
  </style>
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
</ul>
<script>
  var lis = document.getElementsByTagName('li');
  console.log(lis);
  for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = function() {
      for (var j = 0; j < lis.length; j++) {
         lis[j].style.backgroundColor = '';
    }
    this.style.backgroundColor = 'red';
    }
  }
</script>
</body>
 
案例5:换肤效果,点击小图显示大图
该案例的的价值有两点,一是使用选择器,先获取上级元素,再获取子元素中的所有图片;二是使用this.src获取当前图片对象的所有地址,然后赋值给body背景图片。要养成使用当前对象this的习惯。
<style>
  body {
    background-image: url(./a.jpg);
    background-repeat: no-repeat;
    background-size:cover;
  }
  ul {
    list-style: none;
  }
  .box {
    width: 655px;
    height: auto;
    margin: 100px auto;
  }
  .box li {
    float: left;
    width: 200px;
    margin-right: 5px;
  }
  img {
    width: 200px;
  }
</style>
<body>
  <div class="box">
    <ul>
      <li><img src="./a.jpg" alt=""></li>
      <li><img src="./b.jpg" alt=""></li>
      <li><img src="./c.jpg" alt=""></li>
    </ul>
  </div>
<script>
  var imgs = document.querySelector('.box').querySelectorAll('img');
  // console.log(imgs);
  for (i = 0; i < imgs.length; i++) {
    imgs[i].onclick = function() {
      var bodys = document.body;
      bodys.style.backgroundImage = 'url(' + this.src + ')'
    }
  }
</script>
</body>
案例6:表格隔行变色的效果
这个特效需要使用两个新的方法onmouseover,onmouseover,让鼠标经过的时候,显示一个种,鼠标过后又是什么颜色。
<style>
 .bg {
  background-color: red;
 }
</style>
<body>
  <table>
    <thead>
      <tr>
        <th>学号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>专业</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
    </tbody>
  </table>
<script>
  var trs = document.querySelector('tbody').querySelectorAll('tr');
  for (i = 0; i < trs.length; i++) {
    trs[i].onmouseover = function() {
      this.className = 'bg';
    }
    trs[i].onmouseout = function() {
      this.className = '';
    }
  }
</script>
</body>
案例7:表单全选与取消全选
<style>
 .bg {
  background-color: red;
 }
 table {
  margin: 100px auto;
  text-align: center;
 }
</style>
<body>
  <table border="1" cellspacing="0" width="600px">
    <thead>
      <tr>
        <th><input type="checkbox" name="" id="chkall"></th>
        <th>学号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>专业</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><input type="checkbox" name="" id=""></td>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td><input type="checkbox" name="" id=""></td>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td><input type="checkbox" name="" id=""></td>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      <tr>
        <td><input type="checkbox" name="" id=""></td>
        <td>001</td>
        <td>刘德华</td>
        <td>男</td>
        <td>19</td>
        <td>计算机网络</td>
      </tr>
      
    </tbody>
  </table>
<script>
  var chkalls = document.getElementById('chkall');
  var chkany = document.querySelector('tbody').getElementsByTagName('input');
  //由于全选框的状态影响子选框的状态,即:全选勾选,子选框全部选中,反之,子选框不命选中,所以只需要把全选框的状态赋值给子选框即可
  chkalls.onclick = function() {
    // console.log(this.checked);当前复选框的选中状态
    //方法1:根据当前全选复选框的状态,循环打印下面4个框的状态
    // if (this.checked) {
    //   console.log(this.checked);
    //   for (var i = 0 ; i < chkany.length; i ++) {
    //   chkany[i].checked = true;
    // }
    // } else {
    //   for (var i = 0 ; i < chkany.length; i ++) {
    //   chkany[i].checked = false;
    // }
    // }
    //方法2:先获取当前复选框架的状态this.checked,再把这个状态赋值给下面4个框的状态
    for (i = 0; i < chkany.length;i++) {
      chkany[i].checked = this.checked;
    }
  }
//由于子复选框的状态影响全选框的状态,所以外层循环控制每次点击事件,同时内层循环控制每个点击时其它子复选框的状态;然后通过flag标记值的变化,来影响全选框的状态
  for (var i = 0;i < chkany.length;i++) {
    chkany[i].onclick = function() {//每一个元素都要绑定事件,所以用chkany[i]
      var flag = true;
      for (var i = 0;i < chkany.length;i++) {
        if(!chkany[i].checked) {//判断4个数组元素的状态,所以用chkany[i]
          flag = false;
        }
      }
      chkalls.checked = flag;
    }
  }
</script>
</body>

4、获取元素属性

(1)属性操作
对元素属性的操作,可以增加、删除,修改、查询。
<body>
  <div id="first" index="111">1</div>
<script>
//A.获取属性(内置属性、自定义属性)
  var div = document.getElementById('first');
  console.log(div.id);//1-1.element.属性名,用来获取元素内置属性
  console.log(div.getAttribute('index'));//1-2.element.getAttribute('属性'),用来获取用户自定义的元素属性
//B.设置属性(修改:有属性为修改,增加:无属性为增加)
  div.id = 'second';
  div.className = 'newclass';//2-1内容属性方法设置类名,用.className
  div.setAttribute('index',222);
  div.setAttribute('class','newclass2');//2-2自定义属性设置类名,用class
//C.移除属性
  div.removeAttribute('index');
</script>
</body>
(2)设置属性
另外,对于自定义属性,我们要从设置、获取两个方面来深入理解:
<body>
<div data-time-name="99">1</div>
<script>
  // 1.获取元素
var div = document.querySelector('div');
// 2.设置自定义属性
div.setAttribute('data-index',22);
div.setAttribute('data-time',88);
//3.获取自定义属性
console.log(div.getAttribute('data-index'));
console.log(div.dataset.index);//dataset是个集合,里面存放了所有以data开头的自定义属性,只能获取以data开头的自定义属性,IE11才支持
console.log(div.dataset.time);//取对象属性的方法一:.属性名
console.log(div.dataset['time']);//取对象属性的方法二:['属性名']
//如果自定义属性名有两个以上的“-”连接,则使用dataset调用属性名时,要用驼峰命名法
console.log(div.getAttribute('data-time-name'));
console.log(div.dataset.timeName);
</script>
</body>
案例1:tab栏切换
主要使用了排它思想与以及自定义属性的设置与获取,内置类的添加
通过这个案例,我们发现,自定义属性可以保存数据,使用数据,即:给元素添加一个自定义属性,再获取自定义属性。从而不用把数据放到数据库中了。自定义属性必须用自定义属性的方法获取。
自定义属性的命名规范:data-index = '123'
<body>
  <style>
    * {
      padding: 0;
      margin: 0;
    }
    ul {
      list-style: none;
    }
    .box {
      margin: 100px auto;
      width: 600px;
      height: 50px;
      background-color: #999;
    }
    .box .top li {
      float: left;
      width: 120px;
      height: 50px;
      text-align: center;
      line-height: 50px;
    }
    .top .current {
      background-color: red;
    }
    .bottom .item {
      display: none;
    }
  </style>
  <div class="box">
    <!-- 上面导航 -->
    <div class="top">
      <ul>
        <li class="current">商品规格</li>
        <li>成品包装</li>
        <li>售后保障</li>
        <li>商品评价</li>
        <li>联系客服</li>
      </ul>
    </div>
    <!-- 下面内容 -->
    <div class="bottom">
      <div class="item">商品规格商品规格商品规格商品规格111</div>
      <div class="item">成品包装成品包装成品包装成品包装222</div>
      <div class="item">售后保障售后保障售后保障售后保障333</div>
      <div class="item">商品评价商品评价商品评价商品评价444</div>
      <div class="item">联系客服联系客服联系客服联系客服555</div>
    </div>
  </div>
<script>
var boxs = document.querySelector('.box');
var lis = boxs.querySelectorAll('li');
var items = boxs.querySelectorAll('.item');
// console.log(lis);
//循环点击每一个LI,让他背景色变红
for (i = 0; i < lis.length; i++) {
  // 2-1每个标签添加一个索引号
  lis[i].setAttribute('index',i);
  lis[i].onclick = function() {
    // 1-1删除其它标签背景颜色
    for (i = 0; i < lis.length; i++) {
      lis[i].className = '';
    }
    // 1-2留下当前标签背景颜色
    this.className = 'current';
    var index = this.getAttribute('index');
    // console.log(index);
    //2-2隐藏单击LI之外索引号对应的内容
    for (i = 0 ; i < items.length; i++) {
      items[i].style.display = 'none';
    }
    //2-3打印索引号对应的内容
    items[index].style.display = 'block';
    
  }
}
</script>
</body>