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元素的方法和属性如下图所示:

posted @ 2015-01-13 17:58  YouYaInsist  阅读(241)  评论(0编辑  收藏  举报
 评论
 收藏