1.HTML部分
<divid="box">
        <p>我是p</p>
        <div class="abc">我是div
            <span id="text">我是span</span>
            <p>sd</p>
        </div>
        <ul>
            <li>我是li1</li>
            <li>我是li2</li>
            <li>我是li3</li>
            <li>我是li4</li>
        </ul>
    </div>
    <div id="res">
        <h1>我是h1</h1>
        <h2>我是h2</h2>
        <h3>我是h3</h3>
        <h4>我是h4</h4>
        <h5>我是h5</h5>
        <h6>我是h6</h6>
    </div>
2.js部分
封装函数大部分会使用遍历
varoText = document.getElementById('text');
    var oBox = document.getElementById('box');
    /*----封装函数,返回该元素的第n层祖先元素-----*/
    /* 1.返回第几层? parentNoded 查询父节点
        dom  节点
        n    第几层祖先
    */
    function getParent(dom,n){ 
        for(var i=0;i<n;i++){
            if(dom.parentNode===null){
                return dom;
            }
            dom = dom.parentNode;
        }
        return dom;
    }
    getParent(oText,2)   //那个元素开始,第几层
    /*----封装myChildren函数,实现系统的children功能-----*/
    //  dom节点返回一个有dom的元素子节点组成的数组
    //children功能得到子节点的数组,所以我们可以遍历每一项,把他组成数组
    var arr = [];
    function myChildren(dom){
        for(var i=0;i<dom.childNodes.length;i++){   //搜索
            if(dom.childNodes[i].nodeType===1){   //如果传进来的是元素节点
                arr.push(dom.childNodes[i])
            }  
        }
        return arr;
    }
    myChildren(oBox)
    /*-----封装hasChildren函数,判断有没有元素节点,要求不能使用children属性----*/
    //如果dom元素有元素子节点,就返回true,否则flase
    function hasChildren(dom){
        for(var i=0;i<dom.childNodes.length;i++){
            if(dom.childNodes[i].nodeType===1){
                return true;
            }
            // else{  
            //    return false; 
            // }
            //不可以这样写,因为判断的时候,第一个是文档节点,nodeType为3,
            //所以会走进else中,直接flase
        }
        return false;
    }
    hasChildren(oText)
    /*----封装insertAfter函数,功能和insertBefore类似----*/
    // 把A插入到B后面 就相当于把A插入到B的相邻兄弟的前面
    var oDiv = document.createElement('div');
    function insertAfter(A,B){
        //console.log(B.nextElementSibling);
        B.parentNode.insertBefore(A,B.nextElementSibling)
    }
    insertAfter(oDiv,oText)
    /*----封装remove函数,使child.removeChild()能够删除自身----*/
    function remove(dom){
        dom.parentNode.removeChild(dom)
    }
    //remove(oBox);
    /*----封装函数,实现元素节点内部的顺序,逆序----*/
    // 使用appendChild 把节点插入到父节点的最后面  循环
    var rRse = document.getElementById('res');
    function reserve(dom){
        for(var i=0;i<dom.children.length-1;i++){
            /*
            *   i=0  dom.children[4]-->length-1-1-i //6-1-1-0
            *   i=1  dom.children[3]-->length-1-1-i //6-1-1-1
            *   i=2  dom.children[2]
            *   i=3  dom.children[1]
            *   i=4  dom.children[0]
            */
            dom.appendChild(dom.children[dom.children.length-1-1-i])
        }
    }
    reserve(rRse)
来源:https://www.cnblogs.com/aorange/p/11151951.html