元素的操作

創(chuàng)建和插入元素

創(chuàng)建DOM元素

Document.createElement()

在一個HTML文檔中, Document.createElement()方法用于創(chuàng)建指定的HTML元素

當指定未定義的元素時, 創(chuàng)建一個HTMLUnknownElement

var div = document.createElement('div');

Node.appendChild()

將一個節(jié)點插入到指定的父節(jié)點的最末尾處(也就是成為了這個父節(jié)點的最后一個子節(jié)點).

語法

var child = node.appendChild(child);
  • node 是要插入子節(jié)點的父節(jié)點.
  • child 即是參數(shù)又是這個方法的返回值.

示例

// 創(chuàng)建一個新的段落p元素,然后添加到body的最尾部
var p = document.createElement("p");
document.body.appendChild(p);

例子:留言板插入內容

插入元素

Node.insertBefore()

在當前節(jié)點的某個子節(jié)點之前再插入一個子節(jié)點

語法

var insertedElement = parentElement.insertBefore(newElement, referenceElement);

如果referenceElement為null則newElement將被插入到子節(jié)點的末尾。

如果newElement已經在DOM樹中,newElement首先會從DOM樹中移除

  • insertedElement 是被插入的節(jié)點,即 newElement
  • parentElement 是新插入節(jié)點的父節(jié)點
  • newElement 是被插入的節(jié)點
  • referenceElement 在插入newElement之前的那個節(jié)點

示例 1

<div id="parentElement">
  <span id="childElement">foo bar</span>
</div>

<script>

var sp1 = document.createElement("span");

var sp2 = document.getElementById("childElement");

var parentDiv = sp2.parentNode;

// Insert the new element into the DOM before sp2
parentDiv.insertBefore(sp1, sp2);
</script>

沒有 insertAfter 方法??梢允褂?insertBefore 方法和 nextSibling 來模擬它。

在前一個例子中,可使用下面代碼將 sp1 插入到 sp2 后面:

parentDiv.insertBefore(sp1, sp2.nextSibling);

如果 sp2 沒有下一個節(jié)點,則它肯定是最后一個節(jié)點,則 sp2.nextSibling 返回 null,且 sp1 被插入到子節(jié)點列表的最后面(即 sp2 后面)。

示例 2

在第一個子元素的前面插入一個元素,可使用 firstChild 屬性。

var parentElement = document.getElementById('parentElement');
var theFirstChild = parentElement.firstChild;


var newElement = document.createElement("div");

parentElement.insertBefore(newElement, theFirstChild);

當元素沒有首節(jié)點時,firstChild 返回 null。該元素仍然會被插入到父元素中,位于最后一個節(jié)點后面。又由于父元素沒有第一個子節(jié)點,也沒有最后一個子節(jié)點。 最終,新元素成為唯一的子元素。

例子:倒序留言板插入內容

刪除和替換元素

刪除DOM元素

Node.removeChild

語法

從某個父節(jié)點中移除指定的子節(jié)點,并返回那個子節(jié)點.

var oldChild = node.removeChild(child);
  • child 是要移除的那個子節(jié)點.
  • node 是child的父節(jié)點.
  • oldChild 和child指向同一個節(jié)點,即oldChild === child.

被移除的這個子節(jié)點仍然存在于內存中,只是沒有添加到當前文檔的DOM樹中,因此,你還可以把這個節(jié)點重新添加回文檔中,當然,實現(xiàn)要用另外一個變量比如上例中的oldChild來保存這個節(jié)點的引用.

如果上例中的child節(jié)點不是node節(jié)點的子節(jié)點,則該方法會拋出異常.

示例

<!--示例HTML代碼-->
<div id="top" align="center">
  <div id="nested"></div>
</div>

<script>
// 先定位父節(jié)點,然后刪除其子節(jié)點
var d = document.getElementById("top");
var d_nested = document.getElementById("nested");
var throwawayNode = d.removeChild(d_nested);
// 無須定位父節(jié)點,通過parentNode屬性直接刪除自身
var node = document.getElementById("nested");
if (node.parentNode) {
  node.parentNode.removeChild(node);
}
// 移除一個元素節(jié)點的所有子節(jié)點
var element = document.getElementById("top");
while (element.firstChild) {
  element.removeChild(element.firstChild);
}   
</script>

