這篇文章主要介紹“總結(jié)DOM的知識點”,在日常操作中,相信很多人在總結(jié)DOM的知識點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”總結(jié)DOM的知識點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
東洲ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
什么是: 專門操作網(wǎng)頁內(nèi)容的API標準——w3c
為什么: 統(tǒng)一不同瀏覽器操作網(wǎng)頁內(nèi)容的API標準
優(yōu)點: 幾乎所有瀏覽器100%兼容
什么是: 網(wǎng)頁中所有內(nèi)容在內(nèi)存中都是保存在一棵樹形結(jié)構(gòu)中
網(wǎng)頁中每項內(nèi)容(元素,文本,屬性,注釋...),都是樹上的一個節(jié)點對象。
唯一的樹根節(jié)點: document
為什么: 樹形結(jié)構(gòu)是最好的保存上下級包含關(guān)系的結(jié)構(gòu)
節(jié)點對象: Node
網(wǎng)頁中每項內(nèi)容都是DOM樹上的一個節(jié)點對象:
所有節(jié)點都有的三個屬性:
nodeType: 節(jié)點類型
前端學習圈:767273102 ,從最基礎(chǔ)的HTML+CSS+JavaScript。jQuery,Ajax,node,angular等到移動端HTML5的項目實戰(zhàn)的資料都有整理
何時: 只要判斷節(jié)點的類型時 包括: document 9 element 1 attribute 2 text 3 問題: 無法進一步區(qū)分元素的標簽名
nodeName: 節(jié)點名稱
何時: 只要進一步判斷元素的標簽名時 ——可代替nodeType 包括: document #document element 全大寫標簽名 attribute 屬性名——不常用! text #text
nodeValue: 節(jié)點值 ——不常用
document null element null attribute 屬性值 text 文本內(nèi)容
1.不需要查找可直接獲得節(jié)點:
document.documentElement html
document.head head
document.body body
document.forms[id/i] form
2.按節(jié)點間關(guān)系查找:
何時: 如果已經(jīng)獲得一個節(jié)點了。想找周圍節(jié)點時。
包括: 2種樹:
節(jié)點樹: 包含網(wǎng)頁中所有內(nèi)容的完整樹結(jié)構(gòu)
2大類關(guān)系:
1.父子: 4種:
elem.parentNode elem的父節(jié)點
elem.childNodes elem的直接子節(jié)點
elem.firstChild elem下的第一個直接子節(jié)點
elem.lastChild elem下的最后一個直接子節(jié)點
2.兄弟: 2種:
elem.previousSibling elem的前一個兄弟元素
elem.nextSibling elem的后一個兄弟元素
問題: 受看不見的空字符的干擾!
2.元素樹: 僅包含元素節(jié)點的樹結(jié)構(gòu)
2大類關(guān)系:
父子: 4種:
elem.parentElement elem的父元素
elem.children elem的直接子元素
elem.firstElementChild elem下的第一個直接子元素
elem.lastElementChild elem下的最后一個直接子元素
2.兄弟: 2種:
elem.previousElementSibling elem的前一個兄弟元素 elem.nextElementSibling elem的后一個兄弟元素
今后只要用DOM操作網(wǎng)頁內(nèi)容,都用元素樹
說明: 元素樹不是一棵新樹,其實只是節(jié)點樹的一個子集
childNodes和children: 動態(tài)集合(live collection) 遍歷指定父元素下的所有后代元素: 2種: 2.循環(huán)調(diào)用迭代器,獲得下一個節(jié)點對象: 3.按HTML查找: 4種: 2.按標簽名查找: 3.按name查找: 4.按class查找: 1.僅查找一個符合條件的: 2.查找多個符合條件的元素: 鄙視: 按HTML查找和按選擇器查找的差別: 總結(jié): 今后,只要一個條件即可找到想要的元素,首選按HTML查找 jQuery中就是這么選擇的 內(nèi)容: .innerHTML .textContent .value 2.HTML DOM: 專門操作HTML內(nèi)容的API 2.狀態(tài)屬性: disabled selected checked 如何: 2套: 固定用法: 用自定義擴展屬性代替其它選擇器,為元素綁定事件 1.內(nèi)聯(lián)樣式: 2.內(nèi)部/外部: 3步: 2.獲得樣式表對象中的cssRule 3.獲得cssRule中的style對象的css屬性 問題: 用elem.style.css屬性一句話只能修改一個css屬性 解決: 用class批量應用樣式 在css中準備好各種class 用程序,在對應情況下,選擇對應的class應用! 添加: 3步: 創(chuàng)建空元素 2.設(shè)置必要屬性 優(yōu)化: 盡量減少操作DOM樹的次數(shù), 從而減少重排重繪 css -> cssRules 如果同時添加父元素和子元素時,應先在內(nèi)存中,將所有子元素添加到父元素中, 優(yōu)化: 盡量減少操作DOM樹的次數(shù) 刪除: parent.removeChild(child) Image: 創(chuàng)建: var img=new Image(); Select: 代表頁面上一個select元素 .options 獲得當前select下所有option的集合 .length => .options.length 方法: .add(option) 追加一個option Option: 代表select下一個option元素 Table: 代表一個table元素 刪除行分組: table.deleteTHead() 獲取行分組: table.tHead table.tFoot table.tBodies[i] 刪除行: 行分組.deleteRow(i) ——不常用! 獲取行: 行分組.rows[i] 刪除格: tr.deleteCell(i) Form: 代表一個form元素 方法: .submit() 代替submit按鈕,在程序中實現(xiàn)手動提交表單 表單元素: 方法: .focus 讓當前表單元素獲得焦點 到此,關(guān)于“總結(jié)DOM的知識點”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
什么是: 不實際存儲屬性值,每次訪問集合都重新查找DOM樹
優(yōu): 首次查找,效率高! 因為不用返回完整的屬性。
缺: 每次訪問集合,都會重新查找DOM樹,降低效率
遍歷:
不好: for(var i=0;i
1.遞歸: 2步:
1.定義函數(shù)僅遍歷指定父元素下的所有直接子元素
2.對每個直接子節(jié)點調(diào)用和父節(jié)點完全相同的操作
深度優(yōu)先: 當一個節(jié)點同時擁有子節(jié)點和兄弟節(jié)點時,總是優(yōu)先遍歷子節(jié)點。
所有子節(jié)點遍歷完,才返回遍歷兄弟節(jié)點。
2.循環(huán): 2步:
1.定義迭代器: 迭代器: 可以依次獲得每個后代元素節(jié)點的 專門對象
如何:
創(chuàng)建: var iterator=document.createNodeIterator(
parent, NodeFilter.SHOW_ELEMENT, null, false
);
var curr=iterator.nextNode()
內(nèi)置深度優(yōu)先遍歷的算法
如果curr返回null,說明遍歷結(jié)束
1.按id查找:var elem=document.getElementById("id")
返回值: 一個元素
如果找不到返回null!
強調(diào): 1. 只能在document上調(diào)用
var elems=parent.getElementsByTagName("標簽名")
返回值: 多個元素的集合
如果找不到返回空集合
強調(diào): 1\. 可在任意父元素上調(diào)用
2\. 不但找直接子元素,且在所有后代中查找
var elems=document.getElementsByName("name")
返回值: 多個元素的集合
如果找不到返回空集合
強調(diào): 只能在document上調(diào)用
var elems=parent.getElementsByClassName("class")
返回值: 多個元素的集合
如果找不到返回空集合
強調(diào): 1.可在任意父元素上調(diào)用
2.不但找直接子元素,且在所有后代中查找
3.只要元素的一個class名匹配,就能找到該元素
強調(diào): 返回的集合都是動態(tài)集合
問題: 每次只能按一個條件查找
當查找條件復雜時,步驟很繁瑣
解決: 用選擇器查找:
4.用選擇器查找:
var elem=parent.querySelector("選擇器")
返回值: 一個元素
如果找不到,返回null
var elems=parent.querySelectorAll("選擇器")
返回值: 多個元素的集合
如果找不到返回空集合
返回非動態(tài)集合: 實際存儲屬性值,即使反復訪問集合,
也不會導致反復查找DOM樹
強調(diào): 1\. 可在任何父元素上調(diào)用
2\. 選擇器只要相對于當前父元素內(nèi)部即可
3\. 選擇器的兼容性,受制于當前瀏覽器的兼容性
1.返回值: 按HTML查找返回動態(tài)集合
按選擇器查找返回非動態(tài)集合
2.效率: 首次查找: 按HTML查找效率高
按選擇器查找效率低
3.易用性: 按HTML查找繁瑣
按選擇器查找簡單
只要查找條件復雜,都選按選擇器查找
5.修改:
屬性: 3種:
1.HTML標準屬性: 2種:
1.核心DOM: 最初的DOM API,要求支持所有結(jié)構(gòu)化文檔 優(yōu): 幾乎萬能 缺: 繁瑣
獲取屬性節(jié)點: var attrNode=elem.attributes[i]
獲取屬性值: attrNode.value
其實可以一步: var value=elem.getAttribute("屬性名")
修改屬性值: elem.setAttribute("屬性名","值")
移除屬性: elem.removeAttribute("屬性名")
判斷是否包含指定屬性: elem.hasAttribute("屬性名")
對核心DOM 常用API的簡化
優(yōu): 簡單 缺: 不是萬能
簡化: HTML DOM提前將所有標準屬性,封裝在了元素對象上,可用.直接訪問.
比如:
獲取屬性值: elem.屬性名
修改屬性值: elem.屬性名="值"
移除屬性: elem.屬性名=""
判斷是否包含指定屬性: elem.屬性名!==""
特例: class屬性:
ES的對象中已經(jīng)先入為主的包含了內(nèi)部屬性class,用來記錄對象創(chuàng)建時的類型名。
HTML的class屬性就無法同時存在
所以: DOM: html的class屬性,更名為className
1.不能用核心DOM修改: 因為值是bool類型
2.只能用HTML DOM,打.修改
3.自定義擴展屬性:
何時: 2種: 1\. 在元素上保存自定義數(shù)據(jù)
2\. 代替其他選擇器,用來查找元素綁定事件
不能用HTML DOM訪問, 因為不是標準屬性,未被提前封裝在DOM元素對象中
1. 普通屬性名+核心DOM
2. HTML5:
定義屬性時: data-屬性名="值"
獲取或修改屬性值: elem.dataset.屬性名
為什么:
id: 唯一
class: 經(jīng)常變化
elem: 做一種效果,可能使用任何元素
解決: 今后,只要給元素綁定事件時,都要先為元素添加自定義擴展屬性,
再用自定義擴展屬性查找元素,綁定事件
優(yōu): 沒有個數(shù)限制, 不會受樣式影響而變化,不受元素限制
如何:
定義: data-屬性名="值"
查找: 只能用屬性選擇器查找:[data-屬性名=值]
6.樣式: 2種:
修改: elem.style.css屬性名
強調(diào): 1. css屬性名都要去橫線變駝峰
2.長度數(shù)值必須加px單位
獲取:
問題: 不能用elem.style.css屬性名
原因: elem.style僅包含內(nèi)聯(lián)樣式! 無法獲得內(nèi)部或外部樣式表中的樣式
解決: 獲取計算后的樣式!
計算后的樣式: 最終應用到元素上的所有樣式的集合
且將相對值換算為絕對值
何時: 只要獲取樣式時,都要獲取計算后的樣式
如何: 2步:
1. 獲得計算后的style對象:
var style=getComputedStyle(elem);
2. 從style中獲得css屬性值
var value=style.css屬性值
強調(diào): getComputedStyle獲得樣式都是只讀!
1.獲得樣式表對象:var sheet=document.styleSheets[i];
什么是cssRule: 樣式表中每個{}就是一個cssRule
如何獲得: var rule=sheet.cssRules[i]
var value=rule.style.css屬性
如果同時修改多個屬性,代碼會很繁瑣
如何: 2步:7.添加:
var a=document.createElement("a");
a.href="
http://tmooc.cn
";
a.innerHTML="go to tmooc";
3.將新元素添加到DOM樹:3種api:
parent.appendChild(a) 將a追加到指定父元素下末尾
parent.insertBefore(a, child) 將a插入到指定父元素下的現(xiàn)有子元素之前
parent.replaceChild(a, child) 用a替換指定父元素下的現(xiàn)有子元素
為什么:
HTML頁面加載過程:
html -> DOM Tree ↓
Render Tree -> ***layout -> paint
↑
如何:
再最后一次性將父元素添加到頁面上8.刪除:
為什么: 減少重排重繪
如何: 2種:
1.如果同時添加父元素和子元素,則應該現(xiàn)在內(nèi)存中,將子元素添加到父元素,再最后將父元素一次性整體添加到DOM Tree
2.如果父元素已經(jīng)在頁面上了,要添加多個平級子元素,則應該使用文檔片段:什么是文檔片段: 內(nèi)存中臨時存儲多個子元素的虛擬父元素
何時: 只要向網(wǎng)頁中同時添加多個平級子元素時,都可用文檔片段
如何: 3步:
1.創(chuàng)建文檔片段
2.將子元素添加到文檔片段
3.將文檔片段整體添加到DOM 樹
通常: child.parentNode.removeChild(child)
9.HTML DOM常用對象:
屬性:
.selectedIndex 獲得當前select選中的option的下標位置
.value 獲得select中選中的option的值如果選中的option沒有value屬性,則用innerHTML代替
.options.length 獲得select下所有option的個數(shù)
.options.length=0
清空所有option .length=0
問題: .add不支持文檔片段
.remove(i) 移除i位置的option
創(chuàng)建: var opt=new Option(text,value)
屬性: .text .value .index
管著行分組:
創(chuàng)建行分組: var thead=table.createTHead() var tbody=table.createTBody()
var tfoot=table.createTFoot()
table.deleteTFoot()
行分組: 管著行:
添加行: var tr=行分組.insertRow(i) 在i位置插入一個新行
固定套路: 1\. 在末尾追加新行: .insertRow()
2\. 在開頭插入新行: .insertRow(0)
問題: i要求是在當前行分組內(nèi)的相對下標位置
無法自動獲得
應換為: table.deleteRow(tr.rowIndex)
tr.rowIndex可自動獲得當前行在整個table內(nèi)的位置
行: 管著格
添加格: var td=tr.insertCell(i)固定用法: 行末尾追加一個格: tr.insertCell()
說明: 只能創(chuàng)建td,不能創(chuàng)建th
獲取格: tr.cells[i]
獲取: var form=document.forms[i/id]
屬性: .elements 獲得表單中所有表單元素的集合 .elements.length 獲得表單中,表單元素的個數(shù)
.length => .elements.length
獲取: form.elements[i/id/name]更簡化: form.name
分享標題:總結(jié)DOM的知識點
當前網(wǎng)址:http://weahome.cn/article/jgdccd.html