2018-06-08 DOM

1:Node类型

JavaScript中的所有节点类型都继承自Node类型(就像js语法中Object对象一样),所以js的所有节点类型都共享Node类型的属性和方法

1.1:Node节点的类型的属性和方法:

nodeType属性:这个属性代表js的节点类型,他的值有以下的12种,任何节点类型必是其中一个.

 Node.ELEMENT_NODE(1);

 Node.ATTRIBUTE_NODE(2);

 Node.TEXT_NODE(3);

 Node.CDATA_SECTION_NODE(4);

 Node.ENTITY_REFERENCE_NODE(5);

 Node.ENTITY_NODE(6);

 Node.PROCESSING_INSTRUCTION_NODE(7); Node.COMMENT_NODE(8);

 Node.DOCUMENT_NODE(9);

 Node.DOCUMENT_TYPE_NODE(10);

 Node.DOCUMENT_FRAGMENT_NODE(11); Node.NOTATION_NODE(12)。

判断节点的nodeType属性就可以判断出这个节点的类型

if (someNode.nodeType == 1){ //适用于所有浏览器

alert("Node is an element.");

}

nodeName: 代表了当期那节点的名字

nodeValue:代表了当期节点的值

1.2:节点的关系

节点的关系分为兄弟节点,父子节点,

childNodes: 每个节点都有这个属性,这个属性代表了当前节点的所有子节点,并且这个属性的值是随着dom元素的变化而变化的,这个属性并不是数组但是我们可以通过数组的方式来取值,也可以使用Array.property.slice.call(someNode.childNodes,0)这个方法转换成数组

parentNode: 当前节点元素的父节点

previousSibling: 当前节点的上一个兄弟节点

nextSibling:当前节点的下一个兄弟节点

如果上一个兄弟节点或者下一个兄弟节点不存在,则这两个属性都为null

firstChild: 第一个子节点

lastChild:最后一个子节点

如果只有一个子节点,那么firstChild和lastChild都指向同一个节点,如果没有子节点,那么这两个属性都是null

hasChildNodes(): 检查当前节点是否有子节点

ownerDocument: 所有的节点都有这个属性,指向当前文档的根节点

1.3:操作节点:

appendChild(): 拼接节点,意识是向当前节点的子节点的最后一位插入一个子节点,childChilds属性的长度,指针指向等等都会同步更新,更新完成之后,返回新增的节点

注意:,如果传入的节点是当前已经存在的节点,那么插入的节点的位置就会改变成当前节点的子节点的最后一位

insertBefore():这个方法是将某个节点(第一个参数)插在参照节点(第二个参数)之前,调用者是父节点,如果参照节点(第二个参数)为null,那么insetBefore()方法与appendChild()方法相同

replaceChild(): 替换节点,第一个参数是要被删除的节点,第二个参数是要插入的节点

removeChild(): 删除某个节点

下面这两个方法是所有的节点共有的:

cloneNode(): 创建调用这个方法的节点的副本,接收一个Boolean值,代表了是否进行深复制,深复制就是复制当前节点包括子节点,false只返回当前节点,

注意:这个方法在复制的时候不会复制属性,但是ie存在一个bug,在复制的时候会将属性一起复制了,所以在复制之前最先移除

下面将分别介绍继承自Node类型的子类

2:Document类型

这个类型继承自Node类型,共享Node类型的所有属性和方法,浏览器中的document对象是HTMLDocument(继承自document类型)类型的一个实例,表示整个HTML页面,而且是window的属性.可以操作整个页面的页面和底层结构

document子节点可能是一个 DocumentType(最多一个)、Element(最多一个)、ProcessingInstruction或 Comment,

DocumentType; 这个节点是文档声明,一般没什么用,其实就是网页中HTML节点上的声明

下面介绍document的内置属性:

document有两个内置的属性

documentElement: 这个属性指向根节点html,  例子:

var html = document.documentElement // 这个就可以取到html元素的对象

body: 这个属性指向body元素,和上面一样,直接就可以取到body元素的额对象

下面介绍HTMLDocument类

document是继承自Node类型的HTMLDocument类的一个实例,HTMLDocument类在document基础之上扩展了一些属性和方法,所以document也有下面的一些属性

属性:

title:  HTMLDocument有一个属性title,指向文本标签title,可以改变浏览器标签栏的名称

