day02 - Web APIs
学习目标:
能够说出排他操作的一般实现步骤
能够使用html5中的dataset方式操作自定义属性
能够根据提示完成百度换肤的案例
能够根据提示完成全选案例
能够根据提示完成tab栏切换案例
能够区分元素节点、文本节点、属性节点
能够获取指定元素的父元素
能够获取指定元素的所有子元素
能够说出childNodes和children的区别
能够使用createElement创建页面元素
1.1. 排他操作
1.1.1 排他思想

如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
所有元素全部清除样式(干掉其他人)
 
给当前元素设置样式 (留下我自己)
 
注意顺序不能颠倒,首先干掉其他人,再设置自己
 
 <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> <button>按钮4</button> <button>按钮5</button> <script>                  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 = '';                 }                                  this.style.backgroundColor = 'pink';
              }         } </script>
   | 
 
1.2 案例:百度换肤


<body>     <ul class="baidu">         <li><img src="images/1.jpg"></li>         <li><img src="images/2.jpg"></li>         <li><img src="images/3.jpg"></li>         <li><img src="images/4.jpg"></li>     </ul>     <script>         // 1. 获取元素          var imgs = document.querySelector('.baidu').querySelectorAll('img');         // console.log(imgs);         // 2. 循环注册事件          for (var i = 0; i < imgs.length; i++) {             imgs[i].onclick = function() {                 // this.src 就是我们点击图片的路径   images/2.jpg                 // console.log(this.src);                 // 把这个路径 this.src 给body 就可以了                 document.body.style.backgroundImage = 'url(' + this.src + ')';             }         }     </script> </body>
   | 
 
1.3 案例:表格隔行变色


<script>                  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 = '';             }         } </script>
   | 
 
1.4 案例:全选


<script>                                    var j_cbAll = document.getElementById('j_cbAll');          var j_tbs = document.getElementById('j_tb').getElementsByTagName('input');                   j_cbAll.onclick = function() {                                  console.log(this.checked);                 for (var i = 0; i < j_tbs.length; i++) {                     j_tbs[i].checked = this.checked;                 }          }                   for (var i = 0; i < j_tbs.length; i++) {             j_tbs[i].onclick = function() {                                  var flag = true;                                  for (var i = 0; i < j_tbs.length; i++) {                     if (!j_tbs[i].checked) {                         flag = false;                         break;                      }                 }                                  j_cbAll.checked = flag;             }         } </script>
   | 
 
1.5. 自定义属性操作
1.5.1 获取属性值

<div id="demo" index="1" class="nav"></div>     <script>         var div = document.querySelector('div');                           console.log(div.id);                  console.log(div.getAttribute('id'));         console.log(div.getAttribute('index')); </script>
   | 
 
1.5.2. 设置属性值

     div.id = 'test';  div.className = 'navs';    div.setAttribute('index', 2); div.setAttribute('class', 'footer'); 
   | 
 
1.5.3. 移出属性

  div.removeAttribute('index');
 
  | 
 
1.5.4. 案例:tab栏


<script>                  var tab_list = document.querySelector('.tab_list');         var lis = tab_list.querySelectorAll('li');         var items = document.querySelectorAll('.item');                  for (var i = 0; i < lis.length; i++) {                          lis[i].setAttribute('index', i);             lis[i].onclick = function() {                                                   for (var i = 0; i < lis.length; i++) {                     lis[i].className = '';                 }                                  this.className = 'current';                                  var index = this.getAttribute('index');                 console.log(index);                                  for (var i = 0; i < items.length; i++) {                     items[i].style.display = 'none';                 }                                  items[index].style.display = 'block';             }         } </script>
   | 
 
1.5.5. H5自定义属性
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute(‘属性’) 获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
H5给我们新增了自定义属性:


<div getTime="20" data-index="2" data-list-name="andy"></div> <script>         var div = document.querySelector('div');                  console.log(div.getAttribute('getTime'));         div.setAttribute('data-time', 20);         console.log(div.getAttribute('data-index'));         console.log(div.getAttribute('data-list-name'));                           console.log(div.dataset);         console.log(div.dataset.index);         console.log(div.dataset['index']);                  console.log(div.dataset.listName);         console.log(div.dataset['listName']); </script>
   | 
 
1.6. 节点操作
1.6.1. 节点概述
    网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
    HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。

    一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

1.6.2. 节点层级
    利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
    
1.6.3. 父级节点

<div class="demo">         <div class="box">             <span class="erweima">×</span>         </div> </div> <script>                  var erweima = document.querySelector('.erweima');                           console.log(erweima.parentNode); </script>
   | 
 
1.6.4. 子节点
所有子节点

子元素节点

<ul>     <li>我是li</li>     <li>我是li</li>     <li>我是li</li>     <li>我是li</li> </ul> <script>          var ul = document.querySelector('ul');     var lis = ul.querySelectorAll('li');          console.log(ul.childNodes);     console.log(ul.childNodes[0].nodeType);     console.log(ul.childNodes[1].nodeType);          console.log(ul.children); </script>
   | 
 
第1个子节点

最后1个子节点

第1个子元素节点

最后1个子元素节点

    实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?

<ol>         <li>我是li1</li>         <li>我是li2</li>         <li>我是li3</li>         <li>我是li4</li>         <li>我是li5</li> </ol> <script>         var ol = document.querySelector('ol');                  console.log(ol.firstChild);         console.log(ol.lastChild);                  console.log(ol.firstElementChild);         console.log(ol.lastElementChild);                  console.log(ol.children[0]);         console.log(ol.children[ol.children.length - 1]); </script>
   | 
 
1.6.5. 案例:新浪下拉菜单



<script>                  var nav = document.querySelector('.nav');         var lis = nav.children;                   for (var i = 0; i < lis.length; i++) {             lis[i].onmouseover = function() {                 this.children[1].style.display = 'block';             }             lis[i].onmouseout = function() {                 this.children[1].style.display = 'none';             }         } </script>
   | 
 
1.6.6. 兄弟节点
下一个兄弟节点

上一个兄弟节点

<div>我是div</div> <span>我是span</span> <script>     var div = document.querySelector('div');          console.log(div.nextSibling);     console.log(div.previousSibling);          console.log(div.nextElementSibling);     console.log(div.previousElementSibling); </script>
   | 
 
下一个兄弟元素节点(有兼容性问题)

上一个兄弟元素节点(有兼容性问题)



function getNextElementSibling(element) {    var el = element;    while (el = el.nextSibling) {      if (el.nodeType === 1) {          return el;      }    }    return null;  }  
  | 
 
1.6.7. 创建节点

1.6.8. 添加节点

<ul>     <li>123</li> </ul> <script>            var li = document.createElement('li');            var ul = document.querySelector('ul');      ul.appendChild(li);            var lili = document.createElement('li');      ul.insertBefore(lili, ul.children[0]);       </script>
   | 
 
1.6.9. 案例:简单版发布留言


<body>     <textarea name="" id=""></textarea>     <button>发布</button>     <ul>
      </ul>     <script>                  var btn = document.querySelector('button');         var text = document.querySelector('textarea');         var ul = document.querySelector('ul');                  btn.onclick = function() {             if (text.value == '') {                 alert('您没有输入内容');                 return false;             } else {                                                   var li = document.createElement('li');                                  li.innerHTML = text.value;                                                   ul.insertBefore(li, ul.children[0]);             }         }     </script> </body>
   |