成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

《JavaScript 闖關(guān)記》之 DOM(下)

mudiyouyou / 522人閱讀

摘要:節(jié)點(diǎn)具有以下特征的值為的值為元素的標(biāo)簽名的值為可能是或其子節(jié)點(diǎn)可能是或。添加的這些屬性分別對(duì)應(yīng)于每個(gè)元素中都存在的下列標(biāo)準(zhǔn)特性。,有關(guān)元素的附加說(shuō)明信息,一般通過(guò)工具提示條顯示出來(lái)。

Element 類型

除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素,提供了對(duì)元素標(biāo)簽名、子節(jié)點(diǎn)及特性的訪問(wèn)。Element 節(jié)點(diǎn)具有以下特征:

nodeType 的值為1;

nodeName 的值為元素的標(biāo)簽名;

nodeValue 的值為 null

parentNode 可能是 DocumentElement;

其子節(jié)點(diǎn)可能是 Element、TextComment、ProcessingInstruction、CDATASectionEntityReference。

要訪問(wèn)元素的標(biāo)簽名,可以使用 nodeName 屬性,也可以使用 tagName 屬性;這兩個(gè)屬性會(huì)返回相同的值(使用后者主要是為了清晰起見(jiàn))。以下面的元素為例:

可以像下面這樣取得這個(gè)元素及其標(biāo)簽名:

var div = document.getElementById("myDiv");
console.log(div.tagName); // "DIV"
console.log(div.tagName === div.nodeName); // true

這里的元素標(biāo)簽名是 div,它擁有一個(gè)值為 "myDiv" 的ID??墒牵?b>div.tagName 實(shí)際上輸出的是 "DIV" 而非 "div"。在HTML中,標(biāo)簽名始終都以全部大寫(xiě)表示;而在 XML(有時(shí)候也包括 XHTML)中,標(biāo)簽名則始終會(huì)與源代碼中的保持一致。假如你不確定自己的腳本將會(huì)在 HTML 還是 XML 文檔中執(zhí)行,最好是在比較之前將標(biāo)簽名轉(zhuǎn)換為相同的大小寫(xiě)形式,如下面的例子所示:

// 不能這樣比較,很容易出錯(cuò)!
if (element.tagName == "div"){ 
    //在此執(zhí)行某些操作
}

// 這樣最好(適用于任何文檔)
if (element.tagName.toLowerCase() == "div"){ 
    //在此執(zhí)行某些操作
}
HTML 元素

所有 HTML 元素都由 HTMLElement 類型表示,不是直接通過(guò)這個(gè)類型,也是通過(guò)它的子類型來(lái)表示。HTMLElement 類型直接繼承自 Element 并添加了一些屬性。添加的這些屬性分別對(duì)應(yīng)于每個(gè) HTML 元素中都存在的下列標(biāo)準(zhǔn)特性。

id,元素在文檔中的唯一標(biāo)識(shí)符。

title,有關(guān)元素的附加說(shuō)明信息,一般通過(guò)工具提示條顯示出來(lái)。

lang,元素內(nèi)容的語(yǔ)言代碼,很少使用。

dir,語(yǔ)言的方向,值為 "ltr"(left-to-right,從左至右)或 "rtl"(right-to-left,從右至左),也很少使用。

className,與元素的 class 特性對(duì)應(yīng),即為元素指定的 CSS 類。沒(méi)有將這個(gè)屬性命名為 class,是因?yàn)?class 是 JavaScript 的保留字。

上述這些屬性都可以用來(lái)取得或修改相應(yīng)的特性值。以下面的HTML元素為例:

元素中指定的所有信息,都可以通過(guò)下列 JavaScript 代碼取得:

var div = document.getElementById("myDiv");
console.log(div.id);         // "myDiv""
console.log(div.className);  // "bd"
console.log(div.title);      // "Body text"
console.log(div.lang);       // "en"
console.log(div.dir);        // "ltr"

當(dāng)然,像下面這樣通過(guò)為每個(gè)屬性賦予新的值,也可以修改對(duì)應(yīng)的每個(gè)特性:

div.id = "someOtherId";
div.className = "ft";
div.title = "Some other text";
div.lang = "fr";
div.dir ="rtl";