URL: 完整的url路径

domain:域名

referrer:保存着链接到当前网页的那个url,没有来源页面,为null

方法:

getElementById():通过id获取到dom元素

document.getElementsByTagName: 通过标签名获取元素

getElementsByName: 通过name属性获取元素

3:Element

element便是Node类型的又一个子类

,通过这个类型可以访问到dom元素.其实通过HTMLDocument类型的几个方法返回的对象就是element类型的子类HTMLElement的实例或者HTMLDocument实例的子类型

获取dom元素特性时,使用的方法有以下两种:

HTMLElement类型的属性

id: 每个元素在文档中唯一标识

title: 元素的说明

lang: 据说没什么用

className: 类名

例子:

var div = document.getElementById("myDiv");

alert(div.id); //"myDiv""

alert(div.className); //"bd"

alert(div.title); //"Body text"

alert(div.lang); //"en

也可以对他们进行重新赋值

方法: 

dom元素有很多特性,可以使用下面方法对他们的特性进行操作

getAttribute()
setAttribute()

removeAttribute()

获取上面那几个属性的值也可以通过这几个方法实现

var div = document.getElementById("myDiv");

alert(div.getAttribute("id"));

alert(div.getAttribute("class"));

alert(div.getAttribute("title"));

getAttribute这个方法也可以获取自定义特性的值,如果传过去的值不存在,那么返回null

HTML5规定自定义特性最好加上data-   算是一种规范?

使用getAttribute 这个方法获取style和onclick特性时,会和通过属性直接访问出现差别,getAttribute获取这两个特性时,都返回字符串,而通过属性的方式直接访问时,会返回对象和函数

总结:由于这些差别的存在,我们在开发中只有获取自定义的属性时才会使用getAttribute方法,获取通用属性时,一般通过属性的方式获取

4:text类型

文本节点,继承自Node类型,具有以下几种特性:

nodeName: 文本节点的名字#text"

nodeType; 文本类型 值 3

nodeValue: 就是文本节点的值

parentNode: 文本节点的父节点 是一个element类型的对象,其实就是dom元素不支持子节点 方法如下: 

appendData(text):将 text 添加到节点的末尾。

  deleteData(offset, count):从 offset 指定的位置开始删除 count 个字符。

  insertData(offset, text):在 offset 指定的位置插入 text。

  replaceData(offset, count, text):用 text 替换从 offset 指定的位置开始到 offset+

count 为止处的文本。

  splitText(offset):从 offset 指定的位置将当前文本节点分成两个文本节点。

  substringData(offset, count):提取从 offset 指定的位置开始到 offset+count 为止

处的字符串。

取到文本节点的方式只能通过父节点 ,然后寻找子节点的方式来获取 比如:div中有一行文字,取得文本节点

var textNode = div.firstChild; //或者div.childNodes[0]

和dom元素一样,如果当前文本节点在浏览器中,那么修改文本节点会立马反映到浏览器中

dom元素可以创建,那么文本节点也可以创建,方式如下:

var textNode = window.createTextNode('sdfa')

然后将这个节点插入dom元素的节点中就可以了

动态创建文本节点,然后将它插进element类型的对象中,就可以实现一个dom元素下有两个文本节点的情况

normalize(): 这个方法可以将一个dom元素下多个文本节点给合并起来,变成一个,有父节点调用

splitText(): 这个方法可以将一个文本节点分割成两个节点,参数是一个整数传进去即可

5:Comment类型

comment类型也是继承Node类型,文档的注释在使用comment类型来表示的

6: DocumentFragment类型

DocumentFragment就是文档片段类型,用处:我们在向浏览器插入节点时,每插入一次,都会使浏览器渲染一次页面,如果要擦插入多个节点,就会渲染多次,浪费性能,而DocumentFragment类型的实例可以作为一个仓库用来存储这些代码片段,也就是dom节点,然后最后一起插进浏览器中去

用法如下:

var fragment = document.createDocumentFragment();

    var ul = document.getElementById("myList");

    var li = null;

    for (var i=0; i < 3; i++){

        li = document.createElement("li");

        li.appendChild(document.createTextNode("Item " + (i+1)));

        fragment.appendChild(li);

    }

    ul.appendChild(fragment);

你可能感兴趣的:(2018-06-08 DOM)