JavaScript Dom

Dom接口

用来操作html和xml功能的一系列对面的集合。

查找方法

//ie8 以及ie8 以下不支持
document.getElementsByClassName
document.getElementsByTagName
//css选择器---非实时
document.querySelector
document.querySelectorAll
        var div = document.getElementsByClassName("div")[0];

        var div2 = document.getElementsByTagName("div")[0];


        //不是实时
        document.querySelector('div > span strong.demo')//css 选择器
        document.querySelectorAll('div > span');//css选择器

遍历节点树

        //ie9以下都不兼容
        //节点包含
        //文本节点、注释节点、元素节点
        //parentNode--->父节点(最顶端#docuemnt);
        //childNodes---->子节点
        //firstChild--第一子节点
        //lastChild--最后一个节点
        //nextSibling--下一个节点
        //previousSibling--上一个节点

  

遍历元素节点树

        //基于元素节点   ie9以下支支持children
        //parentElement--父元素节点
        //children-->子元素节点--
        //nextElementSibling--下一个元素节点
        //previousSibling--上一个元素节点


        //nodeName 节点名称
        //nodeValue 文本节点和注释节点才有
        //nodeType
        //元素节点1
        //属性节点2----div.attributes
        //文本节点3
        //注释节点8

        //hasChildNodes()  是否有子节点

 示例--不用children查找元素的子元素节点

 function retElementChild(node) {

            var temp={
                length:0,
                push:Array.prototype.push,
                splice:Array.prototype.splice
            },
                child=node.childNodes,
                len = child.length;

            for(var i = 0; i < len;i++)
            {
                if(child[i].nodeType===1){
                    temp.push(child[i]);
                }
            }
            return temp;
        }

 

Dom结构树

以上描述了Dom的原型链。如document继承自HTMLDocument.prototype。HTMLDocument.prototype继承自Document

  • getElementById定义在Document.prototype上
  • getElementByName定于在HTMLDocument上,即非html中不可以使用
  • getElementsByTagName定义在Document.prototype和Element.prototype上
  • HtMLDocument.propotype定义上了body,head,直接代表标签
  • documentElement 代替html元素

练习

//返回子元素节点  不用children
        function retElementChild(node) {

            var temp = {
                length: 0,
                push: Array.prototype.push,
                splice: Array.prototype.splice
            },
                child = node.childNodes,
                len = child.length;

            for (var i = 0; i < len; i++) {
                if (child[i].nodeType === 1) {
                    temp.push(child[i]);
                }
            }
            return temp;
        }


        //返回元素elem的第n层父元素
        function retParent(elem, n) {
            while (elem && n) {
                elem = elem.parentElement;
                n--;
            }
            return elem
        }
        //不用children返回子元素节点
        Element.prototype.myChildren = function () {
            var child = this.childNodes;
            var len = child.length;
            var arr = [];

            for (var i = 0; i < len; i++) {
                if (child[i].nodeType == 1) {
                    arr.push(child[i]);
                }
            }
            return arr;
        }



        //返回兄弟节点,n可以为负数
        function retSibling(e, n) {
            while (e & n) {
                if (n > 0) {
                    e = e.nextElementSibling;//ie9以下不支持
                    n--;
                }
                else {
                    e = e.previousElementSibling;//ie9以下不支持
                    n++;
                }
            }
            return e;
        }
        function retSibling(e, n) {
            while (e & n) {
                if (n > 0) {
                    if (e.nextElementSibling) {
                        e = e.nextElementSibling
                    } else {
                        for (e = e.nextSibling; e && e.nodeType != 1; e = e.nextSibling);
                    }
                    n--;
                }
                else {
                    if (e.previousElementSibling) {
                        e = e.previousElementSibling;//ie9以下不支持
                    } else {
                        for (e = e.proviousSibling; e && e.nodeType != 1; e = e.proviousSibling);
                    }
                    n++;
                }
            }
            return e;
        }


        //appendChild  剪切操作
        //insertBefore(a,b) 增加a在b之前
        //removeChild  删除子节点   剪切
        //replceChild(new,origin) new替换origin  剪切



        Element.prototype.insertAfter = function (targetNode, afterNode) {
            var beforeNode = afterNode.nextElementSibling;
            if(beforeNode==null)
            {
                this.appendChild(targetNode);
            }else{
                this.insertBefore(targetNode,beforeNode);
            }

        }

 

 

posted @ 2019-04-20 16:22  110来了  阅读(210)  评论(0编辑  收藏  举报