并不是對(duì)所有屬性的修改都會(huì)在頁(yè)面中直觀地表現(xiàn)出來(lái)。對(duì) idlang 的修改對(duì)用戶而言是透明不可見(jiàn)的(假設(shè)沒(méi)有基于它們的值設(shè)置的 CSS 樣式),而對(duì) title 的修改則只會(huì)在鼠標(biāo)移動(dòng)到這個(gè)元素之上時(shí)才會(huì)顯示出來(lái)。對(duì) dir 的修改會(huì)在屬性被重寫(xiě)的那一刻,立即影響頁(yè)面中文本的左、右對(duì)齊方式。修改 className 時(shí),如果新類關(guān)聯(lián)了與此前不同的 CSS 樣式,那么就會(huì)立即應(yīng)用新的樣式。

取得特性

每個(gè)元素都有一或多個(gè)特性,這些特性的用途是給出相應(yīng)元素或其內(nèi)容的附加信息。操作特性的 DOM 方法主要有三個(gè),分別是 getAttribute()、setAttribute()removeAttribute()。這三個(gè)方法可以針對(duì)任何特性使用,包括那些以 HTMLElement 類型屬性的形式定義的特性。來(lái)看下面的例子:

var div = document.getElementById("myDiv");
console.log(div.getAttribute("id"));     // "myDiv"
console.log(div.getAttribute("class"));  // "bd"
console.log(div.getAttribute("title"));  // "Body text"
console.log(div.getAttribute("lang"));   // "en"
console.log(div.getAttribute("dir"));    // "ltr"

注意,傳遞給 getAttribute() 的特性名與實(shí)際的特性名相同。因此要想得到 class 特性值,應(yīng)該傳入 "class" 而不是 "className",后者只有在通過(guò)對(duì)象屬性訪問(wèn)特性時(shí)才用。如果給定名稱的特性不存在,getAttribute() 返回 null。

通過(guò) getAttribute() 方法也可以取得自定義特性(即標(biāo)準(zhǔn) HTML 語(yǔ)言中沒(méi)有的特性)的值,以下面的元素為例:

這個(gè)元素包含一個(gè)名為 my_special_attribute 的自定義特性,它的值是 "hello!"??梢韵袢〉闷渌匦砸粯尤〉眠@個(gè)值,如下所示:

var value = div.getAttribute("my_special_attribute");

不過(guò),特性的名稱是不區(qū)分大小寫(xiě)的,即 "ID""id" 代表的都是同一個(gè)特性。另外也要注意,根據(jù) HTML5 規(guī)范,自定義特性應(yīng)該加上 data- 前綴以便驗(yàn)證。

任何元素的所有特性,也都可以通過(guò) DOM 元素本身的屬性來(lái)訪問(wèn)。當(dāng)然,HTMLElement 也會(huì)有5個(gè)屬性與相應(yīng)的特性一一對(duì)應(yīng)。不過(guò),只有公認(rèn)的(非自定義的)特性才會(huì)以屬性的形式添加到 DOM 對(duì)象中。以下面的元素為例:

因?yàn)?idalign 在 HTML 中是 div 的公認(rèn)特性,因此該元素的 DOM 對(duì)象中也將存在對(duì)應(yīng)的屬性。不過(guò),自定義特性 my_special_attribute 在 Safari、Opera、Chrome 及 Firefox 中是不存在的;但 IE 卻會(huì)為自定義特性也創(chuàng)建屬性,如下面的例子所示:

console.log(div.id);                      // "myDiv"
console.log(div.my_special_attribute);    // undefined(IE除外)
console.log(div.align);                   // "left"

有兩類特殊的特性,它們雖然有對(duì)應(yīng)的屬性名,但屬性的值與通過(guò) getAttribute() 返回的值并不相同。第一類特性就是 style,用于通過(guò) CSS 為元素指定樣式。在通過(guò) getAttribute() 訪問(wèn)時(shí),返回的 style 特性值中包含的是CSS文本,而通過(guò)屬性來(lái)訪問(wèn)它則會(huì)返回一個(gè)對(duì)象。由于 style 屬性是用于以編程方式訪問(wèn)元素樣式的,因此并沒(méi)有直接映射到 style 特性。

