美文网首页
2018-06-08 DOM

2018-06-08 DOM

作者: 忙于未来的民工 | 来源:发表于2019-04-12 10:12 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/wshasftx.html