總結js常用的dom操作(js的dom操作API)


 轉載:https://www.haorooms.com/post/js_dom_api 

前言

很多同學用慣了jquery操作dom,讓他們用js操作的時候,常常力不從心,本文總結了常用的js的dom操作方法,供大家翻閱!其實說起js操作dom,我很久很久之前有篇文章,jquery屬性的相關js實現方法,里面囊括了很大一部分js操作dom的常用方法,但是不是很系統。不能說是API,今天來系統總結一下!

節點查找API

document.getElementById :根據ID查找元素,大小寫敏感,如果有多個結果,只返回第一個;

document.getElementsByClassName :根據類名查找元素,多個類名用空格分隔,返回一個 HTMLCollection 。注意兼容性為IE9+(含)。另外,不僅僅是document,其它元素也支持 getElementsByClassName 方法;

document.getElementsByTagName :根據標簽查找元素, * 表示查詢所有標簽,返回一個 HTMLCollection 。

document.getElementsByName :根據元素的name屬性查找,返回一個 NodeList 。

document.querySelector :返回單個Node,IE8+(含),如果匹配到多個結果,只返回第一個。

document.querySelectorAll :返回一個 NodeList ,IE8+(含)。

document.forms :獲取當前頁面所有form,返回一個 HTMLCollection ;

節點創建API

createElement創建元素:

var elem = document.createElement("div"); elem.id = 'haorooms'; elem.style = 'color: red'; elem.innerHTML = '我是新創建的haorooms測試節點'; document.body.appendChild(elem);

通過 createElement 創建的元素並不屬於 document 對象,它只是創建出來,並未添加到html文檔中,要調用 appendChild 或 insertBefore 等方法將其添加到HTML文檔中。

createTextNode創建文本節點:

var node = document.createTextNode("我是文本節點"); document.body.appendChild(node);

cloneNode 克隆一個節點:

node.cloneNode(true/false) ,它接收一個bool參數,用來表示是否復制子元素。

var from = document.getElementById("test"); var clone = from.cloneNode(true); clone.id = "test2"; document.body.appendChild(clone);

克隆節點並不會克隆事件,除非事件是用

 

這種方式綁定的,用 addEventListener 和 node.onclick=xxx; 方式綁定的都不會復制。

 

createDocumentFragment

本方法用來創建一個 DocumentFragment ,也就是文檔碎片,它表示一種輕量級的文檔,主要是用來存儲臨時節點,大量操作DOM時用它可以大大提升性能。

節點修改API

1、appendChild

語法:

parent.appendChild(child);

2、insertBefore

parentNode.insertBefore(newNode, refNode);

3、insertAdjacentHTML

//js谷歌瀏覽器,火狐瀏覽器,IE8+ el.insertAdjacentHTML('beforebegin', htmlString);

關於insertAdjacentHTML,這個API比較好用,具體可以看:https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

<!-- beforebegin --> <p> <!-- afterbegin --> foo <!-- beforeend --> </p> <!-- afterend -->

4、Element.insertAdjacentElement()

用法和上面類似,

targetElement.insertAdjacentElement(position, element);

5、removeChild

removeChild用於刪除指定的子節點並返回子節點,語法:

var deletedChild = parent.removeChild(node);

deletedChild指向被刪除節點的引用,它仍然存在於內存中,可以對其進行下一步操作。另外,如果被刪除的節點不是其子節點,則將會報錯。一般刪除節點都是這么刪的:

function removeNode(node) { if(!node) return; if(node.parentNode) node.parentNode.removeChild(node); }

6、replaceChild

replaceChild用於將一個節點替換另一個節點,語法:

parent.replaceChild(newChild, oldChild);

節點關系API

1、父關系API

parentNode :每個節點都有一個parentNode屬性,它表示元素的父節點。Element的父節點可能是Element,Document或DocumentFragment;