第二類與眾不同的特性是 onclick 這樣的事件處理程序。當(dāng)在元素上使用時(shí),onclick 特性中包含的是 JavaScript 代碼,如果通過(guò) getAttribute() 訪問(wèn),則會(huì)返回相應(yīng)代碼的字符串。而在訪問(wèn) onclick 屬性時(shí),則會(huì)返回一個(gè) JavaScript 函數(shù)(如果未在元素中指定相應(yīng)特性,則返回 null)。這是因?yàn)?onclick 及其他事件處理程序?qū)傩员旧砭蛻?yīng)該被賦予函數(shù)值。

由于存在這些差別,在通過(guò) JavaScript 以編程方式操作 DOM 時(shí),開(kāi)發(fā)人員經(jīng)常不使用 getAttribute(),而是只使用對(duì)象的屬性。只有在取得自定義特性值的情況下,才會(huì)使用 getAttribute() 方法。

設(shè)置特性

getAttribute() 對(duì)應(yīng)的方法是 setAttribute(),這個(gè)方法接受兩個(gè)參數(shù):要設(shè)置的特性名和值。如果特性已經(jīng)存在,setAttribute() 會(huì)以指定的值替換現(xiàn)有的值;如果特性不存在,setAttribute() 則創(chuàng)建該屬性并設(shè)置相應(yīng)的值。來(lái)看下面的例子:

div.setAttribute("id", "someOtherId");
div.setAttribute("class", "ft");
div.setAttribute("title", "Some other text");
div.setAttribute("lang","fr");
div.setAttribute("dir", "rtl");

通過(guò) setAttribute() 方法既可以操作HTML特性也可以操作自定義特性。通過(guò)這個(gè)方法設(shè)置的特性名會(huì)被統(tǒng)一轉(zhuǎn)換為小寫(xiě)形式,即 "ID" 最終會(huì)變成 "id"。

因?yàn)樗刑匦远际菍傩?,所以直接給屬性賦值可以設(shè)置特性的值,如下所示。

div.id = "someOtherId";
div.align = "left";

不過(guò),像下面這樣為 DOM 元素添加一個(gè)自定義的屬性,該屬性不會(huì)自動(dòng)成為元素的特性。

div.mycolor = "red";
console.log(div.mycolor); // "red"
console.log(div.getAttribute("mycolor")); // null(IE除外)

這個(gè)例子添加了一個(gè)名為 mycolor 的屬性并將它的值設(shè)置為 "red"。在大多數(shù)瀏覽器中,這個(gè)屬性都不會(huì)自動(dòng)變成元素的特性,因此想通過(guò) getAttribute() 取得同名特性的值,結(jié)果會(huì)返回 null??墒?,自定義屬性在 IE 中會(huì)被當(dāng)作元素的特性,反之亦然。

要介紹的最后一個(gè)方法是 removeAttribute(),這個(gè)方法用于徹底刪除元素的特性。調(diào)用這個(gè)方法不僅會(huì)清除特性的值,而且也會(huì)從元素中完全刪除特性,如下所示:

div.removeAttribute("class");

這個(gè)方法并不常用,但在序列化 DOM 元素時(shí),可以通過(guò)它來(lái)確切地指定要包含哪些特性。

創(chuàng)建元素

使用 document.createElement() 方法可以創(chuàng)建新元素。這個(gè)方法只接受一個(gè)參數(shù),即要?jiǎng)?chuàng)建元素的標(biāo)簽名。這個(gè)標(biāo)簽名在 HTML 文檔中不區(qū)分大小寫(xiě)。例如,使用下面的代碼可以創(chuàng)建一個(gè) div 元素。

var div = document.createElement("div");

在使用 createElement() 方法創(chuàng)建新元素的同時(shí),也為新元素設(shè)置了 ownerDocuemnt 屬性。此時(shí),還可以操作元素的特性,為它添加更多子節(jié)點(diǎn),以及執(zhí)行其他操作。來(lái)看下面的例子。

div.id = "myNewDiv";
div.className = "box";

在新元素上設(shè)置這些特性只是給它們賦予了相應(yīng)的信息。由于新元素尚未被添加到文檔樹(shù)中,因此設(shè)置這些特性不會(huì)影響瀏覽器的顯示。要把新元素添加到文檔樹(shù),可以使用 appendChild()、insertBefore()replaceChild() 方法。下面的代碼會(huì)把新創(chuàng)建的元素添加到文檔的 元素中。

