DOM學(xué)習(xí)總結(jié)

一、Document

  1. document.location
    location屬性返回一個(gè)只讀對象,提供了當(dāng)前文檔的URL信息
document.location === location //true
document.location === window.location  //true

雖然location屬性返回的對象是只讀的,但是可以將URL賦值給這個(gè)屬性,網(wǎng)頁就會(huì)自動(dòng)跳轉(zhuǎn)到指定網(wǎng)址。

document.location = 'http://www.example.com';
// 等價(jià)于
document.location.;
  1. document.open()、document.close()、document.write()
    -document.open方法用于新建一個(gè)文檔,供write方法寫入內(nèi)容。它實(shí)際上等于清除當(dāng)前文檔,重新寫入內(nèi)容
  • document.close方法用于關(guān)閉open方法所新建的文檔。一旦關(guān)閉,write方法就無法寫入內(nèi)容了。
  • document.write方法用于向當(dāng)前文檔寫入內(nèi)容。只要當(dāng)前文檔還沒有用close方法關(guān)閉,它所寫入的內(nèi)容就會(huì)追加在已有內(nèi)容的后面。
document.open();
document.write("hello");
document.write("world");
document.close();

如果頁面已經(jīng)渲染完成再調(diào)用write方法,它會(huì)先調(diào)用open方法,擦除當(dāng)前文檔所有內(nèi)容,然后再寫入。
如果在頁面渲染過程中調(diào)用write方法,并不會(huì)調(diào)用open方法。
值得注意的是,雖然調(diào)用close方法之后,無法再用write方法寫入內(nèi)容,但這時(shí)當(dāng)前頁面的其他DOM節(jié)點(diǎn)還是會(huì)繼續(xù)加載。除了某些特殊情況,應(yīng)該盡量避免使用document.write這個(gè)方法。


二、創(chuàng)建元素

  1. createElement()
    createElement方法用來生成HTML元素節(jié)點(diǎn)。
var newDiv = document.createElement("div");

createElement方法的參數(shù)為元素的標(biāo)簽名,即元素節(jié)點(diǎn)的tagName屬性。如果傳入大寫的標(biāo)簽名,會(huì)被轉(zhuǎn)為小寫。如果參數(shù)帶有尖括號(hào)(即<和>)或者是null,會(huì)報(bào)錯(cuò)。

  1. createTextNode()
    createTextNode方法用來生成文本節(jié)點(diǎn),參數(shù)為所要生成的文本節(jié)點(diǎn)的內(nèi)容。
var newDiv = document.createElement("div");
var newContent = document.createTextNode("Hello");//代碼新建一個(gè)div節(jié)點(diǎn)和一個(gè)文本節(jié)點(diǎn)
  1. createDocumentFragment()
    createDocumentFragment方法生成一個(gè)DocumentFragment對象。
var docFragment = document.createDocumentFragment();

DocumentFragment對象是一個(gè)存在于內(nèi)存的DOM片段,但是不屬于當(dāng)前文檔,常常用來生成較復(fù)雜的DOM結(jié)構(gòu),然后插入當(dāng)前文檔。這樣做的好處在于,因?yàn)镈ocumentFragment不屬于當(dāng)前文檔,對它的任何改動(dòng),都不會(huì)引發(fā)網(wǎng)頁的重新渲染,比直接修改當(dāng)前文檔的DOM有更好的性能表現(xiàn)。

三、查詢元素

Element 對象可以擁有類型為元素節(jié)點(diǎn)、文本節(jié)點(diǎn)、注釋節(jié)點(diǎn)的子節(jié)點(diǎn),DOM提供了一系列的方法可以進(jìn)行元素的增、刪、改、查操作。

Element有幾個(gè)重要屬性
nodeName:元素標(biāo)簽名,還有個(gè)類似的tagName
nodeType:元素類型
className:類名
id:元素id
children:子元素列表(HTMLCollection)
childNodes:子元素列表(NodeList)
firstChild:第一個(gè)子元素
lastChild:最后一個(gè)子元素
nextSibling:下一個(gè)兄弟元素
previousSibling:上一個(gè)兄弟元素
parentNode、parentElement:父元素

  1. getElementById()
    getElementById方法返回匹配指定ID屬性的元素節(jié)點(diǎn)。如果沒有發(fā)現(xiàn)匹配的節(jié)點(diǎn),則返回null。這也是獲取一個(gè)元素最快的方法。
