国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JavaScript常見(jiàn)原生DOM操作API總結(jié)

瀏覽:4日期:2023-11-16 08:30:25

最近面試的時(shí)候被這個(gè)問(wèn)題給卡了,所以抽時(shí)間好好復(fù)習(xí)一下。

幾種對(duì)象 Node

Node是一個(gè)接口,中文叫節(jié)點(diǎn),很多類(lèi)型的DOM元素都是繼承于它,都共享著相同的基本屬性和方法。常見(jiàn)的Node有 element,text,attribute,comment,document 等(所以要注意 節(jié)點(diǎn) 和 元素 的區(qū)別,元素屬于節(jié)點(diǎn)的一種)。

Node有一個(gè)屬性 nodeType 表示Node的類(lèi)型,它是一個(gè)整數(shù),其數(shù)值分別表示相應(yīng)的Node類(lèi)型,具體如下:

{ ELEMENT_NODE: 1, // 元素節(jié)點(diǎn) ATTRIBUTE_NODE: 2, // 屬性節(jié)點(diǎn) TEXT_NODE: 3, // 文本節(jié)點(diǎn) DATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, // 注釋節(jié)點(diǎn) DOCUMENT_NODE: 9, // 文檔 DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, // 文檔碎片 NOTATION_NODE: 12, DOCUMENT_POSITION_DISCONNECTED: 1, DOCUMENT_POSITION_PRECEDING: 2, DOCUMENT_POSITION_FOLLOWING: 4, DOCUMENT_POSITION_CONTAINS: 8, DOCUMENT_POSITION_CONTAINED_BY: 16, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 32} NodeList

NodeList 對(duì)象是一個(gè)節(jié)點(diǎn)的集合,一般由 Node.childNodes 、 document.getElementsByName 和 document.querySelectorAll 返回的。

不過(guò)需要注意, Node.childNodes 、 document.getElementsByName 返回的 NodeList 的結(jié)果是實(shí)時(shí)的(此時(shí)跟HTMLCollection比較類(lèi)似),而 document.querySelectorAll 返回的結(jié)果是固定的,這一點(diǎn)比較特殊。

舉例如下:

var childNodes = document.body.childNodes;console.log(childNodes.length); // 如果假設(shè)結(jié)果是“2”document.body.appendChild(document.createElement(’div’));console.log(childNodes.length); // 此時(shí)的輸出是“3” HTMLCollection

HTMLCollection是一個(gè)特殊的NodeList,表示包含了若干元素(元素順序?yàn)槲臋n流中的順序)的通用集合,它是實(shí)時(shí)更新的,當(dāng)其所包含的元素發(fā)生改變時(shí),它會(huì)自動(dòng)更新。另外,它是一個(gè)偽數(shù)組,如果想像數(shù)組一樣操作它們需要像 Array.prototype.slice.call(nodeList, 2) 這樣調(diào)用。

節(jié)點(diǎn)查找API

document.getElementById :根據(jù)ID查找元素,大小寫(xiě)敏感,如果有多個(gè)結(jié)果,只返回第一個(gè);

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

document.getElementsByTagName :根據(jù)標(biāo)簽查找元素, * 表示查詢(xún)所有標(biāo)簽,返回一個(gè) HTMLCollection 。

document.getElementsByName :根據(jù)元素的name屬性查找,返回一個(gè) NodeList 。

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

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

document.forms :獲取當(dāng)前頁(yè)面所有form,返回一個(gè) HTMLCollection ;

節(jié)點(diǎn)創(chuàng)建API

節(jié)點(diǎn)創(chuàng)建API主要包括 createElement 、 createTextNode 、 cloneNode 和 createDocumentFragment 四個(gè)方法。

createElement

創(chuàng)建元素:

var elem = document.createElement('div');elem.id = ’test’;elem.style = ’color: red’;elem.innerHTML = ’我是新創(chuàng)建的節(jié)點(diǎn)’;document.body.appendChild(elem);

通過(guò) createElement 創(chuàng)建的元素并不屬于 document 對(duì)象,它只是創(chuàng)建出來(lái),并未添加到html文檔中,要調(diào)用 appendChild 或 insertBefore 等方法將其添加到HTML文檔中。

createTextNode

創(chuàng)建文本節(jié)點(diǎn):

var node = document.createTextNode('我是文本節(jié)點(diǎn)');document.body.appendChild(node); cloneNode

克隆一個(gè)節(jié)點(diǎn): node.cloneNode(true/false) ,它接收一個(gè)bool參數(shù),用來(lái)表示是否復(fù)制子元素。

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

克隆節(jié)點(diǎn)并不會(huì)克隆事件,除非事件是用 <div onclick='test()'></div> 這種方式綁定的,用 addEventListener 和 node.onclick=xxx; 方式綁定的都不會(huì)復(fù)制。

createDocumentFragment

