針對JS高級程序設計這本書,主要是理解概念,大部分要點源自書內。寫這個主要是當個筆記加總結
存在的問題請你們多多指正!
由於DOM這方面的對象方法操做性都特別強,可是邏輯很簡單,因此就沒有涉及到實際的代碼。
另外這篇不包括DOM2,DOM3的內容javascript
文檔對象模型,針對HTML和XML文檔的一個API。描繪了一個層次化的結點樹,循序開發人員添加,移除修改頁面上的一部分。html
DOM把文檔描繪成一個由多層節點構成的結構。節點有不一樣的類型。節點之間的關係構成了層次。java
文檔節點是每一個文檔的根節點(Document節點),html節點被稱爲文檔元素。文檔元素是最外層的元素,文檔中的其餘全部元素都包含在文檔元素中。HTML頁面中,文檔元素始終都是html元素。node
DOM1級定義了一個node結構,該結構將由DOM中的全部節點類型實現。這個node接口在javascript中是做爲Node類型實現的。除了ie之外全部的瀏覽器均可以訪問到這個類型。瀏覽器
javascript中的全部節點類型都繼承自node類型,所以節點們都共享者相同的基本屬性和方法。app
每一個節點都有一個nodetype屬性,用於表現節點的類型,節點類型有在Node類型的中定義的12個數值來表示,任何節點都必須是其中之一。dom
NodeType Named Constant 1 ELEMENT_NODE 2 ATTRIBUTE_NODE 3 TEXT_NODE 4 CDATA_SECTION_NODE 5 ENTITY_REFERENCE_NODE 6 ENTITY_NODE 7 PROCESSING_INSTRUCTION_NODE 8 COMMENT_NODE 9 DOCUMENT_NODE 10 DOCUMENT_TYPE_NODE 11 DOCUMENT_FRAGMENT_NODE 12 NOTATION_NODE
節點類型 nodeName 返回 nodeValue返回 1 Element 元素名 null 2 Attr 屬性名稱 屬性值 3 Text text 節點的內容 4 CDATASection cdata-section 節點的內容 5 EntityReference 實體引用名稱 null 6 Entity 實體名稱 null 7 ProcessingInstruction target 節點的內容 8 Comment comment 註釋文本 9 Document document null 10 DocumentType 文檔類型名稱 null 11 DocumentFragment document 片斷 null 12 Notation 符號名稱 null
節點關係的屬性編碼
- childNodes
- firstChild
- lastChild
- parentNodes
- nextSibling
- previousSibling
- owenerDocement
- hasChildNodes
其中childNodes會返回一個NodeList的動態對象,雖然不是Array類型的實例,一樣也能夠用item()方法,也有length屬性。這個NodeList的列表中每一個節點都是彼此的兄弟節點,能夠調用nextSibling,previousSibling屬性訪問他們的兄弟節點。設計
ownerDocument是直接頂到頂,去找頂端的文檔節點。code
節點操做的方法:
- appendChild()
- 一個參數,你新加入的節點,默認放到最後
- 若是這個新加入的節點在這個父節點中存在,則將她從原來位置刪除而後添加到末尾
- insertBefore()
- 兩個參數,要插入的節點和做參照的節點
- 被插入的節點會變成參照節點的前面的同胞節點
- 若參照物是null,則和appendChild同樣
- 第二個參數能夠是element.firstChild或者element.lastChild,這樣能夠插入element節點的首節點或者最後一個節點的前一個節點
- replaceChild()
- 兩個參數,要插入的節點和被替換的節點
- 返回值是被替換的節點,並從文檔中剔除
- cloneNode()
- 參數只有一個布爾值
- true表示深層次複製,複製子節點樹
- false表示淺層複製,只複製節點自己,複製後返回接點歸文檔全部,但她沒有父節點,是孤兒,能夠經過appendChild(),insertBefore(),replaceChild()等把他插進去
- 他不會複製節點的JS屬性和事件,IE會出BUG,因此最好複製以前移除BUG
document對象表示整個HTML界面,並且document對象是window對象的一個屬性,因此能夠直接調用
只有一個html元素
- childNodes[0],firstChild,dicumentElement都表示一個值,指向html元素
document的屬性
- documentElement 指向html元素
- body 指向body元素
- doctype 指向doctype屬性
document關於自身信息的屬性:
- title 包含着title元素中的文本
- URL 完整的URL
- domain 網頁的域名,三個關於URL的屬性只有他能夠修改,可是不能設置爲URL不包含的域
- refierrer 連接到當前頁面的URL ,沒有則返回NULL
取得元素的對象方法:
- getElementById()
- 只接受一個參數,區分大小寫
- 若是有多個同樣的ID則只返回第一個
- getElementByTagName()
- 接受一個參數,元素的標籤名
- 在HTML中返回的是HTMLCollection對象,也是一個動態集合,和NodeList很是類似,具備item()方法
- 在參數爲*時返回全部的標籤
- HTMLCollection對象
- item() 能夠運用[]的方法在其中加入name屬性的字符串返回那一項
- nameItem() 參數能夠添加其中的name而後返回HTMLCollection中的name爲參數的那一項
- getElementByName()
- 只能找到帶有name特性的子節點
- 一樣返回的事HTMLCollection對象
- nameItem()只返回第一個HTMLCollection對象,由於HTMLCollection對象裏面的項的name都相同
document還有一些特殊的集合,這些集合都是HTMLCollection對象
- anchors
- applets
- forms
- images
- links
- write()
- writelen()
- 上兩個方法都是接受一個字符串參數,即要寫入到輸出流中的文本。ln回家一個換行符,內容都原樣加入
- 加入的時候要當心,由於自己JS腳本就帶了對script標籤,因此轉義的時候容易把JS自帶的開頭和算到一塊兒,因此就結束了。因此要變成</script>
- open()
- close()
Element類型用來表示文檔中的元素,提供了對元素標籤名、子節點及特性的訪問
- nodeName屬性
- tagName屬性
- 上兩個會返回元素的標籤名,他倆返回的是相等的.tagName主要是爲了清晰地表達。
HTML元素都有HTMLElement類型表示,不是經過這個類型,也是經過他的子類型來表示。HTMLElement類型直接繼承Element並添加了一些屬性,這些在HTML文檔上都有體現
- id
- title
- lang 元素內容的語言代碼,較少使用
- dir 語言的方向 ltr 或者 rtl
- className
三個主要方法
- getAttribute()
- 傳遞給方法的特姓名與是實際的特姓名應該是一致的,class不要填className
- 一樣能夠取到自定義特性
- 特性不須要區分大小寫
- 自定義特性根據H5規定須要加data-前綴
- 訪問style特性值會返回CSS文本,而直接訪問特性值得屬性來訪問會返回一個對象
- 訪問onclick這類時間是會返回相應代碼的字符串,而直接訪問.屬性這樣的會被賦值
- setAttribute()
- 接受兩個參數,特姓名和特性值
- 若是特性名已存在,則這個操做將會覆蓋原來的特性值
- 能夠設置自定義屬性,可是特姓名會被轉爲小寫
- removeAttribute()
- 傳一個參數那就是特姓名,執行完了就會刪除他
Element類型是使用attributes屬性的惟一一個DOM節點類型。attritubutes屬性中包含一個NameNodeMap ,與NodeList相似,也是一個動態集合。下面是attributes對象的方法
- getNameItem():返回nodeName屬性等於參數的節點
- removeNamedItem() : 刪除列表中nodeName等於參數的節點
- setNameItem(node) : 向列表裏添加節點,一節點的nodeName屬性爲索引
- item(pos) :返回位於數字pos位置處的節點
這個attributes屬性費老勁了,除了遍歷能用上,感受別的一點用不上啊,直接getAttributes(), setAttribute(), removeAttribute() 就完事了,你在這墨跡啥呢。
function outputAttritubes(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 pairs.push(attrName + '=\''+attrValue + '\'') }
- document.creatElement()
- 裏面能夠放標籤元素,返回的就是一個空的元素,在ie裏也能夠放一些HTML語言,直接建立出來
在除了IE裏,文本節點也算上,因此空格也算是文本節點。因此在chilNodes屬性中就不會顯示正確的節點。若是須要對element類型的節點進行操做的話最好添加一個element.childNodes[i].nodeType == 1
來判斷。不然會默認算上文本節點。
文本節點由Text類型表示,包含的是能夠按照字面解釋的純文本內容。純文本中能夠包含轉移後HTML字符,可是不能包含HTML代碼,TEXT節點的屬性:
- nodeValue
- data
- 均可以訪問text節點中包含的文本。
- length:保存着字符的數目
下面的方法能夠對文本節點進行操做
- appendDate(text):將text添加到文章的末尾
- deleteDate(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爲止的字符串
- doucument.createTextNode()
- 參數是要插入裏面的文本,能夠按照HTML格式進行編碼
- 若是一個元素中有多個文本子節點,則讓他們鏈接起來,中間沒有空格
- normalize():在父元素中調用,則會將全部文本節點合併成一個及誒單,節點的nodeValue 是每一個子節點相加
- splitText() 方法 將從第參數個開始分割,而後返回一個新的文本節點包含剩下的內容,該文本節點與原來節點的parentNode相同