var elem = document.getElementById("test");
  1. getElementsByClassName()
    getElementsByClassName方法返回一個(gè)類似數(shù)組的對象(HTMLCollection類型的對象),包括了所有class名字符合指定條件的元素(搜索范圍包括本身),元素的變化實(shí)時(shí)反映在返回結(jié)果中。這個(gè)方法不僅可以在document對象上調(diào)用,也可以在任何元素節(jié)點(diǎn)上調(diào)用。
var elements = document.getElementsByClassName('tab');

getElementsByClassName方法的參數(shù),可以是多個(gè)空格分隔的class名字,返回同時(shí)具有這些節(jié)點(diǎn)的元素。

document.getElementsByClassName('red test');
  1. getElementsByTagName()
    getElementsByTagName方法返回所有指定標(biāo)簽的元素(搜索范圍包括本身)。返回值是一個(gè)HTMLCollection對象,也就是說,搜索結(jié)果是一個(gè)動(dòng)態(tài)集合,任何元素的變化都會(huì)實(shí)時(shí)反映在返回的集合中。這個(gè)方法不僅可以在document對象上調(diào)用,也可以在任何元素節(jié)點(diǎn)上調(diào)用。
var paras = document.getElementsByTagName("p");

上面代碼返回當(dāng)前文檔的所有p元素節(jié)點(diǎn)。注意,getElementsByTagName方法會(huì)將參數(shù)轉(zhuǎn)為小寫后,再進(jìn)行搜索。

  1. getElementsByName()
    getElementsByName方法用于選擇擁有name屬性的HTML元素,比如form、img、frame、embed和object,返回一個(gè)NodeList格式的對象,不會(huì)實(shí)時(shí)反映元素的變化。
// 假定有一個(gè)表單是<form name="x"></form>
var forms = document.getElementsByName("x");
forms[0].tagName // "FORM"

注意,在IE瀏覽器使用這個(gè)方法,會(huì)將沒有name屬性、但有同名id屬性的元素也返回,所以name和id屬性最好設(shè)為不一樣的值。

  1. querySelector()
    querySelector方法返回匹配指定的CSS選擇器的元素節(jié)點(diǎn)。如果有多個(gè)節(jié)點(diǎn)滿足匹配條件,則返回第一個(gè)匹配的節(jié)點(diǎn)。如果沒有發(fā)現(xiàn)匹配的節(jié)點(diǎn),則返回null。
elementList = document.querySelectorAll(selectors);

querySelector方法無法選中CSS偽元素。

  1. querySelectorAll()
    querySelectorAll方法返回匹配指定的CSS選擇器的所有節(jié)點(diǎn),返回的是NodeList類型的對象。NodeList對象不是動(dòng)態(tài)集合,所以元素節(jié)點(diǎn)的變化無法實(shí)時(shí)反映在返回結(jié)果中。
elementList = document.querySelectorAll(selectors);

querySelectorAll方法的參數(shù),可以是逗號(hào)分隔的多個(gè)CSS選擇器,返回所有匹配其中一個(gè)選擇器的元素。

var matches = document.querySelectorAll("div.note, div.alert");

上面代碼返回class屬性是note或alert的div元素。

三、修改元素

  1. appendChild()(重要)
    在元素末尾添加元素
var newDiv = document.creatElement('div')
var newContent = document.createTexNode('Hello')
newDiv.apendChild(newContent)
  1. insertBefore()
    在某個(gè)元素之前插入元素
var newDiv = document.createElement("div");
var newContent = document.createTextNode("Hello");
newDiv.insertBefore(newContent, newDiv.firstChild);
  1. replaceChild()
    replaceChild()接受兩個(gè)參數(shù):要插入的元素和要替換的元素
newDiv.replaceChild(newElement, oldElement);
  1. removeChild()##刪除元素
parentNode.removeChild(childNode);
  1. cloneNode()##clone元素
cloneNode()方法用于克隆元素,方法有一個(gè)布爾值參數(shù),傳入true的時(shí)候會(huì)深復(fù)制,也就是會(huì)復(fù)制元素及其子元素(IE還會(huì)復(fù)制其事件),false的時(shí)候只復(fù)制元素本身

四、屬性操作

  1. getAttribute()
    getAttribute()用于獲取元素的attribute值
node.getAttribute('id');
  1. createAttribute()
    createAttribute()方法生成一個(gè)新的屬性對象節(jié)點(diǎn),并返回它。
attribute = document.createAttribute(name);

createAttribute方法的參數(shù)name,是屬性的名稱。

  1. setAttribute()
    setAttribute()方法用于設(shè)置元素屬性
var node = document.getElementById('div1')
node.setAttribute('my_attribute',)

等同于