本方法用來(lái)創(chuàng)建一個(gè) DocumentFragment ,也就是文檔碎片,它表示一種輕量級(jí)的文檔,主要是用來(lái)存儲(chǔ)臨時(shí)節(jié)點(diǎn),大量操作DOM時(shí)用它可以大大提升性能。

假設(shè)現(xiàn)有一題目,要求給ul添加10000個(gè)li,我們先用最簡(jiǎn)單的拼接字符串的方式來(lái)實(shí)現(xiàn):

<ul id='ul'></ul><script>(function(){ var start = Date.now(); var str = ’’; for(var i=0; i<10000; i++) {str += ’<li>第’+i+’個(gè)子節(jié)點(diǎn)</li>’; } document.getElementById(’ul’).innerHTML = str; console.log(’耗時(shí):’+(Date.now()-start)+’毫秒’); // 44毫秒})();</script>

再換逐個(gè)append的方式,不用說(shuō),這種方式效率肯定低:

<ul id='ul'></ul><script>(function(){ var start = Date.now(); var str = ’’, li; var ul = document.getElementById(’ul’); for(var i=0; i<10000; i++) {li = document.createElement(’li’);li.textContent = ’第’+i+’個(gè)子節(jié)點(diǎn)’;ul.appendChild(li); } console.log(’耗時(shí):’+(Date.now()-start)+’毫秒’); // 82毫秒})();</script>

最后再試試文檔碎片的方法,可以預(yù)見(jiàn)的是,這種方式肯定比第二種好很多,但是應(yīng)該沒(méi)有第一種快:

<ul id='ul'></ul><script>(function(){ var start = Date.now(); var str = ’’, li; var ul = document.getElementById(’ul’); var fragment = document.createDocumentFragment(); for(var i=0; i<10000; i++) {li = document.createElement(’li’);li.textContent = ’第’+i+’個(gè)子節(jié)點(diǎn)’;fragment.appendChild(li); } ul.appendChild(fragment); console.log(’耗時(shí):’+(Date.now()-start)+’毫秒’); // 63毫秒})();</script> 節(jié)點(diǎn)修改API

節(jié)點(diǎn)修改API都具有下面這幾個(gè)特點(diǎn):

不管是新增還是替換節(jié)點(diǎn),如果其原本就在頁(yè)面上,那么原來(lái)位置的節(jié)點(diǎn)將被移除; 修改之后節(jié)點(diǎn)本身綁定的事件不會(huì)消失; appendChild

這個(gè)其實(shí)前面已經(jīng)多次用到了,語(yǔ)法就是:

parent.appendChild(child);

它會(huì)將child追加到parent的子節(jié)點(diǎn)的最后面。另外,如果被添加的節(jié)點(diǎn)是一個(gè)頁(yè)面中存在的節(jié)點(diǎn),則執(zhí)行后這個(gè)節(jié)點(diǎn)將會(huì)添加到新的位置,其原本所在的位置將移除該節(jié)點(diǎn),也就是說(shuō)不會(huì)同時(shí)存在兩個(gè)該節(jié)點(diǎn)在頁(yè)面上,且其事件會(huì)保留。

insertBefore

將某個(gè)節(jié)點(diǎn)插入到另外一個(gè)節(jié)點(diǎn)的前面,語(yǔ)法:

parentNode.insertBefore(newNode, refNode);

這個(gè)API個(gè)人覺(jué)得設(shè)置的非常不合理,因?yàn)椴迦牍?jié)點(diǎn)只需要知道newNode和refNode就可以了,parentNode是多余的,所以jQuery封裝的API就比較好:

newNode.insertBefore(refNode); // 如 $('p').insertBefore('#foo');

所以切記不要把這個(gè)原生API和jQuery的API使用方法搞混了!為了加深理解,這里寫(xiě)一個(gè)簡(jiǎn)單的例子:

<div id='parent'> 我是父節(jié)點(diǎn) <div id='child'>我是舊的子節(jié)點(diǎn) </div></div><input type='button' value='插入節(jié)點(diǎn)' /><script>var parent = document.getElementById('parent');var child = document.getElementById('child');document.getElementById('insertNode').addEventListener(’click’, function(){ var newNode = document.createElement('div'); newNode.textContent = '我是新節(jié)點(diǎn)'; parent.insertBefore(newNode, child);}, false);</script>

關(guān)于第二個(gè)參數(shù):

refNode是必傳的,如果不傳該參數(shù)會(huì)報(bào)錯(cuò); 如果refNode是undefined或null,則insertBefore會(huì)將節(jié)點(diǎn)添加到末尾; removeChild

removeChild用于刪除指定的子節(jié)點(diǎn)并返回子節(jié)點(diǎn),語(yǔ)法:

var deletedChild = parent.removeChild(node);

deletedChild指向被刪除節(jié)點(diǎn)的引用,它仍然存在于內(nèi)存中,可以對(duì)其進(jìn)行下一步操作。另外,如果被刪除的節(jié)點(diǎn)不是其子節(jié)點(diǎn),則將會(huì)報(bào)錯(cuò)。一般刪除節(jié)點(diǎn)都是這么刪的:

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

replaceChild用于將一個(gè)節(jié)點(diǎn)替換另一個(gè)節(jié)點(diǎn),語(yǔ)法:

parent.replaceChild(newChild, oldChild); 節(jié)點(diǎn)關(guān)系A(chǔ)PI

DOM中的節(jié)點(diǎn)相互之間存在著各種各樣的關(guān)系,如父子關(guān)系,兄弟關(guān)系等。

父關(guān)系A(chǔ)PI parentNode :每個(gè)節(jié)點(diǎn)都有一個(gè)parentNode屬性,它表示元素的父節(jié)點(diǎn)。Element的父節(jié)點(diǎn)可能是Element,Document或DocumentFragment; parentElement :返回元素的父元素節(jié)點(diǎn),與parentNode的區(qū)別在于,其父節(jié)點(diǎn)必須是一個(gè)Element元素,如果不是,則返回null; 子關(guān)系A(chǔ)PI children :返回一個(gè)實(shí)時(shí)的 HTMLCollection ,子節(jié)點(diǎn)都是Element,IE9以下瀏覽器不支持; childNodes :返回一個(gè)實(shí)時(shí)的 NodeList ,表示元素的子節(jié)點(diǎn)列表,注意子節(jié)點(diǎn)可能包含文本節(jié)點(diǎn)、注釋節(jié)點(diǎn)等; firstChild :返回第一個(gè)子節(jié)點(diǎn),不存在返回null,與之相對(duì)應(yīng)的還有一個(gè) firstElementChild ; lastChild :返回最后一個(gè)子節(jié)點(diǎn),不存在返回null,與之相對(duì)應(yīng)的還有一個(gè) lastElementChild ; 兄弟關(guān)系型API previousSibling :節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),如果不存在則返回null。注意有可能拿到的節(jié)點(diǎn)是文本節(jié)點(diǎn)或注釋節(jié)點(diǎn),與預(yù)期的不符,要進(jìn)行處理一下。 nextSibling :節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn),如果不存在則返回null。注意有可能拿到的節(jié)點(diǎn)是文本節(jié)點(diǎn),與預(yù)期的不符,要進(jìn)行處理一下。 previousElementSibling :返回前一個(gè)元素節(jié)點(diǎn),前一個(gè)節(jié)點(diǎn)必須是Element,注意IE9以下瀏覽器不支持。 nextElementSibling :返回后一個(gè)元素節(jié)點(diǎn),后一個(gè)節(jié)點(diǎn)必須是Element,注意IE9以下瀏覽器不支持。 元素屬性型API setAttribute

給元素設(shè)置屬性:

element.setAttribute(name, value);

其中name是特性名,value是特性值。如果元素不包含該特性,則會(huì)創(chuàng)建該特性并賦值。

getAttribute

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

var value = element.getAttribute('id'); 樣式相關(guān)API 直接修改元素的樣式

elem.style.color = ’red’;elem.style.setProperty(’font-size’, ’16px’);elem.style.removeProperty(’color’); 動(dòng)態(tài)添加樣式規(guī)則

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

通過(guò) element.sytle.xxx 只能獲取到內(nèi)聯(lián)樣式,借助 window.getComputedStyle 可以獲取應(yīng)用到元素上的所有樣式,IE8或更低版本不支持此方法。

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

getBoundingClientRect 用來(lái)返回元素的大小以及相對(duì)于瀏覽器可視窗口的位置,用法如下:

var clientRect = element.getBoundingClientRect();

clientRect是一個(gè) DOMRect 對(duì)象,包含width、height、left、top、right、bottom,它是相對(duì)于窗口頂部而不是文檔頂部,滾動(dòng)頁(yè)面時(shí)它們的值是會(huì)發(fā)生變化的。

JavaScript常見(jiàn)原生DOM操作API總結(jié)

來(lái)自:http://www.cnblogs.com/liuxianan/p/javascript-dom-api.html

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 志丹县| 信宜市| 蛟河市| 宁安市| 娄底市| 张北县| 上林县| 阿克陶县| 庆安县| 宁德市| 来凤县| 招远市| 枝江市| 肥东县| 香河县| 镇雄县| 武邑县| 海原县| 余江县| 迭部县| 新丰县| 霍林郭勒市| 古浪县| 阜城县| 乌拉特后旗| 外汇| 航空| 合水县| 五峰| 陕西省| 布尔津县| 慈利县| 闽清县| 平原县| 垣曲县| 贡嘎县| 延安市| 富裕县| 大邑县| 叶城县| 闸北区|