document.body.appendChild(div);

一旦將元素添加到文檔樹(shù)中,瀏覽器就會(huì)立即呈現(xiàn)該元素。此后,對(duì)這個(gè)元素所作的任何修改都會(huì)實(shí)時(shí)反映在瀏覽器中。

元素的子節(jié)點(diǎn)

元素可以有任意數(shù)目的子節(jié)點(diǎn)和后代節(jié)點(diǎn),因?yàn)樵乜梢允瞧渌氐淖庸?jié)點(diǎn)。元素的 childNodes 屬性中包含了它的所有子節(jié)點(diǎn),這些子節(jié)點(diǎn)有可能是元素、文本節(jié)點(diǎn)、注釋或處理指令。不同瀏覽器在看待這些節(jié)點(diǎn)方面存在顯著的不同,以下面的代碼為例。

  • Item 1
  • Item 2
  • Item 3

如果是 IE8 來(lái)解析這些代碼,那么

    元素會(huì)有3個(gè)子節(jié)點(diǎn),分別是3個(gè)
  • 元素。但如果是在其他瀏覽器中,
      元素都會(huì)有7個(gè)元素,包括3個(gè)
    • 元素和4個(gè)文本節(jié)點(diǎn)(表示
    • 元素之間的空白符)。如果像下面這樣將元素間的空白符刪除,那么所有瀏覽器都會(huì)返回相同數(shù)目的子節(jié)點(diǎn)。

      • Item 1
      • Item 2
      • Item 3

      對(duì)于這段代碼,

        元素在任何瀏覽器中都會(huì)包含3個(gè)子節(jié)點(diǎn)。如果需要通過(guò) childNodes 屬性遍歷子節(jié)點(diǎn),那么一定不要忘記瀏覽器間的這一差別。這意味著在執(zhí)行某項(xiàng)操作以前,通常都要先檢查一下 nodeTpye 屬性,如下面的例子所示。

        for (var i=0, len=element.childNodes.length; i < len; i++){
            if (element.childNodes[i].nodeType == 1){
                //執(zhí)行某些操作
            }
        }

        這個(gè)例子會(huì)循環(huán)遍歷特定元素的每一個(gè)子節(jié)點(diǎn),然后只在子節(jié)點(diǎn)的 nodeType 等于1(表示是元素節(jié)點(diǎn))的情況下,才會(huì)執(zhí)行某些操作。

        如果想通過(guò)某個(gè)特定的標(biāo)簽名取得子節(jié)點(diǎn)或后代節(jié)點(diǎn)該怎么辦呢?實(shí)際上,元素也支持 getElementsByTagName() 方法。在通過(guò)元素調(diào)用這個(gè)方法時(shí),除了搜索起點(diǎn)是當(dāng)前元素之外,其他方面都跟通過(guò) document 調(diào)用這個(gè)方法相同,因此結(jié)果只會(huì)返回當(dāng)前元素的后代。例如,要想取得前面

          元素中包含的所有
        • 元素,可以使用下列代碼。

          var ul = document.getElementById("myList");
          var items = ul.getElementsByTagName("li");

          要注意的是,這里

            的后代中只包含直接子元素。不過(guò),如果它包含更多層次的后代元素,那么各個(gè)層次中包含的
          • 元素也都會(huì)返回。

            Text 類型

            文本節(jié)點(diǎn)由 Text 類型表示,包含的是可以照字面解釋的純文本內(nèi)容。純文本中可以包含轉(zhuǎn)義后的 HTML 字符,但不能包含 HTML 代碼。Text 節(jié)點(diǎn)具有以下特征:

            nodeType 的值為3;

            nodeName 的值為 "#text";

            nodeValue 的值為節(jié)點(diǎn)所包含的文本;

            parentNode 是一個(gè) Element;

            不支持(沒(méi)有)子節(jié)點(diǎn)。

            可以通過(guò) nodeValue 屬性或 data 屬性訪問(wèn) Text 節(jié)點(diǎn)中包含的文本,這兩個(gè)屬性中包含的值相同。對(duì) nodeValue 的修改也會(huì)通過(guò) data 反映出來(lái),反之亦然。使用下列方法可以操作節(jié)點(diǎn)中的文本。

            appendData(*text*):將 *text* 添加到節(jié)點(diǎn)的末尾。

            deleteData(*offset*,?*count*):從 *offset* 指定的位置開(kāi)始刪除 *count* 個(gè)字符。

            insertData(*offset, text*):在 *offset* 指定的位置插入 *text*。

            replaceData(*offset, count, text*):用 *text* 替換從 *offset* 指定的位置開(kāi)始到 *offset*+*count* 為止處的文本。

            splitText(*offset*):從 *offset* 指定的位置將當(dāng)前文本節(jié)點(diǎn)分成兩個(gè)文本節(jié)點(diǎn)。

            substringData(*offset, count*):提取從 *offset* 指定的位置開(kāi)始到 *offset+count* 為止處的字符串。

            除了這些方法之外,文本節(jié)點(diǎn)還有一個(gè) length 屬性,保存著節(jié)點(diǎn)中字符的數(shù)目。而且,nodeValue.lengthdata.length 中也保存著同樣的值。

            在默認(rèn)情況下,每個(gè)可以包含內(nèi)容的元素最多只能有一個(gè)文本節(jié)點(diǎn),而且必須確實(shí)有內(nèi)容存在。來(lái)看幾個(gè)例子。

            
            
            Hello World!

            上面代碼給出的第一個(gè)

            元素沒(méi)有內(nèi)容,因此也就不存在文本節(jié)點(diǎn)。開(kāi)始與結(jié)束標(biāo)簽之間只要存在內(nèi)容,就會(huì)創(chuàng)建一個(gè)文本節(jié)點(diǎn)。因此,第二個(gè)
            元素中雖然只包含一個(gè)空格,但仍然有一個(gè)文本子節(jié)點(diǎn);文本節(jié)點(diǎn)的 nodeValue 值是一個(gè)空格。第三個(gè) div 也有一個(gè)文本節(jié)點(diǎn),其 nodeValue 的值為 "Hello World!"??梢允褂靡韵麓a來(lái)訪問(wèn)這些文本子節(jié)點(diǎn)。

            var textNode = div.firstChild;  // 或者div.childNodes[0]

            在取得了文本節(jié)點(diǎn)的引用后,就可以像下面這樣來(lái)修改它了。

            div.firstChild.nodeValue = "Some other message";

            如果這個(gè)文本節(jié)點(diǎn)當(dāng)前存在于文檔樹(shù)中,那么修改文本節(jié)點(diǎn)的結(jié)果就會(huì)立即得到反映。另外,在修改文本節(jié)點(diǎn)時(shí)還要注意,此時(shí)的字符串會(huì)經(jīng)過(guò) HTML(或XML,取決于文檔類型)編碼。換句話說(shuō),小于號(hào)、大于號(hào)或引號(hào)都會(huì)像下面的例子一樣被轉(zhuǎn)義。

            // 輸出結(jié)果是"Some other message"
            div.firstChild.nodeValue = "Some other message";

            應(yīng)該說(shuō),這是在向 DOM 文檔中插入文本之前,先對(duì)其進(jìn)行 HTML 編碼的一種有效方式。

            在 IE8、Firefox、Safari、Chrome 和 Opera中,可以通過(guò)腳本訪問(wèn) Text 類型的構(gòu)造函數(shù)和原型。

            創(chuàng)建文本節(jié)點(diǎn)

            可以使用 document.createTextNode() 創(chuàng)建新文本節(jié)點(diǎn),這個(gè)方法接受一個(gè)參數(shù)——要插入節(jié)點(diǎn)中的文本。與設(shè)置已有文本節(jié)點(diǎn)的值一樣,作為參數(shù)的文本也將按照 HTML 或 XML 的格式進(jìn)行編碼。

            var textNode = document.createTextNode("Hello world!");

            在創(chuàng)建新文本節(jié)點(diǎn)的同時(shí),也會(huì)為其設(shè)置 ownerDocument 屬性。不過(guò),除非把新節(jié)點(diǎn)添加到文檔樹(shù)中已經(jīng)存在的節(jié)點(diǎn)中,否則我們不會(huì)在瀏覽器窗口中看到新節(jié)點(diǎn)。下面的代碼會(huì)創(chuàng)建一個(gè)

            元素并向其中添加一條消息。

            var element = document.createElement("div");
            element.className = "message";
            
            var textNode = document.createTextNode("Hello world!");
            element.appendChild(textNode);
            
            document.body.appendChild(element);

            這個(gè)例子創(chuàng)建了一個(gè)新

            元素并為它指定了值為 "message"class 特性。然后,又創(chuàng)建了一個(gè)文本節(jié)點(diǎn),并將其添加到前面創(chuàng)建的元素中。最后一步,就是將這個(gè)元素添加到了文檔的 元素中,這樣就可以在瀏覽器中看到新創(chuàng)建的元素和文本節(jié)點(diǎn)了。

            一般情況下,每個(gè)元素只有一個(gè)文本子節(jié)點(diǎn)。不過(guò),在某些情況下也可能包含多個(gè)文本子節(jié)點(diǎn),如下面的例子所示。

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

            如果兩個(gè)文本節(jié)點(diǎn)是相鄰的同胞節(jié)點(diǎn),那么這兩個(gè)節(jié)點(diǎn)中的文本就會(huì)連起來(lái)顯示,中間不會(huì)有空格。

            規(guī)范化文本節(jié)點(diǎn)

            DOM 文檔中存在相鄰的同胞文本節(jié)點(diǎn)很容易導(dǎo)致混亂,因?yàn)榉植磺迥膫€(gè)文本節(jié)點(diǎn)表示哪個(gè)字符串。另外,DOM 文檔中出現(xiàn)相鄰文本節(jié)點(diǎn)的情況也不在少數(shù),于是就催生了一個(gè)能夠?qū)⑾噜徫谋竟?jié)點(diǎn)合并的方法。這個(gè)方法是由 Node 類型定義的(因而在所有節(jié)點(diǎn)類型中都存在),名叫 normalize()。如果在一個(gè)包含兩個(gè)或多個(gè)文本節(jié)點(diǎn)的父元素上調(diào)用 normalize() 方法,則會(huì)將所有文本節(jié)點(diǎn)合并成一個(gè)節(jié)點(diǎn),結(jié)果節(jié)點(diǎn)的 nodeValue 等于將合并前每個(gè)文本節(jié)點(diǎn)的 nodeValue 值拼接起來(lái)的值。來(lái)看一個(gè)例子。

            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);
            console.log(element.childNodes.length);    // 2
            
            element.normalize();
            console.log(element.childNodes.length);    // 1
            console.log(element.firstChild.nodeValue); // "Hello world!Yippee!"

            瀏覽器在解析文檔時(shí)永遠(yuǎn)不會(huì)創(chuàng)建相鄰的文本節(jié)點(diǎn)。這種情況只會(huì)作為執(zhí)行DOM操作的結(jié)果出現(xiàn)。

            分割文本節(jié)點(diǎn)

            Text 類型提供了一個(gè)作用與 normalize() 相反的方法 splitText()。這個(gè)方法會(huì)將一個(gè)文本節(jié)點(diǎn)分成兩個(gè)文本節(jié)點(diǎn),即按照指定的位置分割 nodeValue 值。原來(lái)的文本節(jié)點(diǎn)將包含從開(kāi)始到指定位置之前的內(nèi)容,新文本節(jié)點(diǎn)將包含剩下的文本。這個(gè)方法會(huì)返回一個(gè)新文本節(jié)點(diǎn),該節(jié)點(diǎn)與原節(jié)點(diǎn)的 parentNode 相同。

            Comment 類型

            注釋在 DOM 中是通過(guò) Comment 類型來(lái)表示的。Comment 節(jié)點(diǎn)具有下列特征:

            nodeType 的值為8;

            nodeName 的值為 "#comment"

            nodeValue 的值是注釋的內(nèi)容;

            parentNode 可能是 DocumentElement;

            不支持(沒(méi)有)子節(jié)點(diǎn)。

            Comment 類型與 Text 類型繼承自相同的基類,因此它擁有除splitText() 之外的所有字符串操作方法。與 Text 類型相似,也可以通過(guò) nodeValuedata 屬性來(lái)取得注釋的內(nèi)容。

            注釋節(jié)點(diǎn)可以通過(guò)其父節(jié)點(diǎn)來(lái)訪問(wèn),以下面的代碼為例。

            在此,注釋節(jié)點(diǎn)是

            元素的一個(gè)子節(jié)點(diǎn),因此可以通過(guò)下面的代碼來(lái)訪問(wèn)它。

            var div = document.getElementById("myDiv");
            var comment = div.firstChild;
            console.log(comment.data);    // "A comment"

            另外,使用 document.createComment() 并為其傳遞注釋文本也可以創(chuàng)建注釋節(jié)點(diǎn),如下面的例子所示。

            var comment = document.createComment("A comment ");

            顯然,開(kāi)發(fā)人員很少會(huì)創(chuàng)建和訪問(wèn)注釋節(jié)點(diǎn),因?yàn)樽⑨尮?jié)點(diǎn)對(duì)算法鮮有影響。此外,瀏覽器也不會(huì)識(shí)別位于 標(biāo)簽后面的注釋。如果要訪問(wèn)注釋節(jié)點(diǎn),一定要保證它們位于 之間。

            Attr 類型

            元素的特性在 DOM 中以 Attr 類型來(lái)表示。在所有瀏覽器中(包括 IE8),都可以訪問(wèn) Attr 類型的構(gòu)造函數(shù)和原型。從技術(shù)角度講,特性就是存在于元素的 attributes 屬性中的節(jié)點(diǎn)。特性節(jié)點(diǎn)具有下列特征:

            nodeType 的值為11;

            nodeName 的值是特性的名稱;

            nodeValue 的值是特性的值;

            parentNode 的值為 null;

            在 HTML 中不支持(沒(méi)有)子節(jié)點(diǎn);

            在 XML 中子節(jié)點(diǎn)可以是 Text EntityReference。

            盡管它們也是節(jié)點(diǎn),但特性卻不被認(rèn)為是 DOM 文檔樹(shù)的一部分。開(kāi)發(fā)人員最常使用的是 getAttribute()setAttribute()remveAttribute() 方法,很少直接引用特性節(jié)點(diǎn)。

            Attr 對(duì)象有3個(gè)屬性:name、valuespecified。其中,name 是特性名稱(與 nodeName 的值相同),value 是特性的值(與 nodeValue 的值相同),而 specified 是一個(gè)布爾值,用以區(qū)別特性是在代碼中指定的,還是默認(rèn)的。

            使用 document.createAttribute() 并傳入特性的名稱可以創(chuàng)建新的特性節(jié)點(diǎn)。例如,要為元素添加 align 特性,可以使用下列代碼:

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

            添加特性之后,可以通過(guò)下列任何方式訪問(wèn)該特性:attributes 屬性、getAttributeNode() 方法以及 getAttribute() 方法。其中,attributesgetAttributeNode() 都會(huì)返回對(duì)應(yīng)特性的 Attr 節(jié)點(diǎn),而 getAttribute() 則只返回特性的值。

            DOM 操作

            很多時(shí)候,DOM 操作都比較簡(jiǎn)明,因此用 JavaScript 生成那些通常原本是用 HTML 代碼生成的內(nèi)容并不麻煩。不過(guò),也有一些時(shí)候,操作 DOM 并不像表面上看起來(lái)那么簡(jiǎn)單。由于瀏覽器中充斥著隱藏的陷阱和不兼容問(wèn)題,用 JavaScript 代碼處理 DOM 的某些部分要比處理其他部分更復(fù)雜一些。

            動(dòng)態(tài)腳本

            使用

            創(chuàng)建這個(gè) DOM 節(jié)點(diǎn)的代碼如下所示:

            function loadScript(url){
                var script = document.createElement("script");
                script.type = "text/javascript";
                script.src = url;
                document.body.appendChild(script);
            }

            下面是調(diào)用這個(gè)函數(shù)的示例:

            loadScript("client.js");

            另一種指定 JavaScript 代碼的方式是行內(nèi)方式,如下面的例子所示:

            
            

            從邏輯上講,下面操作的 DOM 代碼是有效的:

            var script = document.createElement("script");
            script.type = "text/javascript";
            script.appendChild(document.createTextNode("function sayHi(){alert("hi");}"));
            document.body.appendChild(script);

            在 Firefox、Safari、Chrome 和 Opera 中,這些 DOM 代碼可以正常運(yùn)行。但在 IE 中,則會(huì)導(dǎo)致錯(cuò)誤。IE 將

            
            
            
            aaa bbb ccc
            
            
            
            aaa bbb ccc
            
            
                
            更多

            關(guān)注微信公眾號(hào)「劼哥舍」回復(fù)「答案」,獲取關(guān)卡詳解。
            關(guān)注 https://github.com/stone0090/javascript-lessons,獲取最新動(dòng)態(tài)。

            文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

            轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80982.html

            相關(guān)文章

            • JavaScript 闖關(guān)

              摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語(yǔ)法的語(yǔ)法大量借鑒了及其他類語(yǔ)言如和的語(yǔ)法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...

              mj 評(píng)論0 收藏0
            • JavaScript 闖關(guān)簡(jiǎn)介

              摘要:瀏覽器只是實(shí)現(xiàn)的宿主環(huán)境之一,其他宿主環(huán)境包括和。年月,版發(fā)布,成為國(guó)際標(biāo)準(zhǔn)。事件定義了事件和事件處理的接口。對(duì)于已經(jīng)正式納入標(biāo)準(zhǔn)的來(lái)說(shuō),盡管各瀏覽器都實(shí)現(xiàn)了某些眾所周知的共同特性,但其他特性還是會(huì)因?yàn)g覽器而異。 JavaScript 是面向 Web 的編程語(yǔ)言,絕大多數(shù)現(xiàn)代網(wǎng)站都使用了 JavaScript,并且所有的現(xiàn)代 Web 瀏覽器(電腦,手機(jī),平板)均包含了 JavaScri...

              baihe 評(píng)論0 收藏0
            • JavaScript 闖關(guān)

              摘要:本課程之所以叫做闖關(guān)記,是因?yàn)椴糠终鹿?jié)精心設(shè)計(jì)了挑戰(zhàn)關(guān)卡,通過(guò)提供更多的實(shí)戰(zhàn)機(jī)會(huì),讓大家可以循序漸進(jìn)地有目的地有挑戰(zhàn)地開(kāi)展學(xué)習(xí)。課程結(jié)構(gòu)及目錄以下目錄只是初步構(gòu)想,課程結(jié)構(gòu)及內(nèi)容會(huì)根據(jù)實(shí)際情況隨時(shí)進(jìn)行調(diào)整。 為何寫(xiě)作此課程 stone 主要負(fù)責(zé)基于 Web 的企業(yè)內(nèi)部管理系統(tǒng)的開(kāi)發(fā),雖然能夠熟練地使用 JavaScript,但隨著對(duì) JavaScript 的理解越來(lái)越深,才發(fā)現(xiàn)自己尚...

              curried 評(píng)論0 收藏0
            • JavaScript 闖關(guān)垃圾回收和內(nèi)存管理

              摘要:內(nèi)存回收此時(shí),局部變量就沒(méi)有存在的必要了,因此可以釋放它們的內(nèi)存以供將來(lái)使用。局部變量會(huì)在它們離開(kāi)執(zhí)行環(huán)境時(shí)自動(dòng)被解除引用,如下面這個(gè)例子所示手工解除的引用由于局部變量在函數(shù)執(zhí)行完畢后就離開(kāi)了其執(zhí)行環(huán)境,因此無(wú)需我們顯式地去為它解除引用。 JavaScript 具有自動(dòng)垃圾收集機(jī)制(GC:Garbage Collecation),也就是說(shuō),執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存。而...

              Sleepy 評(píng)論0 收藏0
            • JavaScript 闖關(guān)初探

              摘要:使用元素嵌入代碼時(shí),只需為指定屬性。需要注意的是,帶有屬性的元素不應(yīng)該在其和元素之間再包含額外的代碼。在包含外部文件時(shí),必須將屬性設(shè)置為指向相應(yīng)文件的。所有元素都會(huì)按照他們?cè)陧?yè)面中出現(xiàn)的先后順序依次被解析。關(guān)注,獲取最新動(dòng)態(tài)。 當(dāng)學(xué)習(xí)一門(mén)新的編程語(yǔ)言的時(shí)候,應(yīng)該邊學(xué)邊做,反復(fù)演練以加深理解。因此,你需要一個(gè) JavaScript 解釋器。幸運(yùn)的是,每一個(gè) Web 瀏覽器都包含一個(gè) Ja...

              atinosun 評(píng)論0 收藏0

            發(fā)表評(píng)論

            0條評(píng)論

閱讀需要支付1元查看
<