1.什么是DOM

DOM---->Document    Object  Model专门操作所有HTML的内容的API,有w3c指定的标准

DOM 核心 :可以操作所有的文档(HTML,XML)

 2.节点node三大属性

nodetype:节点类型

专门区分节点的类型:

document            9

element               1

attribute               2

text                      3

nodename  :节点名称

document          #document

element              全大写的标签名

attribute              属性名

文本节点             #text

nodevalue         节点值

document          null

element             null

attribute            属性值

text                   文本内容

3.递归遍历(定义函数:遍历给定义父元素下的直接子节点)

 

function getChildren(parent){
    // 如果parent不是文本节点,就要输出节点名,否者输出节点值
     console.log(parent.nodeType !=3 ? parent.nodeName:parent.nodeValue);
     // 继续遍历parent节点下的所有子节点
     var children =  parent.childNodes;//返回结果  动态集合  类数组对象  当做数组来用
     for(var i =0,len=children.length;i<len;i++){//在开始循环查找DOM树时,将长度另存在len中
         // 对父元素的每个子节点调用和父元素完全相同的函数
         getChildren(children[i]);
     }
}

//getChildren(document.body);
// 算法:  深度优先 遍历:每次都有点遍历子节点,所有子节点遍历完,才返回遍历兄弟节点
// 递归的效率:极地      绝大对数递归够可以用循环代替

// 遍历的API:迭代器
   // 什么是迭代器:  按深度优先的顺序,依次遍历每个子节点对象,节点迭代器的殊勋,默认都是深度优先
   // 每次仅遍历下一个节点,可以循环反复执行
   // step1:  创建迭代器
       // var iterator = document.createNodeIterator(parent, NodeFilter.SHOW_ALL, null,false);
       // step 2 :、找下一个
       // var  原先节点对象  = iterator.nextNode();  跳到下一个节点  ,如果返回null说明到头了
function getChildren2(parent)
{
    // 创建迭代器
    var iterator = document.createNodeIterator(parent,NodeFilter.SHOW_ALL, null,false);
    // 循环使用迭代器nextNode找下一个节点
    var node;
    while((node=iterator.nextNode())!=null){
         console.log(node.nodeType !=3 ? node.nodeName:node.nodeValue);
    }
}
getChildren2(document.body);

 

4.DOM的操作-----查找

直接获取的三个元素

    // <html>  document.documentElement
    // <head>  document.head
    // <body>  document.body

节点关系

父子关系

node.parentNode            获取node的父节点

node.childNodes             获取node的所有直接子节点

node.fristChild                获取node下第一个子节点

node.lastChild                 获取node下最后一个字节点

兄弟关系

node.previousSibling     返回当前节点的前一个兄弟节点

node.nextSibling            获得当前节点的下一个兄弟节点

在节点中不但包括有用的元素节点,还包括看不见得换行/空格干

什么时候用:只要已经获得另一个节点

找周围节点时就像获取节点信息,用元素树

父子关系

 elem.parentElement    返回一个父元素对象
            // elem.children   返回子元素对象的集合   IE8支持
            // elem.firstElementChild   返回第一个子元素对象
            // elem.lastElementChild    返回最后一个子元素对象

兄弟关系

// elem.previousElementSibling    返回当前元素的前一个兄弟元素对象
            // elem.nextElementSibling        返回当前元素的下一个兄弟元素对象   IE9+

 按HTML查找

//what 在整个网页或指定父元素下,查找属性或标签符合要求的元素对象
        // when:只要是按照基本的条件有选择的查找元素
        // 4种
            // 1、按id查找:   when 要找的元素上有id,可用id精确查找一个
                 // var elem = document.getElementById("id");   只能用document调用,且只返回一个元素!
            // 2、按标签名查找    when: 查找指定父元素下指定的标签元素
                // var elems = parent.getElementsByTagName("标签名")
                    // 任何父元素都可以调用
                    // 返回的是父元素中所有同名标签的元素集合
                    // 即使仅一个元素,也会返回一个集合   必须通过加[0]才能获取到
                    // 不仅查找直接子节点,而且查找所有子代节点
            var nav =document.getElementById("nav");
            var lis = nav.getElementsByTagName("li");
            console.log(lis);//6个li
            // 3、按name属性查找   when 查找表单中的元素时    用的并不多
            // var elems = document.getElementsByName("name");    返回的是一个动态数组  只能用document调用
            var inputs =document.getElementsByName("hbio");
            // 4、按class属性查找    when  按class查找元素时  可以在任何父元素上调用
                // var elems =parent.getElementsByClassName("class")  
                 // 不仅查找直接子节点,而且查找所有子代节点
                 // 只要class包含要找的类,就能找到
            var ls=nav.getElementsByClassName("active");