var node = document.getElementById("div1");
var a = document.createAttribute("my_attrib");
a.value = "newVal";
node.setAttributeNode(a);
  1. removeAttribute()
    removeAttribute()用于刪除元素屬性
node.removeAttribute('id');

當(dāng)然上面的方法做的事情也可以通過類操作數(shù)組屬性element.attributes來實(shí)現(xiàn)

  1. innerText和innerHTML
  • innerText
    innerText是一個(gè)可寫屬性,返回元素內(nèi)包含的文本內(nèi)容,在多層次的時(shí)候會(huì)按照元素由淺到深的順序拼接其內(nèi)容。
<div>
    <p>
        123
        <span>456</span>
    </p>
</div>//外層div的innerText返回內(nèi)容是 "123456"
  • innerHTML
    innerHTML屬性作用和innerText類似,但是不是返回元素的文本內(nèi)容,而是返回元素的HTML結(jié)構(gòu),在寫入的時(shí)候也會(huì)自動(dòng)構(gòu)建DOM
<div>
    <p>
        123
        <span>456</span>
    </p>
</div>//外層div的innerHTML返回內(nèi)容是 "<p>123<span>456</span></p>"

[http://js.jirengu.com/nukiyufufi/1/edit?html,js

區(qū)別:

  1. 修改樣式
    可修改元素的style屬性,修改結(jié)果直接反映到頁面元素
document.querySelector('p').style.color = 'red'
document.querySelector('.box').style.backgroundColor = '#ccc'
  • 獲取樣式的 getComputedStyle()
    使用getComputedStyle獲取元素計(jì)算后的樣式,不要通過 node.style.屬性 獲取
var node = document.querySelector('p')
var color = window.getComputedStyle(node).color
console.log(color)
  1. class操作
var nodeBox = document.querySelector('.box')
console.log( nodeBox.classList )
nodeBox.classList.add('active')   //新增 class
nodeBox.classList.remove('active')  //刪除 class
nodeBox.classList.toggle('active')   //新增/刪除切換
node.classList.contains('active')   // 判斷是否擁有 class

樣式的改變盡量使用 class 的新增刪除來實(shí)現(xiàn)

ex:
http://js.jirengu.com/nupom/1/edit?html,output

  1. 頁面寬高
  • element.clientHeight和 element.offsetHeight
document.body.clientHeight
document.body.offsetHeight

docuemnt.body.style.border = "10px solid red"
docuemnt.body.clientHeight  //變小了
document.body.offsetHeight
  • element.scrollHeight
    元素滾動(dòng)內(nèi)容的總長度。如果元素沒出現(xiàn)滾動(dòng)條, scrollHeight等于 clientHeight
- element.scrollTop 
滾動(dòng)的高度
- window.innerHeight 
窗口的高度
- element.getBoundingClientRect() 
獲取元素在視窗中的位置
-----------------------------------------------
問題1: 如果判斷一個(gè)元素距離 document 頂部的偏移

function getOffsetTop( elem ){
var offsetLeft = 0
do {
offsetTop += elem.offsetTop
} while( elem = elem.offsetParent )
return offsetTop
}

OR

element.getBoundingClientRect().top + document.body.scrollTop

問題2:如何判斷一個(gè)元素是否出現(xiàn)在窗口視野中

問題3:如果判斷頁面滾動(dòng)到底部

**HTMLCollection和NodeList**
接待你都是單個(gè)對象,有時(shí)會(huì)需要一種數(shù)據(jù)結(jié)構(gòu),能夠容納多個(gè)節(jié)點(diǎn)。DOM提供兩種集合對象,用于實(shí)現(xiàn)這種節(jié)點(diǎn)的集合: NodeList和HTMLCollection。
- NodeList對象代表一個(gè)有順序的節(jié)點(diǎn)列表
以下獲得的是NodeList的對象

document.getElementsByName("name1")
document.getElementsByTagName("a")
document.querySelectorAll("a")
document.body.childNodes

- HTMLCollection是一個(gè)接口,表示HTML元素的集合,它提供了可以便歷列表的方法和屬性
以下方法獲取的為HTMLCollection的對象

document.images //所有img元素
document.links //所有帶href屬性的a元素和area元素
document.forms //所有form元素
document.scripts //所有script元素
document.body.children
document.getElementsByClassName("class1")


如何查看

document.body.childNodes.constructor

HTMLCollection與NodeList基本相似

- 相同點(diǎn): 都是類數(shù)組對象,節(jié)點(diǎn)的變化都會(huì)實(shí)時(shí)反映在集合中

- 不同點(diǎn): 少部分方法不一樣,比如 NodeList 有 forEach 方法,而 HTMLCollection 沒有
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容