js常見的原生dom操作總結


1.1. Node

Node是一個接口,中文叫節點,很多類型的DOM元素都是繼承於它,都共享着相同的基本屬性和方法。常見的Node有elementtextattributecommentdocument等(所以要注意節點元素的區別,元素屬於節點的一種)。

Node有一個屬性nodeType表示Node的類型,它是一個整數,其數值分別表示相應的Node類型.

1.2. NodeList

NodeList 對象是一個節點的集合,一般由Node.childNodesdocument.getElementsByNamedocument.querySelectorAll返回的。

不過需要注意,Node.childNodesdocument.getElementsByName返回的NodeList的結果是實時的(此時跟HTMLCollection比較類似),而document.querySelectorAll返回的結果是固定的,這一點比較特殊。

1.3. HTMLCollection

HTMLCollection是一個特殊的NodeList,表示包含了若干元素(元素順序為文檔流中的順序)的通用集合,它是實時更新的,當其所包含的元素發生改變時,它會自動更新。另外,它是一個偽數組,如果想像數組一樣操作它們需要像Array.prototype.slice.call(nodeList, 2)這樣調用。

2.1. 節點查找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

3. 創建節點

3.1. createElement

創建元素:

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

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

3.2. createTextNode

創建文本節點:

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

3.3. cloneNode

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

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

克隆節點並不會克隆事件,除非事件是用<div onclick="test()"></div>這種方式綁定的,用addEventListenernode.onclick=xxx;方式綁定的都不會復制。

3.4. createDocumentFragment

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

4. 節點修改api

節點修改API都具有下面這幾個特點:

  • 不管是新增還是替換節點,如果其原本就在頁面上,那么原來位置的節點將被移除;
  • 修改之后節點本身綁定的事件不會消失;

4.1. appendChild

parent.appendChild(child);

它會將child追加到parent的子節點的最后面。另外,如果被添加的節點是一個頁面中存在的節點,則執行后這個節點將會添加到新的位置,其原本所在的位置將移除該節點,也就是說不會同時存在兩個該節點在頁面上,且其事件會保留。

4.2. insertBefore

將某個節點插入到另外一個節點的前面,語法:

parentNode.insertBefore(newNode, refNode);

關於第二個參數:

  • refNode是必傳的,如果不傳該參數會報錯;
  • 如果refNode是undefined或null,則insertBefore會將節點添加到末尾;

4.3. removeChild

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

var deletedChild = parent.removeChild(node);

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

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

4.4. replaceChild

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

parent.replaceChild(newChild, oldChild);

5.1. 父關系API

  • parentNode:每個節點都有一個parentNode屬性,它表示元素的父節點。Element的父節點可能是Element,Document或DocumentFragment;
  • parentElement:返回元素的父元素節點,與parentNode的區別在於,其父節點必須是一個Element元素,如果不是,則返回null;

5.2. 子關系API

  • children:返回一個實時的HTMLCollection,子節點都是Element,IE9以下瀏覽器不支持;
  • childNodes:返回一個實時的NodeList,表示元素的子節點列表,注意子節點可能包含文本節點、注釋節點等;
  • firstChild:返回第一個子節點,不存在返回null,與之相對應的還有一個firstElementChild
  • lastChild:返回最后一個子節點,不存在返回null,與之相對應的還有一個lastElementChild

5.3. 兄弟關系型API

  • previousSibling:節點的前一個節點,如果不存在則返回null。注意有可能拿到的節點是文本節點或注釋節點,與預期的不符,要進行處理一下。
  • nextSibling:節點的后一個節點,如果不存在則返回null。注意有可能拿到的節點是文本節點,與預期的不符,要進行處理一下。
  • previousElementSibling:返回前一個元素節點,前一個節點必須是Element,注意IE9以下瀏覽器不支持。
  • nextElementSibling:返回后一個元素節點,后一個節點必須是Element,注意IE9以下瀏覽器不支持。

6.1. setAttribute

給元素設置屬性:

element.setAttribute(name, value);

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

6.2. getAttribute

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

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

7.1. 直接修改元素的樣式

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

7.2. 動態添加樣式規則

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

總結: 原生js非常非常重要,但是卻不常用,jq是對元素js的各種api的封裝,很好用,

一定要區分開,原生的api 和 jq的api .


免責聲明!

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



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