5.结合DOM完成购物车例题:

html:

<!DOCTYPE HTML>
<html>
<head>
<title>使用Selector API实现购物车客户端计算</title>
<meta charset="utf-8" />
<style>
    table{width:600px; text-align:center;
        border-collapse:collapse;
    }
    td,th{border:1px solid black}
    td[colspan="3"]{text-align:right;}
    /*设置ID为data的table的tbody中每一行最后一个td边框设置为红色*/
     table#data>tbody td:last-child{
         border: 1px solid red;
         background-color: ;
     }
     
    /*设置id为data的table的tfoot中最后一个td的边框为绿色*/
    table#data>tfoot td:last-child{
        border: 1px solid deeppink;
        
    }
</style>
</head>
<body>
    <table id="data">
        <thead>
            <tr>
                <th>商品名称</th>
                <th>单价</th>
                <th>数量</th>
                <th>小计</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>iPhone6</td>
                <td>&yen;4488</td>
            <td>
            <!--为当前按钮绑定单击事件,事件发生时自动调用calc -->
                <button>-</button>
                <span>1</span>
                <button>+</button>
            </td>
                <td>¥4488</td>
            </tr>
            <tr>
                <td>iPhone6 plus</td>
                <td>¥5288</td>
                <td>
                <button>-</button>
                <span>1</span>
                <button>+</button>
                </td>
                <td>¥5288</td>
            </tr>
            <tr>
                <td>iPad Air 2</td>
                <td>¥4288</td>
            <td>
                <button>-</button>
                <span>1</span>
                <button>+</button>
            </td>
                <td>¥4288</td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <td colspan="3">Total:</td>
                <td>¥14064</td>
            </tr>
        </tfoot>
    </table>
      <script>
          //找到id为data的table
var table=document.getElementById("data")
//在table下找到button元素保存在butns
var butns=table.getElementsByTagName("button");

//遍历btns中的每一个btn
for(var i=0,len=butns.length;i<len;i++){
    butns[i].onclick=calc;
}




//为当前btn绑定单击事件为calc
//定义函数calc,响应单击事件
function calc(){
    //数量的变化
    var span=this.parentNode.getElementsByTagName("span")[0];
    var n=parseInt(span.innerHTML);
    
    var money=this.parentNode;
    var moneytd=money.previousElementSibling;
    var moneytr=money.nextElementSibling;
    var moneyn=moneytd.innerHTML;
    /*var price=this.parentNode;
    var pricetd=price.previousElementSibling;
    var pricen=pricetd.innerHTML;
    console.log(pricen);*/
    
    
    moneyn=Number(moneyn.slice(1));
    
    console.log(moneyn);


    
    var fath=table.lastElementChild;
    var fath1=fath.lastElementChild;
    var fath2=fath1.lastElementChild;
    var fathnum=fath2.innerHTML;
    
    fathnum=Number(fathnum.slice(1));
    console.log(fathnum);
    var sum=0
    //通过当前元素的innerHTML获取内容,根据+/-来改变n数量
    if(this.innerHTML=="+"){
        n++;
        fathnum+=moneyn;
     sum=n*moneyn;
     
        
    }
     if(this.innerHTML=="-" && n>=1){
        n--;
        fathnum=fathnum-moneyn;
        sum=moneyn*n;
    }
    //将n设置为span的内容
    span.innerHTML=n;
    moneytr.innerHTML="¥"+sum;
    fath2.innerHTML="¥"+fathnum;
    }

//2.小计功能  计算总价
//var money=parseInt(this.parentNode.previousElementSibling.innerHTML.split("").slice(1));
//console.log(money);


      </script>

</body>
</html>

js:

//找到id为data的table
var table=document.getElementById("data")
//在table下找到button元素保存在butns
var butns=table.getElementsByTagName("button");
console.log(butns);
//遍历btns中的每一个btn
for(var i=0,len=butns.length;i<len;i++){
    butns[i].onclick=calc;
}
//为当前btn绑定单击事件为calc
//定义函数calc,响应单击事件
function calc(){
    //数量的变化
    var span=this.parentNode.getElementsByTagName("span")[0];
    var n=parseInt(span.innerHTML);
    //通过当前元素的innerHTML获取内容,根据+/-来改变n数量
    if(this.innerHTML=="+"){
        n++;
    }else if(this.innerHTML=="-" && n>=1){
        n--;
    }
    //将n设置为span的内容
    n=span.innerHTML;
}