JS中常見原生DOM操作API 總結整理

2021-07-24 23:38:57 字數 3494 閱讀 3564

node是乙個介面,中文叫節點,很多態別的dom元素都是繼承於它,都共享著相同的基本屬性和方法。常見的node有 element,text,attribute,comment,document 等(所以要注意 節點 和 元素 的區別,元素屬於節點的一種)。

node有乙個屬性 nodetype 表示node的型別,它是乙個整數,其數值分別表示相應的node型別,具體如下:

nodelist 物件是乙個節點的集合,一般由 node.childnodes 、 document.getelementsbyname 和 document.queryselectorall 返回的。

不過需要注意, node.childnodes 、 document.getelementsbyname 返回的 nodelist 的結果是實時的(此時跟htmlcollection比較類似),而 document.queryselectorall 返回的結果是固定的,這一點比較特殊。

舉例如下:

var childnodes = document.body.childnodes;

console.log(childnodes.length); // 如果假設結果是「2」

console.log(childnodes.length); // 此時的輸出是「3」

htmlcollection是乙個特殊的nodelist,表示包含了若干元素(元素順序為文件流中的順序)的通用集合,它是實時更新的,當其所包含的元素發生改變時,它會自動更新。另外,它是乙個偽陣列,如果想像陣列一樣操作它們需要像 array.prototype.slice.call(nodelist, 2) 這樣呼叫。

節點建立api主要包括 createelement 、 createtextnode 、 clonenode 和 createdocumentfragment 四個方法。

建立元素:

var elem = document.createelement("div");

elem.id = 'test';

elem.style = 'color: red';

elem.innerhtml = '我是新建立的節點';

建立文字節點:

var node = document.createtextnode("我是文字節點");
轉殖乙個節點: node.clonenode(true/false) ,它接收乙個bool引數,用來表示是否複製子元素。

var from = document.getelementbyid("test");

var clone = from.clonenode(true);

clone.id = "test2";

轉殖節點並不會轉殖事件,除非事件是用

這種方式繫結的,用 addeventlistener 和 node.οnclick=***; 方式繫結的都不會複製。

本方法用來建立乙個 documentfragment ,也就是文件碎片,它表示一種輕量級的文件,主要是用來儲存臨時節點,大量操作dom時用它可以大大提公升效能。

假設現有一題目,要求給ul新增10000個li,我們先用最簡單的拼接字串的方式來實現:

最後再試試文件碎片的方法,可以預見的是,這種方式肯定比第二種好很多,但是應該沒有第一種快:

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

不管是新增還是替換節點,如果其原本就在頁面上,那麼原來位置的節點將被移除;

修改之後節點本身繫結的事件不會消失;

這個其實前面已經多次用到了,語法就是:

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

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

parentnode.insertbefore(newnode, refnode);
這個api個人覺得設定的非常不合理,因為插入節點只需要知道newnode和refnode就可以了,parentnode是多餘的,所以jquery封裝的api就比較好:

newnode.insertbefore(refnode); // 如 $("p").insertbefore("#foo");
所以切記不要把這個原生api和jquery的api使用方法搞混了!為了加深理解,這裡寫乙個簡單的例子:

我是父節點

我是舊的子節點

關於第二個引數:

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

var deletedchild = parent.removechild(node);
deletedchild指向被刪除節點的引用,它仍然存在於記憶體中,可以對其進行下一步操作。另外,如果被刪除的節點不是其子節點,則將會報錯。一般刪除節點都是這麼刪的:

function removenode(node)

replacechild用於將乙個節點替換另乙個節點,語法:

parent.replacechild(newchild, oldchild);
dom中的節點相互之間存在著各種各樣的關係,如父子關係,兄弟關係等。

給元素設定屬性:

element.setattribute(name, value);
其中name是特性名,value是特性值。如果元素不包含該特性,則會建立該特性並賦值。

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

var value = element.getattribute("id");
通過 element.sytle.*** 只能獲取到內聯樣式,借助 window.getcomputedstyle 可以獲取應用到元素上的所有樣式,ie8或更低版本不支援此方法。

var style = window.getcomputedstyle(element[, pseudoelt]);
getboundingclientrect 用來返回元素的大小以及相對於瀏覽器可視視窗的位置,用法如下:

var clientrect = element.getboundingclientrect();
clientrect是乙個 domrect 物件,包含width、height、left、top、right、bottom,它是相對於視窗頂部而不是文件頂部,滾動頁面時它們的值是會發生變化的。

JS中常見原生DOM操作API

幾種物件 node node是乙個介面,中文叫節點,很多態別的dom元素都是繼承於它,都共享著相同的基本屬性和方法。常見的node有 element,text,attribute,comment,document 等 所以要注意 節點 和 元素 的區別,元素屬於節點的一種 node有乙個屬性 nod...

JS中常見原生DOM操作API

節點查詢api document.getelementbyid 根據id查詢元素,大小寫敏感,如果有多個結果,只返回第乙個 document.getelementsbyclassname 根據類名查詢元素,多個類名用空格分隔,返回乙個 htmlcollection 注意相容性為ie9 含 另外,不僅...

原生js中常用的操作DOM的api介面

建立型api總結 建立型api主要包括createelement,createtextnode,clonenode和createdocumentfragment四個方法,需要注意下面幾點 頁面修改型api要注意幾個特點 1 不管是新增還是替換節點,如果新增或替換的節點是原本存在頁面上的,則其原來位置...