js中Dom操作的個(gè)人總結(jié)

一 js中的Dom操作處理

一 獲取元素

  • querySelector的性能會(huì)比get系列的要高鸠匀,因?yàn)榉祷氐氖莕odeList的快照须喂。
  • querySelector獲取的是快照喊式,所以當(dāng)元素更新的時(shí)候僻他,獲取的快照不會(huì)更新笆包。
  • querySelector系列是靜態(tài)的环揽,get系列是動(dòng)態(tài)的。
  • 其中色查,document.getElementById('mybtn')只有document才有
document.querySelector('.mybtn')   /// 返回第一個(gè)與選擇器匹配的元素
document.querySelectorAll('.mybtn')  // 返回所有與選擇器匹配的元素
document.getElementsByClassName('mybtn')   // 返回所有className 為mybtn的元素
document.getElementsByTagName('div')
document.getElementById('mybtn')
document.getElementByName('mybtn')  // 可以通過(guò)name獲取表單(表單的id與label的for要保持一致薯演。)
document.getElementByTagName('*') // 可以獲取頁(yè)面中所有的元素

轉(zhuǎn)載自知乎的一個(gè)demo,

因?yàn)?Demo 2 中的 lis 是一個(gè)動(dòng)態(tài)的 Node List, 每一次調(diào)用 lis 都會(huì)重新對(duì)文檔進(jìn)行查詢(xún)秧了,導(dǎo)致無(wú)限循環(huán)的問(wèn)題跨扮。而 Demo 1 中的 lis 是一個(gè)靜態(tài)的 Node List,是一個(gè) li 集合的快照验毡,對(duì)文檔的任何操作都不會(huì)對(duì)其產(chǎn)生影響衡创。

作者:簡(jiǎn)生
鏈接:https://www.zhihu.com/question/24702250/answer/28695133
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)晶通,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處璃氢。

// Demo 1
var ul = document.querySelectorAll('ul')[0],
    lis = ul.querySelectorAll("li");
for(var i = 0; i < lis.length ; i++){
    ul.appendChild(document.createElement("li"));
}

// Demo 2
var ul = document.getElementsByTagName('ul')[0], 
    lis = ul.getElementsByTagName("li"); 
for(var i = 0; i < lis.length ; i++){
    ul.appendChild(document.createElement("li")); 
}

作者:簡(jiǎn)生
鏈接:https://www.zhihu.com/question/24702250/answer/28695133
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)狮辽,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處一也。

二 增刪class,使用classList

  • element.classList.add增加class
  • element.classList.remove刪除class
  • element.classList.containes是否包含class,返回true或者false
  • element.classList.toggle切換class
  • div.classList.replace("foo", "bar"); 替換class
三 直接修改整個(gè)class 喉脖,使用className
  • ele.className = 'foo goo do '設(shè)置ele的class,也可以用這個(gè)屬性去獲取ele的class
let elm = document.getElementById('item');

if(elm.className === 'active'){
    elm.className = 'inactive';
} else {
    elm.className = 'active';
}

四 自定義數(shù)據(jù)屬性

  • data-set,獲取自定義屬性的方法椰苟,ele.dataset.name
  • 主要用在跟蹤連接上會(huì)有用處,可以設(shè)置相應(yīng)的自定義屬性树叽,進(jìn)行跟蹤連接舆蝴。
<div id="myDiv" data-name="myDiv" data-id="myId"
       data-my-custom-key="This is the value"></div>

// 獲取的方法
ele.dataset.name 
ele.dataset.myCustomKey
ele.dataset.id

// 也可以直接定義
ele.dataset.name  = ‘katherine’
ele.dataset.myCustomKey = ‘new value’
ele.dataset.id = 'newID'

