zoukankan      html  css  js  c++  java
  • DOM

    Node类型

    所有节点类型由在Node类型中定义的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

    节点最常用的属性便是nodeNamenodeType了,所在确定节点类型可以使用下列代码

            if (someNode.nodeType==Node.ELEMENT_NODE) {//这个在IE下无效
                alert('Node is an element');
            }
            //为了兼容所有的浏览器
            if (someNode.nodeType==1) {
                alert('Node is an element');
            }

    值得一讲的是节点的childNodes属性,它保存的是一个NodeList对象,每个NodeList对象都有一个length属性,我们可以通过[]的方式或者是item方法来获得其中某一项的值,代码如下:

            var firstNode = someNode.childNodes[0];
            var secondNode = someNode.childNodes.item(1);
            var length = someNode.childNodes.length;

    大家都知道childNodes属性虽然有length属性,但它毕竟是NodeList对象,那如何把它转换为数组对象以方便后续操作呢?看代码:

            function convertToArray(nodes) {
                var array = null;
                try {
                    array = Array.prototype.slice.call(nodes, 0);//针对非IE浏览器
                } catch (ex) {
                    array = [];
                    for (var i = 0,len=nodes.length; i < len; i++) {
                        array.push(nodes[i]);
                    }
                }
                return array;
            }

    下面说说之间的关系吧!

    上述介绍了那么多节点的属性,比如说childNodes,parentNode,firstChild,lastChild,nextSibling,previousSibling等

    事实上所有的结点还有一个大家可能不常听到的属性,那就是ownerDocument,该属性指向表示整个文档的文档节点

    说说节点的方法吧

    hasChildNodes判断是否有子节点,如果有则返回true

    appendChild用于向childNodes列表的末尾添加一个节点

    insertBefore 这个方法接受两个参数:要插入的节点和作为参照的节点,插入节点后,被插入的节点会变成参照节点的previousSibling,同时返回插入的节点

    replaceChild这个方法接受两个参数:要插入的节点和要替换的节点,要替换的节点将由这个方法返回并从文档树中被移除(被replaceChild替换的节点仍然为文档所有,只不过在文档中已经没有位置了)。

    removeChild接受一个参数,即为要移除的节点。方法调用后被移除的节点将作为返回值(通过removeChild移除的节点仍然为文档所有,只不过在文档中已经没有位置了)

    cloneNode用于创建节点的副本,如果传入的参数为true,则执行深复制(复制节点及整个子节点树),如果传入的参数为false,则执行浅复制(仅仅复制节点本身)

    normalize处理文档树中的节点(当在某个节点上调用该方法时,就会在该节点的后代节点中查找是否有空文本节点,如果有则删除,是否有相邻的文本节点,如果有则合并)

    Document类型

    JavaScript通过Document类型表示文档,在浏览器中,document对象是HTMLDocument的一个实例,表示整个HTML页面,而且因为document对象是window对象的一个属性,因此可以将其作为全局对象来访问。

    看看它有哪些属性吧

            var body = document.body;//取得对<body>的引用
            var doctype = document.doctype;//取得对<!DOCTYPE html>的引用
            var originTitle = document.title;//取得文档标题
            document.title = 'Hello World!';//设置文档标题
            var url = document.URL;//取得完整的URL 只读属性
            var domain = document.domain;//取得域名  可以设置
            var ref = document.referrer;//取得来源页面的URL  只读属性

    document.implementation属性上规定了一个方法hasFeature,这个方法接受两个参数:要检测的DOM功能的名称及版本号

            //检测浏览器是否支持DOM2级XML
            var hasXmlDom = document.implementation.hasFeature('XML', '2.0');
    
            //检测浏览器是否支持DOM3级XPath
            var supportsXPath = document.implementation.hasFeature('XPath', '3.0');

    document对象还有一些特殊集合,这些集合都是HTMLCollection对象

    在这里特别说一下HTMLCollection对象有一个namedItem方法(就好像NodeList的item方法一样)

    看看它有哪些方法吧

    • getElementById
    • getElementsByName
    • getElementsByTagName
    • write
    • writeln

    Element类型

        <div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr">Some text</div>
        <input type="button" value="Get Values" onclick="getValues()">
        <input type="button" value="Set Values" onclick="setValues()"> 
     var div = null;
            function getValues(){
                if (div == null) {
                    div = document.getElementById("myDiv");
                }
                alert(div.id);         //"myDiv"
                alert(div.className);  //"bd"
                alert(div.title);      //"Body text"
                alert(div.lang);       //"en"
                alert(div.dir);        //"ltr"
            }    
            
            function setValues(){
                if (div == null) {
                    div = document.getElementById("myDiv");
                }
            
                div.id = "someOtherId";
                div.className = "ft";
                div.title = "Some other text";
                div.lang = "fr";
                div.dir ="rtl";        
            }

    上面是说的id,title,lang,dir,className等属性。再看一下下面的demo,看如何获得节点属性

            var div = null;
            function getValues(){
                if (div == null) {
                    div = document.getElementById("myDiv");
                }
                alert(div.getAttribute("id"));         //"myDiv"
                alert(div.getAttribute("class"));      //"bd"
                alert(div.getAttribute("title"));      //"Body text"
                alert(div.getAttribute("lang"));       //"en"
                alert(div.getAttribute("dir"));        //"ltr"
                alert(div.getAttribute("my_special_attribute"));   //"hello!"
            }    
            
            function setValues(){
                if (div == null) {
                    div = document.getElementById("myDiv");
                }
            
                div.setAttribute("id", "someOtherId");
                div.setAttribute("class", "ft");
                div.setAttribute("title", "Some other text");
                div.setAttribute("lang","fr");
                div.setAttribute("dir", "rtl");        
                div.setAttribute("class", "change");
            }
    
            function getValues2(){
                if (div == null) {
                    div = document.getElementById("myDiv");
                }
                alert(div.id);                     //"myDiv"
                alert(div.my_special_attribute);   //"hello!" (IE only)
                alert(div.align);                  //"left"
            }    
    
            function outputAttributes(element){
                var pairs = new Array(),
                    attrName,
                    attrValue,
                    i,
                    len;
    
                for (i=0, len=element.attributes.length; i < len; i++){
                    attrName = element.attributes[i].nodeName;
                    attrValue = element.attributes[i].nodeValue;
                    if (element.attributes[i].specified){//如果specified属性返回true 则表示在HTML中指定了特性
                        pairs.push(attrName + "="" + attrValue + """);
                    }
                }
                return pairs.join(" ");
            }

    Text类型

    Text类型估计大家都知道有createTextNode方法,下面我来介绍两个大家可能没听过的方法

    normalize:规范化文本节点

    splitText:分割文本节点

    看demo例子吧:

                var element = document.createElement("div");
                element.className = "message";
                
                var textNode = document.createTextNode("Hello world!");
                element.appendChild(textNode);
                
                var anotherTextNode = document.createTextNode("Yippee!");
                element.appendChild(anotherTextNode);
                
                document.body.appendChild(element);
                
                alert(element.childNodes.length);  //2
                
                element.normalize();
                alert(element.childNodes.length);  //1
                alert(element.firstChild.nodeValue);  //"Hello World!Yippee!"
                var element = document.createElement("div");
                element.className = "message";
                
                var textNode = document.createTextNode("Hello world!");
                element.appendChild(textNode);
                
                document.body.appendChild(element);
                
                var newNode = element.firstChild.splitText(5);
                alert(element.firstChild.nodeValue);  //"Hello"
                alert(newNode.nodeValue);             //" world!"
                alert(element.childNodes.length);     //2

    Comment类型

        <div id="myDiv"><!-- A comment --></div>
        <input type="button" value="Get Comment" onclick="getComment()">
            function getComment(){
            
                var div = document.getElementById("myDiv");
                var comment = div.firstChild;
                alert(comment.data);//A comment
                var comment = document.createComment('看一下我写的注释');//添加注释节点
                div.appendChild(comment);
            }

    执行js后的HTML结构如下图所示:

    DocumentFragment类型

                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);    

    CDATASection类型

    <div id="myDiv"><![CDATA[This is some content.]]></div>
                var div = document.getElementById("myDiv");
                var cdata = div.firstChild;
                alert(cdata.nodeType);//8
                alert(cdata.nodeValue);//[CDATA[This is some content.]]
                //document.createCDATASection

    Attr类型

                var element = document.getElementById("myDiv");
                var attr = document.createAttribute("align");
                attr.value = "left";
                element.setAttributeNode(attr);
                
                alert(element.attributes["align"].value);       //"left"
                alert(element.getAttributeNode("align").value); //"left"
                alert(element.getAttribute("align"));           //"left"

    Attr对象有3个属性

    name:特性名称

    value:特性的值

    specified:如果特性是在HTML默认设置的,则返回true,否则如果是在代码中指定的,则返回false

    动态脚本

            function loadScriptString(code){
                var script = document.createElement("script");
                script.type = "text/javascript";
                try {
                    script.appendChild(document.createTextNode(code));
                } catch (ex){
                    script.text = code;
                }
                document.body.appendChild(script);
            }
        
            function addScript(){
                loadScriptString("function sayHi(){alert('hi');}");
                sayHi();
            }

    动态样式

            function loadStyleString(css){
                var style = document.createElement("style");
                style.type = "text/css";
                try{
                    style.appendChild(document.createTextNode(css));
                } catch (ex){
                    style.styleSheet.cssText = css;
                }
                var head = document.getElementsByTagName("head")[0];
                head.appendChild(style);
            }
        
            function addStyle(){
                loadStyleString("body{background-color:red}"); 
            }

    操作表格

    table元素的方法和属性如下图所示:

    tbody元素的方法和属性如下图所示:

    tr元素的方法和属性如下图所示:

  • 相关阅读:
    Final TFS 2008 Feature List
    来看看微软对测试是什么要求
    淘宝设计流程
    Disable try catch
    jQuery validate API
    iPhone手机开发平台入门介绍和教程
    VSSpeedster Speed up your VS 2010
    Where are the SDK tools? Where is ildasm?
    效率高的删除语句truncate table [tablename]
    修改Hosts去除各站广告
  • 原文地址:https://www.cnblogs.com/elegance/p/4221598.html
Copyright © 2011-2022 走看看