摘要:在瀏覽器中,對象是繼承自類型的一個實例,表示整個頁面。一致性檢測屬性提供相應信息和功能的對象,與瀏覽器對的實現直接對應。在中,標簽名始終都以全部大寫表示而在有時包括,標簽名始終與源代碼中的保持一致。設置的特性名統一轉為小寫。
簡介
DOM描述了一個層次化的節點樹,允許開發人員添加、移除和修改頁面。
節點根據 W3C 的 HTML DOM 標準,HTML 文檔中的所有內容都是節點:
整個文檔是一個文檔節點
每個 HTML 元素是元素節點
HTML 元素內的文本是文本節點
每個 HTML 屬性是屬性節點
注釋是注釋節點
每個節點都有一個nodeType屬性,用于表明節點的類型。并不是所有節點類型都受到Web瀏覽器支持,最常用的事元素和文本節點。
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);
因為IE沒有公開Node類型的構造函數,所以確定節點類型如下:
// nodeType 是只讀的 if (someNode.nodeType == 1) { alert("Node is an element"); }Node類型
1、nodeName 和 nodeValue 屬性
// 使用前先檢查節點類型,確認是否是一個元素,對于元素節點 // nodeName 保存的是標簽名(節點的名稱),nodeValue = null (節點的值); if (someNode.nodeType == 1) { value = someNode.nodeName; // nodeName的值是元素的標簽名 }
2、 節點關系
每個節點都有一個 childNodes 屬性,保存著一個 NodeList 對象。
是一個數組對象,保存一組有序的節點,可以通過位置訪問節點。有length屬性,但不是數組實例。
基于DOM結構動態執行查詢結果,結構的變化能夠自動反應著NodeList對象中。
可以用 item() 方法訪問其中的節點。
var firstChild = someNode.childNodes[0]; var secondChild = someNode.childNodes.item(1); // 將NodeList對象轉化為數組 function convertToArray(nodes) { var array = null; try { array = Array.prototype.slice.call(node,0); // 針對非 IE 瀏覽器 } catch { array = new Array(); for (var i=0, len=nodes.length; I < len; i++) { array.push(nodes[I]); } } return array; }
parentNode 屬性:指向文檔樹中的父節點
父節點的 firstChild 和 lastChild 屬性指向第一個和最后一個
previousSibling: 上一個同胞節點
nextSibling: 下一個同胞節點
hasChildNodes(): 節點包含一個或多個子節點返回 true
ownerDocument: 指向表示整個文檔的文檔節點
document.documentElement - 全部文檔
document.body - 文檔的主體
3、操作節點
以下方法都需要取得父節點(使用 parentNode 屬性)
appendChild(): 向 childNodes 列表末尾添加一個節點。如果已存在,從原來位置移動到新位置
insertBefore(): 插入節點,接受兩個參數,要出入的節點和參考節點(誰的前面)
replaceChild(): 替換節點,接受兩個參數,要插入的節點和要替換的節點
removeChild(): 移除節點
以下兩個方法是所有類型的節點都有
cloneNode(): 創建節點的副本,參數為true,復制節點及整個子節點樹,false只復制節點本身,沒有父節點,需要用上面方法添加到文檔中
normalize(): 處理文檔樹中的文本節點。可能會出現文本節點不包含文本,或者接連出現兩個文本節點。調用這方法,如果找到空文本,則刪除;找到相鄰文本節點,則合并為一個
Document 類型JavaScript通過 Document 類型表示文檔。在瀏覽器中,document 對象是 HTMLDocument(繼承自 Document 類型)的一個實例,表示整個HTML頁面。而且 document 也是 window 對象的一個屬性,因此可以將其作為全局對象來訪問。通過這個文檔對象,不僅可以取得與頁面有關的信息,而且還能操作頁面的外觀及其底層結構。
nodeName 的值為 “#document”;
nodeValue 的值為 null;
parentNode 的值為 null;
ownerDocument 的值為 null;
其子節點可能是一個 DocumentType(最多一個)、Element(最多一個)、ProcessingInstruction 或 Comment。
1、文檔的子節點
內置的訪問子節點的快捷方式:
documentElement 屬性:始終指向HTML頁面的元素
childNodes 列表訪問文檔元素
作為內置的HTMLDocument對象,document 對象有一個 body 屬性,直接指向
元素。// 所有瀏覽器都支持 var html = document.documentElement; // 取得對對引用 var body = document.body; // 取得對對引用
用不著在 document 對象上調用 appendChild()、removeChild()和replaceChild()方法,因為文檔類型(如果存在)是只讀的,而且它只能有一個元素子節點(通常早存在)。
2、文檔信息
document 對象還有一些標準的Document對象所沒有的屬性。這些對象表現的網頁的一些信息。
// 取的文檔標題 var originalTitle = document.title; // 設置文檔標題 document.title = "New page title"; // 取得完成的URL var url = document.URL; // 取的域名 var domain = document.domain; // 取的來源頁面的URL var referrer = document.referrer;
只有 domain 可以設置,如果包含子域名,不能設置為URL中不包含的域。
由于跨域安全限制,來自不同子域的頁面無法通過 Javascript 通信,可以將每個頁面的document.domain設置為相同值,就可以互相訪問對方包含的JavaScript對象了。
如果域名一開始是“松散的”,就不能設為“緊繃的”,設為“wrox.com”,就不能設為“p2p.wrox.com”。
3、查找元素
取得特定的某個或某組元素的引用,然后執行一些操作。
getElementById(): 要獲取的元素 id,返回第一個出現的,如果沒找到返回 null
getElementsByTagName(): 參數(要取得元素的標簽名),返回包含零個或多個元素的 NodeList。在HTML文檔中,返回一個 HTMLCollection 對象,作為動態集合。傳入“*”,取得文檔中的所有元素
getElementsByName(): 返回給定 name 特性的所有元素。最常用取得單選按鈕(單選按鈕必須具有相同的 name 特性)
// 取得頁面中所有的元素,并返回一個HTMLCollection var images = document.getElementsByTagName("img"); alert(images.length); // 圖像的數量 alert(images[0].src); // 第一個圖像元素的src特性 alert(images.item(0).src); // 第一個圖像元素的src特性
HMTLCollection 對象
有一個 namedItem() 方法,可以通過元素的 name 特性取得集合中的項
支持按名稱訪問項
var myImage = images.namedItem("myImage"); var myImage = images["myImage"];
4、特殊集合
除了屬性和方法,document 對象還有一些特殊的集合,都是 HTMLCollection對象,
document.anchors ,包含文檔中所有帶 name 特性的 元素;
document.applets ,所有的
document.forms ,文檔中所有的
document.images ,文檔中所有的 元素;
document.links ,文檔中所有帶 href 特性的 元素。
5、DOM一致性檢測
document.implementation 屬性提供相應信息和功能的對象,與瀏覽器對 DOM 的實現直接對應。
規定一個方法:hasFeature(),接受兩個參數:要檢測的 DOM 功能名稱及版本號
var hasXmlDom = document.implementation.hasFeature("XML","1.0");
6、文檔寫入
write(): 原樣寫入
writeln(): 在字符串的末尾添加一個換行符(n)
open(): 打開網頁的輸出流
close(): 關閉網頁的輸出流
// 用 write() 和 written() 動態地包含外部資源document.write() Example ");
嚴格型 XHTML 文檔不支持文檔寫入。
Element 類型Element 類型用于表現 XML 或 HTML 元素,提供了對元素標簽名、字節點及特性的訪問。
nodeType 的值為 1;
nodeName 的值為元素的標簽名;
nodeValue 的值為 null;
parentNode 可能是 Document 或 Element;
其子節點可能是 Element、Text、Comment、ProcessingInstruction、CDATASection 或 EntityReference;
訪問元素標簽名,可以是使用 nodeName 屬性或者 tagName 屬性。
var div = document.getElementById("myDiv"); alert(div.tagName); // "DIV" alert(div.tagName == div.nodeName); // true
在 HTML 中,標簽名始終都以全部大寫表示;而在 XML(有時包括 XHTML),標簽名始終與源代碼中的保持一致。
if (element.tagName.toLowerCase() == "div") { // 適用于任何文檔 // ... }
1、HTML 元素
所有的 HTML 元素都由 HTMLElement 類型表示。每個 HTML 元素都存在的下列標準特性。
id,元素中文檔中的唯一標識符
title,有關元素的附加說明信息,一般通過工具提示條現實出來
lang,元素內容的語言代碼
dir,語言的方向,值為“ltr”(左到右),或“rtl”(右到左)
className,與元素的 class 特性對應,即為元素指定的CSS類。(是 ECMAScript 的保留字)
// 上述這些屬性都可以用來取得或修改相應的特性值 var div = document.getElementById("myDiv"); alert(div.id); div.id = "someOtherId"; alert(div.className); div.className = "ft";
2、取得特性
每個元素都有一或多個特性,這些特性的用途是給出相應元素或其內容的附加信息。
getAttribute(): 取得特性,傳遞的特性名與實際的特性名相同,可以是自定義的特性。
setAttribute(): 設置特性。設置的特性名統一轉為小寫。
removeAttribute(): 不僅會清除特性值,也會從元素中完成刪除特性。
有兩類特殊的特性:
style: 通過getAttribute()訪問返回特性值中包含的文本,通過屬性來訪問返回一個對象。
onclick: 通過 getAttribute()返回相應代碼的字符串,訪問屬性時返回函數。
div.setAttribute("id","someOtherId");
3、attributes 屬性
attributes 屬性包含一系列節點,每個節點的 nodeName 就是特性的名稱,而節點的 nodeValue 就是特性的值。
包含一個 NamedNodeMap,“動態”集合。
getNamedItem():返回 nodeName 等于 name 的節點
removeNamedItem():從列表中移除 nodeName 屬性等于 name 的節點
setNamedItem():向類表添加節點,以節點的 nodeName 屬性為索引
item(pos):返回位于數字pos 的節點
var id = element.attributes.getNamedItem("id").nodeValue; var id = element.attributes["id"].nodeValue;
遍歷元素的特性,attributes 屬性可以派上用場。
function outputAttributes(element) { var pairs = new Array(), attrName, attrValue, y, len; for(y = 0, len = element.attributes.length; y < len; y++) { attrName = element.attributes[y].nodeName; attrValue = element.attributes[y].nodeValue; if (element.attributes[y].specified) { pairs.push(attrName + "="" + attrValue + """); } } return pairs.join(" "); } // attributes 對象的中的特性,不同瀏覽器返回的順序不同 // IE7 及更早版本會返回 HTML 元素中所有可能的特性,包括沒有指定的特性。每個特性節點都有一個 specified 的屬性,true:在 HTML 中指定來相應特性,要么可以通過 setAttribute() 方法設置了該特性。
4、創建元素
// 接受一個參數,即要創建元素的標簽名 var div = document.createElement("div"); // 也為新元素設置了 ownerDocument 屬性,還可以操作元素的特性,添加更多的子節點 div.id = "myNewDiv"; div.className = "box"; // 新元素添加到文檔樹中 appendChild()、insertBefore()、replaceChild() document.body.appendChild(div);
在 IE 中可以另一種方法,傳入完整的元素標簽
var div = document.createElement("");
5、元素的子節點
不同瀏覽器看待節點是不同的。
如果要通過 childNodes 屬性遍歷子節點,不要忘了瀏覽器之間的區別,通常先檢查一下 nodeType 屬性
for (var y = 0, len = element.childNodes.length; y < len; y++) { // 表示是元素節點 if (element.childNodes[y].nodeType == 1) { // ... } }
通過特定的標簽名取得子節點或后代節點
var ul = document.getElementById("myList"); var items = ul.getElementsByTagName("li");Text 類型
文本節點由 Text 類型表示,包含純文本內容,即包含轉義后的 HTML 字符,但不包含 HTML 代碼。
nodeType 的值為 3;
nodeName 的值為 “#text”;
nodeValue 的值為節點所包含的文本;
parentNode 是一個 Element;
不支持(沒有)子節點;
通過 nodeValue 屬性或 data 屬性訪問 Text 節點包含的文本。
appendData(text):將 text 添加到節點的末尾。
deleteData(offset, count):從 offset 指定的位置開始刪除 count 個子符。
insertData(offset, text):在 offset 指定的位置插入 text。
replaceData(offset, count, text):用 text 替換從 offset 指定的位置開始到 offset + count 為止的文本。
splitText(offset):從 offset 指定的位置將當前文本節點分為兩個文本節點。
substringData(offset, count):提取從 offset 指定的位置開始到 offset + count 為止的字符串。
在默認情況下,每個可以包含內容的元素最多只能有一個文本節點,而且必須確實有內容存在。
// 沒有內容,也就沒有文本節點 // 有空格,因而有一個文本節點// 有內容,因而有一個文本節點hello world!// 訪問,先取得引用 var textNode = div.firstChild; // 獲取 div.childNodes[0] textNode.nodeValue = "some other message";
在修改文本節點時,此時的字符串會經 HTML 編碼(轉義)。
1、創建文本節點
document.createTextNode():創建文本節點,接受一個參數,要插入的文本,也會進行轉義。
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);
如果兩個文本節點是相鄰的同胞節點,那么這兩個節點中的文本會連起來顯示,中間不會有空格。
2、規范化文本節點
normalize():在一個包含兩個或多個文本節點的父元素上調用,則會將所有文本節點合并成一個節點。
Comment 類型nodeType 的值為 8;
nodeName 的值為 “#comment”;
nodeValue 的值是注釋的內容;
parentNode 可能是 Document 或 Element;
不支持(沒有)子節點。
和 Text 類型相似,可以通過 nodeValue 或 data 屬性來取得注釋的內容。
// 通過父節點訪問 var div = document.getElementById("myDiv"); var comment = div.firstChild; alert(comment.data);
使用 document.createComment() 為其傳遞注釋文本也可以創建注釋節點。
var comment = document.createComment("A comment");
如果要訪問注釋節點,一定要保證他們是 元素的后代。
DocumentFragment 類型(文檔片段)在文檔中沒有對應的標記;
nodeType 的值為 11;
nodeName 的值為 “#document-fragment”;
nodeValue 的值為 null;
parentNode 的值為 null;
不能把文檔片段直接添加到文檔中,但可以作為一個“倉庫”,保存將來可能添加到文檔中的節點。如果將文檔中的節點添加到文檔片段中,就會從文檔樹移除該節點,文檔片段本身不會成為文檔樹的一部分。
// 創建文檔片段 var fragment = document.createDocumentFragment(); // 為 ul 元素添加3個列表項 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);Attr 類型
元素的特性在 DOM 中以 Attr 類型來表示。特性就是存在于元素的 attributes 屬性中的節點。
nodeType 的值 2;
nodeName 的值是特性的名稱;
nodeValue 的值是特性的值;
parentNode 的值為 null;
在 HTML 中不支持子節點;
在 XML 中子節點可以是 Text 或 EntityReference。
盡管是節點,但不是 DOM 文檔樹但一部分。有3個屬性:
name:特性名稱(與 nodeName 相同);
value:特性的值(與 nodeValue 的值相同);
specified:一個布爾值,區別特性在代碼中是指定的,還是默認的。
// 創建 var attr = document.createAttribute("align"); attr.value = "left"; // 添加到元素中 element.setAttributeNode(attr);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96607.html
摘要:然而,雖然先生對無所不知,被譽為世界的愛因斯坦,但他的語言精粹并不適合初學者學習。即便如此,在后面我還是會建議把當做補充的學習資源。但目前為止,依然是學習編程的好幫手。周正則表達式,對象,事件,閱讀權威指南第,,,章。 既然你找到這篇文章來,說明你是真心想學好JavaScript的。你沒有想錯,當今如果要開發現代網站或web應用(包括互聯網創業),都要學會JavaScript。而面對泛...
摘要:持續集成單元測試是開源的一個基于的測試執行過程管理工具。表示測試套件,是一序列相關程序的測試表示單元測試,也就是測試的最小單位。 持續集成 單元測試(unit) karma Karma 是Google開源的一個基于Node.js 的 JavaScript 測試執行過程管理工具(Test Runner)。該工具可用于測試所有主流Web瀏覽器,也可集成到 CI (Continuous in...
摘要:原文鏈接恰當地學習適合第一次編程和非的程序員持續時間到周前提無需編程經驗繼續下面的課程。如果你沒有足夠的時間在周內完成全部的章節,學習時間盡力不要超過周。你還不是一個絕地武士,必須持續使用你最新學到的知識和技能,盡可能地經常持續學習和提高。 原文鏈接:How to Learn JavaScript Properly 恰當地學習 JavaScript (適合第一次編程和非 JavaSc...
摘要:最近一周一直都在折騰一些項目中常用的記錄下來,以后免去簡單的配置再去查文檔。常規入口指示應該使用哪個模塊,來作為構建其內部依賴圖的開始。把代碼轉換成,在使用語言中有介紹。擴展語法,使用下一代,在使用中有介紹。用于忽略部分文件。 最近一周一直都在折騰webpack,一些項目中常用的記錄下來,以后免去簡單的配置再去查文檔。 常規 1.入口 指示 webpack 應該使用哪個模塊,來作為構建...
摘要:當用戶滾動頁面時,合成線程會通知主線程更新頁面中最新可見部分的位圖。但是,如果主線程響應地不夠快,合成線程不會保持等待,而是馬上繪制已經生成的位圖,還沒準備好的部分用白色進行填充。 動畫做多了,自然就要考慮性能,我打算出一個系列的日志,詳細的講解一下網頁動畫性能相關的知識,如果你已經可以運用css3 canvas來做動畫,可以來參考一下。 目前我做的最復雜的動畫就是360搜索中PC端的...
閱讀 3722·2021-11-17 09:33
閱讀 2744·2021-09-22 15:12
閱讀 3351·2021-08-12 13:24
閱讀 2449·2019-08-30 11:14
閱讀 1739·2019-08-29 14:09
閱讀 1330·2019-08-26 14:01
閱讀 3067·2019-08-26 13:49
閱讀 1782·2019-08-26 12:16