摘要:節(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 可能是 Document 或 Element;
其子節(jié)點(diǎn)可能是 Element、Text、Comment、ProcessingInstruction、CDATASection 或 EntityReference。
要訪問(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ì) id 或 lang 的修改對(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)?id 和 align 在 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)方面存在顯著的不同,以下面的代碼為例。
如果是 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)。
對(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ì)返回。
文本節(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.length 和 data.length 中也保存著同樣的值。
在默認(rèn)情況下,每個(gè)可以包含內(nèi)容的元素最多只能有一個(gè)文本節(jié)點(diǎn),而且必須確實(shí)有內(nèi)容存在。來(lái)看幾個(gè)例子。
Hello World!
上面代碼給出的第一個(gè) 在取得了文本節(jié)點(diǎn)的引用后,就可以像下面這樣來(lái)修改它了。 如果這個(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)義。 應(yīng)該說(shuō),這是在向 DOM 文檔中插入文本之前,先對(duì)其進(jìn)行 HTML 編碼的一種有效方式。 在 IE8、Firefox、Safari、Chrome 和 Opera中,可以通過(guò)腳本訪問(wèn) Text 類型的構(gòu)造函數(shù)和原型。 可以使用 document.createTextNode() 創(chuàng)建新文本節(jié)點(diǎn),這個(gè)方法接受一個(gè)參數(shù)——要插入節(jié)點(diǎn)中的文本。與設(shè)置已有文本節(jié)點(diǎn)的值一樣,作為參數(shù)的文本也將按照 HTML 或 XML 的格式進(jìn)行編碼。 在創(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è) 這個(gè)例子創(chuàng)建了一個(gè)新 一般情況下,每個(gè)元素只有一個(gè)文本子節(jié)點(diǎn)。不過(guò),在某些情況下也可能包含多個(gè)文本子節(jié)點(diǎn),如下面的例子所示。 如果兩個(gè)文本節(jié)點(diǎn)是相鄰的同胞節(jié)點(diǎn),那么這兩個(gè)節(jié)點(diǎn)中的文本就會(huì)連起來(lái)顯示,中間不會(huì)有空格。 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è)例子。 瀏覽器在解析文檔時(shí)永遠(yuǎn)不會(huì)創(chuàng)建相鄰的文本節(jié)點(diǎn)。這種情況只會(huì)作為執(zhí)行DOM操作的結(jié)果出現(xià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 相同。 注釋在 DOM 中是通過(guò) Comment 類型來(lái)表示的。Comment 節(jié)點(diǎn)具有下列特征: nodeType 的值為8; nodeName 的值為 "#comment"; nodeValue 的值是注釋的內(nèi)容; parentNode 可能是 Document 或 Element; 不支持(沒(méi)有)子節(jié)點(diǎn)。 Comment 類型與 Text 類型繼承自相同的基類,因此它擁有除splitText() 之外的所有字符串操作方法。與 Text 類型相似,也可以通過(guò) nodeValue 或 data 屬性來(lái)取得注釋的內(nèi)容。 注釋節(jié)點(diǎn)可以通過(guò)其父節(jié)點(diǎn)來(lái)訪問(wèn),以下面的代碼為例。 在此,注釋節(jié)點(diǎn)是 另外,使用 document.createComment() 并為其傳遞注釋文本也可以創(chuàng)建注釋節(jié)點(diǎn),如下面的例子所示。 顯然,開(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),一定要保證它們位于 和 之間。 元素的特性在 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、value 和 specified。其中,name 是特性名稱(與 nodeName 的值相同),value 是特性的值(與 nodeValue 的值相同),而 specified 是一個(gè)布爾值,用以區(qū)別特性是在代碼中指定的,還是默認(rèn)的。 使用 document.createAttribute() 并傳入特性的名稱可以創(chuàng)建新的特性節(jié)點(diǎn)。例如,要為元素添加 align 特性,可以使用下列代碼: 添加特性之后,可以通過(guò)下列任何方式訪問(wèn)該特性:attributes 屬性、getAttributeNode() 方法以及 getAttribute() 方法。其中,attributes 和 getAttributeNode() 都會(huì)返回對(duì)應(yīng)特性的 Attr 節(jié)點(diǎn),而 getAttribute() 則只返回特性的值。 很多時(shí)候,DOM 操作都比較簡(jiǎn)明,因此用 JavaScript 生成那些通常原本是用 HTML 代碼生成的內(nèi)容并不麻煩。不過(guò),也有一些時(shí)候,操作 DOM 并不像表面上看起來(lái)那么簡(jiǎn)單。由于瀏覽器中充斥著隱藏的陷阱和不兼容問(wèn)題,用 JavaScript 代碼處理 DOM 的某些部分要比處理其他部分更復(fù)雜一些。 使用
創(chuàng)建這個(gè) DOM 節(jié)點(diǎn)的代碼如下所示: 下面是調(diào)用這個(gè)函數(shù)的示例: 另一種指定 JavaScript 代碼的方式是行內(nèi)方式,如下面的例子所示: 從邏輯上講,下面操作的 DOM 代碼是有效的: 在 Firefox、Safari、Chrome 和 Opera 中,這些 DOM 代碼可以正常運(yùn)行。但在 IE 中,則會(huì)導(dǎo)致錯(cuò)誤。IE 將
關(guān)注微信公眾號(hào)「劼哥舍」回復(fù)「答案」,獲取關(guān)卡詳解。 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80982.html 摘要:對(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 元素... 摘要:瀏覽器只是實(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... 摘要:本課程之所以叫做闖關(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)自己尚... 摘要:內(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)存。而... 摘要:使用元素嵌入代碼時(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... 閱讀 2068·2021-11-19 09:40 閱讀 2030·2021-09-28 09:36 閱讀 2365·2021-09-22 10:02 閱讀 2802·2019-08-30 14:00 閱讀 2014·2019-08-29 15:31 閱讀 2961·2019-08-29 15:11 閱讀 2970·2019-08-29 13:04 閱讀 1143·2019-08-27 10:55var textNode = div.firstChild; // 或者div.childNodes[0]
div.firstChild.nodeValue = "Some other message";
// 輸出結(jié)果是"Some other message"
div.firstChild.nodeValue = "Some other message";
創(chuàng)建文本節(jié)點(diǎn)
var textNode = document.createTextNode("Hello world!");
var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
document.body.appendChild(element);
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);
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!"
var div = document.getElementById("myDiv");
var comment = div.firstChild;
console.log(comment.data); // "A comment"
var comment = document.createComment("A comment ");
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"
function loadScript(url){
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
document.body.appendChild(script);
}
loadScript("client.js");
var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode("function sayHi(){alert("hi");}"));
document.body.appendChild(script);
更多
關(guān)注 https://github.com/stone0090/javascript-lessons,獲取最新動(dòng)態(tài)。相關(guān)文章
JavaScript 闖關(guān)記
《JavaScript 闖關(guān)記》之簡(jiǎn)介
《JavaScript 闖關(guān)記》
《JavaScript 闖關(guān)記》之垃圾回收和內(nèi)存管理
《JavaScript 闖關(guān)記》之初探
發(fā)表評(píng)論
0條評(píng)論
mudiyouyou
男|高級(jí)講師
TA的文章
閱讀更多
C++內(nèi)存管理
數(shù)據(jù)的存儲(chǔ)練習(xí)題
解決物體檢測(cè)中的小目標(biāo)問(wèn)題
CSS引入外部字體方法,附可用demo
前端每日實(shí)戰(zhàn):33# 視頻演示如何用純 CSS 創(chuàng)作牛奶文字變換效果
CSS Variables學(xué)習(xí)筆記
用JS寫(xiě)一個(gè)計(jì)算器(兼容手機(jī)端)
PHP常用操作類實(shí)現(xiàn)——通信數(shù)據(jù)封裝類