替換DOM元素

Node.replaceChild

用指定的節(jié)點替換當前節(jié)點的一個子節(jié)點,并返回被替換掉的節(jié)點。

語法

replacedNode = parentNode.replaceChild(newChild, oldChild);
  • newChild 用來替換 oldChild 的新節(jié)點。如果該節(jié)點已經存在于DOM樹中,則它會被從原始位置刪除。
  • oldChild 被替換掉的原始節(jié)點。
  • replacedNode 和oldChild相等。

例子

// <div>
//  <span id="childSpan">foo bar</span>
// </div>

// 創(chuàng)建一個空的span元素節(jié)點
// 沒有id,沒有任何屬性和內容
var sp1 = document.createElement("span");

// 添加一個id屬性,值為'newSpan'
sp1.setAttribute("id", "newSpan");

// 創(chuàng)建一個文本節(jié)點
var sp1_content = document.createTextNode("新的span元素的內容.");

// 將文本節(jié)點插入到span元素中
sp1.appendChild(sp1_content);

// 獲得被替換節(jié)點和其父節(jié)點的引用.
var sp2 = document.getElementById("childSpan");
var parentDiv = sp2.parentNode;

// 用新的span元素sp1來替換掉sp2
parentDiv.replaceChild(sp1, sp2);

// 結果:
// <div>
//   <span id="newSpan">新的span元素的內容.</span>
// </div>

其他

Node.hasChildNodes()

Node.hasChildNodes方法返回一個布爾值,表示當前節(jié)點是否有子節(jié)點。

var foo = document.getElementById("foo");

if (foo.hasChildNodes()) {
  foo.removeChild(foo.childNodes[0]);
}

一個例子: 遍歷當前節(jié)點的所有后代節(jié)點

function DOMComb(parent, callback){
    if( parent.hasChildNodes() ){
        for(var node=parent.firstChild; node; node=node.nextSibling){
            DOMComb(node, callback);
        }
    }

    callback(parent);
    
}

Node.cloneNode()

Node.cloneNode方法用于克隆一個節(jié)點。它接受一個布爾值作為參數(shù),表示是否同時克隆子節(jié)點,默認是false,即不克隆子節(jié)點。

var cloneUL = document.getElementsByTagName('ul')[0].cloneNode(true);

需要注意的是,克隆一個節(jié)點,會拷貝該節(jié)點的所有屬性,但是會喪失addEventListener方法和on-屬性(即node.onclick = fn),添加在這個節(jié)點上的事件回調函數(shù)。

克隆一個節(jié)點之后,DOM樹有可能出現(xiàn)兩個有相同ID屬性(即id="xxx")的HTML元素,這時應該修改其中一個HTML元素的ID屬性。

Node.remove()

Element.remove方法用于將當前元素節(jié)點從DOM樹刪除。

var el = document.getElementById('div-01');
el.remove();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 創(chuàng)建和插入元素 創(chuàng)建DOM元素 Document.createElement() 在一個HTML文檔中, Docu...
    卓小生閱讀 565評論 0 1
  • Hello jQuery 獲取節(jié)點元素的方法: document.getElementsByTagName("a"...
    小幸運Q閱讀 279評論 0 0
  • 學了一段時間的pandas,結果每次想對其中的某個元素進行條件選擇替換值的時候都會遇到困難。一開始想到的是用for...
    不_初心閱讀 6,883評論 1 1
  • python在安裝時,默認的編碼是ascii。經常出現(xiàn)它無法處理非ascii編碼的情況。此時需要手動修改它的編碼字...
    帥氣的_xiang閱讀 650評論 0 0
  • ?Android開發(fā)中我們常常聽到這樣幾個概念,內存,內部存儲,外部存儲,很多人常常將這幾個概念搞混。?內存(Me...
    咊庭閱讀 7,202評論 1 8

友情鏈接更多精彩內容