zoukankan      html  css  js  c++  java
  • JavaScript DOM高级程序设计 3.-DOM2和HTML2--我要坚持到底!

    由一个HTML进行说明,我就不敲了,直接copy

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>AdvancED DOM Scripting Sample Document</title>
        <!-- inclue some CSS style sheet to make everything look a little nicer -->
        <link rel="stylesheet" type="text/css" href="../../shared/source.css" />
        <link rel="stylesheet" type="text/css" href="../chapter.css" />
    
        <!-- Your ADS library with the common JavaScript objects -->
        <script type="text/javascript" src="../../ADS-final-verbose.js"></script>
        <!-- Log object from Chapter 2 -->
        <script type="text/javascript" src="../../chapter2/myLogger-final/myLogger.js"></script>
        <!-- Your testing file -->
        <script type="text/javascript" src="domTesting.js"></script>
    
    
    </head>
    <body>
        <h1>AdvancED DOM Scripting</h1>
        <div id="content">
            <p>Examining the DOM2 Core and DOM2 HTML Recommendations</p>
            <h2>Browsers</h2>
            <p>Typically, you'll be expecting the following browsers:</p>
            <!-- Other browsers could be added but we'll keep the list 
            short for the example. -->
            <ul id="browserList">
                <li id="firefoxListItem">
                    <a href="http://www.getfirefox.com/"
                        title="Get Firefox" 
                        id="firefox">Firefox 2.0</a>
                </li> 
                <li>
                    <a href="http://www.microsoft.com/windows/ie/downloads/" 
                        title="Get Microsoft Internet Explorer" 
                        id="msie">Microsoft Internet Explorer 7</a>
                </li> 
                <li>
                    <a href="http://www.apple.com/macosx/features/safari/" 
                        title="Check out Safari" 
                        id="safari">Safari</a>
                </li>
                <li>
                    <a href="http://www.opera.com/download/" 
                        title="Get Opera" 
                        id="opera">Opera 9</a>
                </li> 
            </ul>
        </div>
    
    <div id="where-from">
        From <a href="http://advanceddomscripting.com" title="AdvancED DOM Scripting">AdvancED DOM Scripting</a> 
        | <a href="http://www.amazon.com/exec/obidos/ASIN/1590598563/jeffreysamb05-20" title="Buy it on Amazon">Paperback</a>
    </div>
    </body>
    
    </html>

    由于这部分内容似乎都是说明、介绍性的,我也仅仅截几张图吧

    DOM核心

    在DOM中继承的重要性:虽然我们知道文档中每个元素有多种特性和添加子节点的功能,但你可曾遇到过在一个元素上能够使用的属性和方法,到了另外一个元素上却无效的挫折么?通过理解对象的继承以及哪个基础对象提供那些功能,你就会避免这些挫折

    核心Node对象

    • 节点名称,值和类型

    例如,下面的一段js代码:

    ADS.addEvent(window,'load',function(){
        ADS.log.header('testNodeName');
        ADS.log.write('nodeName is :'+document.getElementById('firefox').nodeName);
    });

    日志窗口就会输出:nodeName is : A

    对于基于文档中标签的其他对象来说,nodeName取决于引用对象的类型

    也许你认为可以使用nodeValue,但是,nodeValue属性只适用于少数的DOM对象,尤其是attr,ProcessingTnstructions、Comments、Test和CDATASection。除此之外其他都返回null,例如,获取锚的nodeValue值的操作:

    ADS.addEvent(window,'load',function(){
        ADS.log.header('The node value of the anchor');
        ADS.log.write('nodeValue is :'+document.getElementById('firefox').nodeValue);
    });

    结果会显示:nodeValue is : null

    类似的,核心对象类型的nodeValue属性的返回值

    ADS.addEvent(window,'load',function(){
        ADS.log.header('Testing nodeType');
        ADS.log.write('nodeType is :'+document.getElementById('firefox').nodeType);
    });

    如果添加以上的处理事件,则返回:nodeType is :1(锚标签是HTMLAnchorElement的实例,但后者又扩展自Element对象所以锚的nodeType的值显示为1)

    如果能在检测nodeType中使用DOM常量就好了(并不是所有浏览器都支持DOM常量)例如:

    if (node.nodeType==Node.COMMENT_NODE)
    {
        //...
    }

    而不是

    if (node.nodeType==8)
    {
        //8代表什么意思来着
    }

    在ADS库中添加相应的代码

    //DOM常量
    window['ADS']['node']={
        ELEMENT_NODE                  :1,
        ATTRIBUTE_NODE                :2,
        TEXT_NODE                     :3,
        CDATA_SECTION_NODE            :4,
        ENTITY_REFERENCE_NODE         :5,
        ENTITY_NODE                   :6,
        PROCESSING_INSTRUCTION_NODE   :7,
        COMMENT_NODE                  :8,
        DOCUMENT_NODE                 :9,
        DOCUMENT_TYPE_NODE            :10,
        DOCUMENT_FRAGMENT_NODE        :11,
        NOTATION_NODE                 :12
    };
    /*
    我们就可以在跨浏览器版本中使用DOM常量了
    if(node.nodeType==ADS.node.COMMENT_NODE)
    {
        //在任何浏览器中使用
    }
    */
    • 父节点、子节点、同辈节点

    childNodes属性是一个通过数组中以数字索引的元素来表示子节点的NodeList对象。该对象中第一个子元素的索引为0

    var first = document.getElementById('browserList').childNodes[0];
    //最后一个节点的索引为childNodes.length-1:
    var list=document.getElementById('browserList');
    var last=list.childNodes[list.childNodes.length-1];

    列出所有节点:

    ADS.addEvent(window,'load',function(){
        ADS.log.header('List child nodes of the document body');
        for (var i = 0;i<document.body.childNodes.length;i--)         
        {
            ADS.log.write(document.body.childNodes.item(i).nodeName);
         //也可以   document.body.childNodes[i]
    } });

    当只有一个节点的时候,firstChild和lastChild引用的是同一个节点。同样的previousSibling和nextSibling属性应用当前节点前后紧邻的同辈节点

    • 节点的属性
    ADS.addEvent(window,'load',function(){
        ADS.log.header('Attributes');
        var firefoxAnchor=document.getElementById('firefox');
        for(var i=0;i<firefoxAnchor.attributes.length;i++)
        {
            ADS.log.write(
                firefoxAnchor.attributes.item(i).nodeName
                +'='
                +firefoxAnchor.attributes.item(i).nodeValue
            );
        }
    });
    • 节点的ownerDocument属性

    类似于指向节点所属跟文档的引用。大多数邢矿下都可以通过它在作用域链中引用document.或者window.document

    • 操纵节点树( appendChild和insertBefore 等等)

    核心Element对象

    • 操纵Element对象的属性

    getAttribute(name)方法给予一个字符串形式的属性名称取得相应的属性值,例如:

    ADS.addEvent(window,'load',function(){
        ADS.log.header('Get Safari href attribute');
        var safariAnchor=document.getElementById('safari');
        var href=safariAbchor.getAttribute('href');
        ADS.log.write(href);
    });

    setAttribute(name,value)

    ADS.setEvent(window,'load',function(){
        ADS.log.header('set Safari title attribute');
        var safariAnchor=document.getElementById('safari');
        safariAnchor.setAttribute('title','Safari is for Mac OS x');
    });

    removeAttribute(name)

    ADS.removeEvent(window,'load',function(){
        ADS.log.header('Remove Firefox title attribute');
        var firefox=document.getElementById('firefoxbute');
        firefox.removeAttribute('title')
    });
    • 在Element对象中查找Element对象
    ADS.addEvent(window,'load',function(){
        ADS.log.header('Get all browserList elements by tag name');
        var list=document.getElementById('browserList');
        var ancestors=list.getElementsByTagName('*');
        for (i=0;i<ancestors.length ;i++ )
        {
            ADS.log.write(ancestors.item(i).nodename)
        }
    
    });

    核心Document对象

    如果浏览器比较古老,只支持document.all不支持document.getElementById()则用如下检测:

    if (document.all&&!document.getElementById)
    {
        document.getElementById=function(id)
        {
            return document.all(id);
        }
    }
    • document.documentElement属性(访问HTML根元素的快捷访问方式,即<html>)
    • 使用Document对象的方法创建节点
    createAttribute(name)//创建节点类型为Node,ATTRIBUTE_NODE的Attr节点
    createCDATASectoin(data)//创建节点类型为Node.CDATA_SECTION_NODE的CDATASection节点
    createComment(data)
    createElement(tagName)
    createEntityReference(name)
    createProcessingInstruction(target,data)
    createTextNode(data)
    • 使用Document对象的方法查找Element对象--document.getElementById('outer-wrapper');

     

    遍历和迭代DOM树

    //如果不关心节点在DOM树中的深度,那么可以使用document.getElementsByTagName('*')
    //方法获取指定节点中所有Element节点,并循环遍历节点
    
    function walkElementsLinear(func,node)
    {
        var root = node||window.document;
        var nodes = root.getElementsByTagName('*');
        for (var i= 0;i<nodes.length ;i++ )
        {
            func.call(nodes[i]);
        }
    };
    //如果跟踪节点深度,或者构建一个路径,那么可以通过递归的方法遍历DOM树
    function walkTheDOMRecuresive(func,node,depth,returedFromParent)
    {
        var root=node||window.document;
        var returnedFromParent=function.call(root,depth++returnedFromParent);
        var node=root.firstChild;
        while (node)
        {
            walkTheDOMRecuresive(func,node,depth,returnedFromParent);
            node=node.nextSibling;
        }
    };

     

  • 相关阅读:
    由12306.cn谈谈网站性能技术 岁月无情
    雅虎网站页面性能优化的34条黄金守则 岁月无情
    [纯技术讨论]从12306谈海量事务高速处理系统 岁月无情
    解密淘宝网的开源架构(转) 岁月无情
    HttpCombiner.ashx处理 岁月无情
    转 自定义控件属性的特性大全 岁月无情
    模式窗口window.showModal 岁月无情
    动态加载JSashx的妙用 岁月无情
    ASP.NET中Get和Post的用法 岁月无情
    初学Oracle的笔记(1)——基础内容(实时更新中..)
  • 原文地址:https://www.cnblogs.com/sunhan/p/3542379.html
Copyright © 2011-2022 走看看