js DOM

236 阅读3分钟

1.DOM-->Document Object Model

2.DOM定义了表示和修改文档所需的方法。DOM对象即为宿主对象,有浏览器厂商定义,用来操作html和xml功能的一类对象的集合,也有人称DOM是对HTML以及XML的标准编程接口。

DOM操作

  • 对节点的增删改查

      • 查看元素节点

        • document代表整个文档
        • document.getElementById() //元素id 在Ie8以下的浏览器,不区分id大小写,而且也返回匹配name属性的元素。
        • getElementsByTagName() // 标签名
        • getElementByName(); //,需注意,只有部分标签name可生效(表单,表单元素,img,iframe)
        • getElementsByClassName() // 类名 -> ie8和ie8以下的ie版本中没有,可以多个class一起
        • querySelector() // css选择器 在ie7和ie7以下的版本中没有
        • querySelectorAll() // css选择器 在ie7和ie7以下的版本中没有
  • 遍历节点树(包括不仅仅元素节点,还有文本节点等所有的节点)

    • parentNode -->父节点(最顶端的parentNode为#document)
    • childNodes -->子节点们
    • firstChild -->第一个子节点
    • lastChild -->最后一个子节点
    • nextSibling-->后一个兄弟节点
    • previousSibling -->前一个兄弟节点
  • 基于元素节点树的遍历

    • parentElement -->返回当前元素的父元素节点(IE不兼容)
    • children -->只返回当前元素的元素子节点
    • node.childElementCount === node.children.length当前元素节点的子元素节点个数(IE不兼容)
    • firstElementChild -->返回的是第一个元素节点(IE不兼容)
    • lastElementChild -->返回的是最后一个元素节点(IE不兼容)
    • nextElementSibling/previousElementSibling -->返回后一个/前一个兄弟元素节点(IE不兼容)
  • 节点的四个属性

    • nodeName

      • 元素的标签名,以大写形式表示,只读
    • nodeValue

      • Text节点或Comment注释节点的文本内容,可读写
    • nodeType

      • 该节点的类型,只读
    • attributes

      • Element节点的属性集合
  • 节点的类型

    • 元素节点 -- 1
    • 属性节点 -- 2
    • 文本节点 -- 3
    • 注释节点 -- 8
    • document -- 9
    • DocumentFragment -- 11
  • 该节点一个方法Node.hasChildNodes() //返回true或者false

DOM树结构

  • getElementById方法定义在Document.prototype上,即Element节点上不能使用。
  • getElementsByName方法定义在HTMLDocument.prototype上,即非html中的document以外不能使用(xml document,Element)
  • getElementsByTagName方法定义在Document.prototype 和 Element.prototype上
  • HTMLDocument.prototype定义了一些常用的属性,body,head,分别指代HTML文档中的标签。
  • Document.prototype上定义了documentElement属性,指代文档的根元素,在HTML文档中,他总是指代元素
  • getElementsByClassName、querySelectorAll、querySelector在Document,Element类中均有定义
//封装函数,返回元素e的第n层祖先元素节点
<div>
  <strong>
     <span>
        <i></i>
     </span>
  </strong>
</div>
<script>
  function retParent(elem,n){
     while(elem && n){
         elem=elem.parentElement;
         n--;
     }
     return elem;
  }
  var i=document.getElementsByTagName('i')[0];
<script>
//编辑函数,封装myChildren功能,解决以前部分浏览器的兼容性问题
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;
}
var div=document.getElementsByTagName('div')[0];

DOM节点创建

    • document.createElement();
    • document.createTextNode();
    • document.createComment();
    • document.createDocumentFragment();
    • PARENTNODE.appendChild();
    • PARENTNODE.insertBefore(a, b):
    • parent.removeChild();
    • 销毁自身child.remove();
  • 替换
    • parent.replaceChild(new, origin);

Element节点的一些属性

* innerHTML
* innerText(火狐不兼容) / textContent(老版本IE不好使)

Element节点的一些方法

* ele.setAttribute()
* ele.getAttribute();
//封装函数insertAfter();功能类似insertBefore();
Element.prototype.insertAfter=function(targetNode,afterNode){
    var beforeNode=afterNode.nextElmentSibling;
    if(beforeNode==null){
        this.appendChild(TargetNode);
    }else{
        this.insertBefore(targetNode,beforeNode);
    }
}