zoukankan      html  css  js  c++  java
  • javascript DOM艺术

    一、DOM基础
    1.节点(node)层次
    Document--最顶层的节点,所有的其他节点都是附属于它的。
    DocumentType--DTD引用(使用<!DOCTYPE>语法)的对象表现形式,它不能包含子节点。
    DocumentFragment--可以像Document一样来保存其他节点。
    Element--表示起始标签和结束标签之间的内容,例如<tag></tab>或者<tag/>。这是唯一可以同时包含特性和子节点的节点类型。
    Attr--代表一对特性名和特性值。这个节点类型不能包含子节点。
    Text--代表XML文档中的在起始标签和结束标签之间,或者CDataSection内包含的普通文本。这个节点类型不能包含子节点。
    CDataSection--<![CDATA[]]>的对象表现形式。这个节点类型仅能包含文本节点Text作为子节点。
    Entity--表示在DTD中的一个实体定义,例如<!ENTITY foo"foo">。这个节点类型不能包含子节点。
    EntityReference--代表一个实体引用,例如&quot;。这个节点类型不能包含子节点。
    ProcessingInstruction--代表一个PI。这个节点类型不能包含子节点。
    Comment--代表XML注释。这个节点不能包含子节点。
    Notation--代表在DTD中定义的记号。这个很少用到。

    Node接口定义了所有节点类型都包含的特性和方法。

    特性/方法 类型/返回类型 说明
    nodeName String 节点的名字;根据节点的类型而定义
    nodeValue String 节点的值;根据节点的类型而定义
    nodeType Number 节点的类型常量值之一
    ownerDocument Document 指向这个节点所属的文档
    firstChild Node 指向在childNodes列表中的第一个节点
    lastChild Node 指向在childNodes列表中的最后一个节点
    childNodes NodeList 所有子节点的列表
    previousSibling Node 指向前一个兄弟节点;如果这个节点就是第一个兄弟节点,那么该值为null
    nextSibling Node 指向后一个兄弟节点;如果这个节点就是最后一个兄弟节点,那么该值为null
    hasChildNodes() Boolean 当childNodes包含一个或多个节点时,返回真
    attributes NamedNodeMap 包含了代表一个元素的特性的Attr对象;仅用于Element节点
    appendChild(node) Node 将node添加到childNodes的末尾
    removeChild(node) Node 从childNodes中删除node
    replaceChild(newnode,oldnode) Node 将childNodes中的oldnode替换成newnode
    insertBefore(newnode,refnode) Node 在childNodes中的refnode之前插入newnodd


    除节点外,DOM还定义了一些助手对象,它们可以和节点一起使用,但不是DOM文档必有的部分。
    NodeList--节点数组,按照数值进行索引;用来表示和一个元素的子节点。
    NamedNodeMap--同时使用数值和名字进行索引的节点表;用于表示元素特性。

    2.访问相关的节点
    下面的几节中考虑下面的HTML页面

    <html>
        <head>
            <title>DOM Example</title>
        </head>
        <body>
            <p>Hello World!</p>
            <p>Isn't this exciting?</p>
            <p>You're learning to use the DOM!</p>
        </body>
    </html>

    要访问<html/>元素(你应该明白这是该文件的document元素),你可以使用document的documentElement特性:
    var oHtml = document.documentElement;
    现在变量oHtml包含一个表示<html/>的HTMLElement对象。如果你想取得<head/>和<body/>元素,下面的可以实现:
    var oHead = oHtml.firstChild;
    var oBody = oHtml.lastChild;
    也可以使用childNodes特性来完成同样的工作。只需把它当成普通的javascript array,使用方括号标记:
    var oHead = oHtml.childNodes[0];
    var oBody = oHtml.childNodes[1];
    注意方括号标记其实是NodeList在javascript中的简便实现。实际上正式的从childNodes列表中获取子节点的方法是使用item()方法:
    var oHead = oHtml.childNodes.item(0);
    var oBody = oHtml.childNodes.item(1);
    HTML DOM页定义了document.body作为指向<body/>元素的指针。
    var oBody = ducument.body;
    有了oHtml,oHead和oBody这三个变量,就可以尝试确定它们之间的关系:
    alert(oHead.parentNode==oHtml);
    alert(oBody.parentNode==oHtml);
    alert(oBody.previousSibling==oHead);
    alert(bHead.nextSibling==oBody);
    alert(oHead.ownerDocument==document);
    以上均outputs "true"。

    3.处理特性
    正如前面所提到的,即便Node接口已具有attributes方法,且已被所有类型的节点继承,然而,只有
    Element节点才能有特性。Element节点的attributes属性其实是NameNodeMap,它提供一些用于访问和处理其内容的方法:
    getNamedItem(name)--返回nodename属性值等于name的节点;
    removeNamedItem(name)--删除nodename属性值等于name的节点;
    setNamedItem(node)--将node添加到列表中,按其nodeName属性进行索引;
    item(pos)--像NodeList一样,返回在位置pos的节点;
    注:请记住这些方法都是返回一个Attr节点,而非特性值。

    NamedNodeMap对象也有一个length属性来指示它所包含的节点的数量。
    当NamedNodeMap用于表示特性时,其中每个节点都是Attr节点,这的nodeName属性被设置为特性名称,而nodeValue属性被设置为特性的值。例如,假设有这样一个元素:
    <p style="color:red" id="p1">Hello world!</p>
    同时,假设变量oP包含指向这个元素的一个引用。于是可以这样访问id特性的值:
    var sId = oP.attributes.getNamedItem("id").nodeValue;
    当然,还可以用数值方式访问id特性,但这样稍微有些不直观:
    var sId = oP.attributes.item(1).nodeValue;
    还可以通过给nodeValue属性赋新值来改变id特性:
    oP.attributes.getNamedItem("id").nodeValue="newId";
    Attr节点也有一个完全等同于(同时也完全同步于)nodeValue属性的value属性,并且有name属性和nodeName属性保持同步。我们可以随意使用这些属性来修改或变更特性。
    因为这个方法有些累赘,DOM又定义了三个元素方法来帮助访问特性:
    getAttribute(name)--等于attributes.getNamedItem(name).value;
    setAttribute(name,newvalue)--等于attribute.getNamedItem(name).value=newvalue;
    removeAttribute(name)--等于attribute.removeNamedItem(name)。

    4.访问指定节点
    (1)getElementsByTagName()
    核 心(XML) DOM定义了getElementsByTagName()方法,用来返回一个包含所有的tagName(标签名)特性等于某个指定值的元素的 NodeList。在Element对象中,tagName特性总是等于小于号之后紧跟随的名称--例如,<img />的tagName是"img"。下一行代码返回文档中所有<img />元素的列表:
    var oImgs = document.getElementsByTagName("img");
    把所有图形都存于oImgs后,只需使用方括号或者Item()方法(getElementsByTagName()返回一个和childNodes一样的NodeList),就可以像访问子节点那样逐个访问这些节点了:
    alert(oImgs[0].tagName);       //outputs "IMG"
    假如只想获取在某个页面第一个段落的所有图像,可以通过对第一个段落元素调用getElementsByTagName()来完成,像这样:
    var oPs = document.getElementByTagName("p");
    var oImgsInp = oPs[0].getElementByTagName("img");
    可以使用一个星号的方法来获取document中的所有元素:
    var oAllElements = document.getElementsByTagName("*");
    当参数是一个星号的时候,IE6.0并不返回所有的元素。必须使用document.all来替代它。
    (2)getElementsByName()
    HTML DOM 定义了getElementsByName(),这用来获取所有name特性等于指定值的元素的。
    (3)getElementById()
    这是HTML DOM定义的第二种方法,它将返回id特性等于指定值的元素。在HTML中,id特性是唯一的--这意味着没有两个元素可以共享同一个id。毫无疑问这是从文档树中获取单个指定元素最快的方法。
    注:如果给定的ID匹配某个元素的name特性,IE6.0还会返回这个元素。这是一个bug,也是必须非常小心的一个问题。

    5.创建新节点
    最常用到的几个方法是
    createDocumentFragment()--创建文档碎片节点
    createElement(tagname)--创建标签名为tagname的元素
    createTextNode(text)--创建包含文本text的文本节点

    createElement()、createTextNode()、appendChild()

    <html>
        <head>
            <title>createElement() Example</title>
            <script type="text/javascript">
                function createMessage() {
                    var oP = document.createElement("p");
                    var oText = document.createTextNode("Hello World!");
                     oP.appendChild(oText);
                     document.body.appendChild(oP);
                 }
            </script>
        </head>
        <body onload="createMessage()">
        </body>
    </html>


    removeChild()、replaceChild()、insertBefore()
    删除节点

    <html>
        <head>
            <title>removeChild() Example</title>
            <script type="text/javascript">
                function removeMessage() {
                    var oP = document.body.getElementsByTagName("p")[0];
                     oP.parentNode.removeChild(oP);
                 }
            </script>
        </head>
        <body onload="removeMessage()">
            <p>Hello World!</p>
        </body>
    </html>

    替换

    <html>
        <head>
            <title>replaceChild() Example</title>
            <script type="text/javascript">
                function replaceMessage() {
                    var oNewP = document.createElement("p");
                    var oText = document.createTextNode("Hello Universe!");
                     oNewP.appendChild(oText);
                    var oOldP = document.body.getElementsByTagName("p")[0];
                     oOldP.parentNode.replaceChild(oNewP, oOldP);
                 }
            </script>
        </head>
        <body onload="replaceMessage()">
            <p>Hello World!</p>
        </body>
    </html>

    新消息添加到旧消息之前

    <html>
        <head>
            <title>insertBefore() Example</title>
            <script type="text/javascript">
                function insertMessage() {
                    var oNewP = document.createElement("p");
                    var oText = document.createTextNode("Hello Universe!");
                     oNewP.appendChild(oText);
                    var oOldP = document.getElementsByTagName("p")[0];
                     document.body.insertBefore(oNewP, oOldP);
                 }
            </script>
        </head>
        <body onload="insertMessage()">
            <p>Hello World!</p>
        </body>
    </html>
  • 相关阅读:
    图片上传-下载-删除等图片管理的若干经验总结3-单一业务场景的完整解决方案
    图片上传-下载-删除等图片管理的若干经验总结2
    HDU 1195 Open the Lock
    HDU 1690 Bus System
    HDU 2647 Reward
    HDU 2680 Choose the best route
    HDU 1596 find the safest road
    POJ 1904 King's Quest
    CDOJ 889 Battle for Silver
    CDOJ 888 Absurdistan Roads
  • 原文地址:https://www.cnblogs.com/Arther-J/p/5391371.html
Copyright © 2011-2022 走看看