五 獲取dom元素的屬性的方法,獲取某一個(gè)屬性atrr的方法有哪些呢题诵?

  • ele.attr 設(shè)置獲取獲取元素的屬性,但是不能設(shè)置或者獲取自定義屬性
  • getAttribute(attr) setAttribute(attr,'new'),的方法獲取或者設(shè)置屬性

這兩種方法的比較和對(duì)比

  • ele.attr 不能設(shè)置或者獲取自定義屬性,使用getAttribute相關(guān)方法則可以設(shè)置或者獲取自定義屬性洁仗。
  • 當(dāng)使用ele.style 得到的是一個(gè)style的對(duì)象值,所以可以通過(guò)ele.style.color獲得某一個(gè)樣式的值性锭;而使用getAttribute 相關(guān)方法獲取的style是字符串赠潦。
  • 使用ele.attri獲取class的時(shí)候,是使用ele.className.而使用getAttribute方法的時(shí)候篷店,是直接使用ele.getAttribute('class')
<div id="myDiv" data-name="myDiv" data-id="myId" class='test'
       data-my-custom-key="This is the value"></div>

var Odiv = document.getElementById('myDiv');
// 
Odiv.id   //myDiv
Odiv.className // test


//
Odiv.getAttribute('id')  // myDiv
Odiv.getAttribute('class')  .. //test
Odiv.getAttribute('data-name')   // myDiv

六 使用ele.tagName的時(shí)候要注意

  • 使用ele.tagName會(huì)返回該元素的標(biāo)簽名祭椰,但是要比較的話(huà)臭家,最好是用ele.tagName.toLowerCase === 'div'去比較和使用最好疲陕。

七 節(jié)點(diǎn)與元素節(jié)點(diǎn)

傳統(tǒng)的獲取不同的節(jié)點(diǎn)的方法有如下
  • ele.childNodes // 返回某一個(gè)元素的所有子節(jié)點(diǎn),包括文本節(jié)點(diǎn)
  • ele.previousSibling // 返回同級(jí)的前面的兄弟元素
  • ele.nextSibling // 返回同級(jí)的后面的兄弟元素
  • ele.firstChild // 返回第一個(gè)子元素
  • ele.lastChild //返回最后一個(gè)子元素
新的不包含文本節(jié)點(diǎn)的獲取元素節(jié)點(diǎn)的方法方淤,不包含空元素節(jié)點(diǎn)和文本節(jié)點(diǎn)
  • ele.childElementCount // 返回某一個(gè)元素的所有子節(jié)點(diǎn)的個(gè)數(shù)
  • ele.previousElementSibling // 返回同級(jí)的前面的兄弟元素
  • ele.nextElementSibling // 返回同級(jí)的后面的兄弟元素
  • ele.firstElementChild // 返回第一個(gè)子元素
  • ele.lastElementChild //返回最后一個(gè)子元素

七 設(shè)置和獲取 innerHTML innerText

相比于創(chuàng)建節(jié)點(diǎn),再將節(jié)點(diǎn)append或者穿插到某一個(gè)節(jié)點(diǎn)處蹄殃,innerHTML還是比較高效率的携茂。

  • 當(dāng)設(shè)置了一個(gè)元素的innerHTML和innerText之后,之前的內(nèi)部元素都會(huì)被清除诅岩,重新覆蓋讳苦。
  • 使用innerHTML的時(shí)候,要注意盡量減少使用的次數(shù)吩谦,因?yàn)轭l繁使用innerHTML會(huì)造成性能問(wèn)題鸳谜。
下面的例子就是,盡量少用innerHTML
for (var i = 0; i < length; i++) {
 ul.innerHTML += "<li>" + values[i] + "</li>"; 
}
// 高效率的做法應(yīng)該是這樣子
var newHtml = ''
for (var i = 0; i < length; i++) {
 newHtml += "<li>" + values[i] + "</li>"; 
}
ul.innerHTML = newHtml;
八 創(chuàng)建以及插入節(jié)點(diǎn)的相關(guān)方法式廷。

?注意: 如果使用appendChild的時(shí)候咐扭,插入的元素已經(jīng)是文檔的節(jié)點(diǎn),那么這個(gè)文檔的節(jié)點(diǎn)就會(huì)從原來(lái)的位置偏移到新的位置去滑废,即文檔中的任何節(jié)點(diǎn)都不能同時(shí)出現(xiàn)在兩個(gè)位置蝗肪。

document.createElement('div')   //創(chuàng)建一個(gè)div的節(jié)點(diǎn)。
father.appendChild(newNode)   //在father節(jié)點(diǎn)的最后添加new節(jié)點(diǎn)
father.insertBefore(newNode,father.firstChild)  // 將newnode插入到father的第一個(gè)子元素之前
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蠕趁,一起剝皮案震驚了整個(gè)濱河市薛闪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俺陋,老刑警劉巖豁延,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腊状,居然都是意外死亡诱咏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)寿酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胰苏,“玉大人,你說(shuō)我怎么就攤上這事醇疼∷恫ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秧荆,是天一觀(guān)的道長(zhǎng)倔毙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乙濒,這世上最難降的妖魔是什么陕赃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任卵蛉,我火速辦了婚禮,結(jié)果婚禮上么库,老公的妹妹穿的比我還像新娘傻丝。我一直安慰自己,他們只是感情好诉儒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布葡缰。 她就那樣靜靜地躺著,像睡著了一般忱反。 火紅的嫁衣襯著肌膚如雪泛释。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天温算,我揣著相機(jī)與錄音怜校,去河邊找鬼。 笑死注竿,一個(gè)胖子當(dāng)著我的面吹牛茄茁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔓搞,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胰丁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了喂分?” 一聲冷哼從身側(cè)響起锦庸,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒲祈,沒(méi)想到半個(gè)月后甘萧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梆掸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年扬卷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酸钦。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怪得,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卑硫,到底是詐尸還是另有隱情徒恋,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布欢伏,位于F島的核電站入挣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硝拧。R本人自食惡果不足惜径筏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一葛假、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滋恬,春花似錦聊训、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)媳维。三九已至酿雪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侄刽,已是汗流浹背指黎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留州丹,地道東北人醋安。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像墓毒,于是被迫代替她去往敵國(guó)和親吓揪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • DOM DOM內(nèi)容主要分為四部分: 什么是DOM和節(jié)點(diǎn)所计; 獲取節(jié)點(diǎn)柠辞; 節(jié)點(diǎn)操作(3種); 屬性操作(3種)主胧。 什么...
    magic_pill閱讀 781評(píng)論 0 1
  • 基本介紹 文檔對(duì)象模型 (DOM) 是HTML和XML文檔的編程接口叭首。它給文檔(結(jié)構(gòu)樹(shù))提供了一個(gè)結(jié)構(gòu)化的表述并且...
    草鞋弟閱讀 439評(píng)論 0 0
  • 世事變遷,生活在人世間踪栋,誰(shuí)都希望有人可以依靠焙格。活到一定境地之后才會(huì)明白夷都,好人難得眷唉,好友難得,好心更難得囤官。為什么冬阳?靠...
    像話(huà)讀書(shū)爻閱讀 414評(píng)論 0 3
  • 一個(gè)偶然的機(jī)會(huì)我成為了一名帝國(guó)的保安摩泪。 在沒(méi)有生活的時(shí)候我對(duì)這份帝國(guó)給的工作充滿(mǎn)了無(wú)盡的向往。 但現(xiàn)實(shí)好像和我開(kāi)了...
    肥膩壓縮閱讀 138評(píng)論 0 1
  • 最開(kāi)始看到題目的時(shí)候有點(diǎn)蒙劫谅,還好有篤師的講解见坑,還說(shuō)到了它的來(lái)源:" levelling the playi...
    曦熙何兮閱讀 69評(píng)論 0 0