parentElement :返回元素的父元素節點,與parentNode的區別在於,其父節點必須是一個Element元素,如果不是,則返回null;

2、子關系API

children :返回一個實時的 HTMLCollection ,子節點都是Element,IE9以下瀏覽器不支持;

childNodes :返回一個實時的 NodeList ,表示元素的子節點列表,注意子節點可能包含文本節點、注釋節點等;

firstChild :返回第一個子節點,不存在返回null,與之相對應的還有一個 firstElementChild ;

lastChild :返回最后一個子節點,不存在返回null,與之相對應的還有一個 lastElementChild ;

3、兄弟關系型API

previousSibling :節點的前一個節點,如果不存在則返回null。注意有可能拿到的節點是文本節點或注釋節點,與預期的不符,要進行處理一下。

nextSibling :節點的后一個節點,如果不存在則返回null。注意有可能拿到的節點是文本節點,與預期的不符,要進行處理一下。

previousElementSibling :返回前一個元素節點,前一個節點必須是Element,注意IE9以下瀏覽器不支持。

nextElementSibling :返回后一個元素節點,后一個節點必須是Element,注意IE9以下瀏覽器不支持。

元素屬性型API

1、setAttribute 給元素設置屬性:

element.setAttribute(name, value);

其中name是特性名,value是特性值。如果元素不包含該特性,則會創建該特性並賦值。

2、getAttribute

getAttribute返回指定的特性名相應的特性值,如果不存在,則返回null:

var value = element.getAttribute("id");

3、hasAttribute

var result = element.hasAttribute(name); var foo = document.getElementById("foo"); if (foo.hasAttribute("bar")) { // do something }

4、dataset

獲取html data-開頭的屬性,用法如下:

<div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe</div> let el = document.querySelector('#user'); // el.id == 'user' // el.dataset.id === '1234567890' // el.dataset.user === 'johndoe' // el.dataset.dateOfBirth === '' el.dataset.dateOfBirth = '1960-10-03'; // set the DOB. // 'someDataAttr' in el.dataset === false el.dataset.someDataAttr = 'mydata'; // 'someDataAttr' in el.dataset === true

樣式相關API

1、直接修改元素的樣式

elem.style.color = 'red'; elem.style.setProperty('font-size', '16px'); elem.style.removeProperty('color');

2、動態添加樣式規則

var style = document.createElement('style'); style.innerHTML = 'body{color:red} #top:hover{color: white;}'; document.head.appendChild(style);

3、classList獲取樣式class

// div is an object reference to a <div> element with class="foo bar" div.classList.remove("foo"); div.classList.add("anotherclass"); // if visible is set remove it, otherwise add it div.classList.toggle("visible"); // add/remove visible, depending on test conditional, i less than 10 div.classList.toggle("visible", i < 10 ); alert(div.classList.contains("foo")); // add or remove multiple classes div.classList.add("foo", "bar", "baz"); div.classList.remove("foo", "bar", "baz"); // add or remove multiple classes using spread syntax let cls = ["foo", "bar"]; div.classList.add(...cls); div.classList.remove(...cls); // replace class "foo" with class "bar" div.classList.replace("foo", "bar");

4、window.getComputedStyle

通過 element.sytle.xxx 只能獲取到內聯樣式,借助 window.getComputedStyle 可以獲取應用到元素上的所有樣式,IE8或更低版本不支持此方法。

var style = window.getComputedStyle(element[, pseudoElt]);

獲取相關高度API

關於js的高度,我再慕課網上面也錄制了一個視頻,js/jquery各種寬高的理解和應用

這里主要講一下:

getBoundingClientRect

getBoundingClientRect 用來返回元素的大小以及相對於瀏覽器可視窗口的位置,用法如下:

var clientRect = element.getBoundingClientRect();

clientRect是一個 DOMRect 對象,包含width、height、left、top、right、bottom,它是相對於窗口頂部而不是文檔頂部,滾動頁面時它們的值是會發生變化的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM