JavaScript 操作 DOM

寫在前面

由于HTML文檔被瀏覽器解析后就是一棵DOM樹贷币,要改變HTML的結(jié)構(gòu)击胜,就需要通過JavaScript來操作DOM。始終記住DOM是一個樹形結(jié)構(gòu)役纹。操作一個DOM節(jié)點實際上就是這么幾個操作:

  • 更新:更新該DOM節(jié)點的內(nèi)容偶摔,相當(dāng)于更新了該DOM節(jié)點表示的HTML的內(nèi)容;

  • 遍歷:遍歷該DOM節(jié)點下的子節(jié)點促脉,以便進行進一步操作辰斋;

  • 添加:在該DOM節(jié)點下新增一個子節(jié)點策州,相當(dāng)于動態(tài)增加了一個HTML節(jié)點;

  • 刪除:將該節(jié)點從HTML中刪除宫仗,相當(dāng)于刪掉了該DOM節(jié)點的內(nèi)容以及它包含的所有子節(jié)點够挂。

在操作一個DOM節(jié)點前,我們需要通過各種方式先拿到這個DOM節(jié)點:

  • document.getElementById()
  • document.getElementsByTagName()
  • document.getElementsByClassName()

由于ID在HTML文檔中是唯一的藕夫,所以document.getElementById()可以直接定位唯一的一個DOM節(jié)點孽糖;document.getElementsByTagName()和document.getElementsByClassName()總是返回一組DOM節(jié)點。要精確地選擇DOM毅贮,可以先定位父節(jié)點办悟,再從父節(jié)點開始選擇,以縮小范圍嫩码。


1. 更新DOM

可以直接修改節(jié)點的文本,方法有兩種:

  • 修改innerHTML屬性
    這個方式非常強大罪既,不但可以修改一個DOM節(jié)點的文本內(nèi)容铸题,還可以直接通過HTML片段修改DOM節(jié)點內(nèi)部的子樹

  • 修改innerText或textContent屬性
    可以自動對字符串進行HTML編碼,保證無法設(shè)置任何HTML標(biāo)簽

2. 插入DOM

如果這個DOM節(jié)點是空的琢感,例如丢间,<div></div>,那么驹针,直接使用innerHTML = '<span>child</span>'就可以修改DOM節(jié)點的內(nèi)容烘挫,相當(dāng)于“插入”了新的DOM節(jié)點。
如果這個DOM節(jié)點不是空的柬甥,那就不能這么做饮六,因為innerHTML會直接替換掉原來的所有子節(jié)點。

有兩個辦法可以插入新的節(jié)點:

  • appendChild苛蒲,把一個子節(jié)點添加到父節(jié)點的最后一個子節(jié)點卤橄。
<!-- HTML結(jié)構(gòu) -->
<p id="js">JavaScript</p>
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

<!--把<p id="js">JavaScript</p>添加到<div id="list">的最后一項:-->
var js = document.getElementById('js');
var list = document.getElementById('list');
list.appendChild(js);

<!-- HTML結(jié)構(gòu) -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
    <p id="js">JavaScript</p>
</div>
  • appendChild,從零創(chuàng)建一個新的節(jié)點臂外,然后插入到指定位置窟扑。
<!-- HTML結(jié)構(gòu) -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

<!--createElement()重新創(chuàng)建一個新的節(jié)點并添加-->
var list = document.getElementById('list');
var haskell = document.createElement('p');
haskell.id = 'haskell';
haskell.innerText = 'Haskell';
list.appendChild(haskell);

<!-- HTML結(jié)構(gòu) -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
    <p id="haskell">Haskell</p>
</div>
  • insertBefore漏健,要把子節(jié)點插入到指定的位置
<!-- HTML結(jié)構(gòu) -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

<!-- parentElement.insertBefore(newElement, referenceElement); -->
var list = document.getElementById('list');
var ref = document.getElementById('python');
haskell = document.createElement('p');
haskell.id = 'haskell';
haskell.innerText = 'Haskell';
list.insertBefore(haskell, ref);

<!-- HTML結(jié)構(gòu) -->
<div id="list">
    <p id="java">Java</p>
    <p id="haskell">Haskell</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

<!-- 重點:拿到一個“參考子節(jié)點”的引用 -->
var i, c嚎货;
list = document.getElementById('list');
for (i = 0; i < list.children.length; i++) {
    c = list.children[i]; // 拿到第i個子節(jié)點
}

3. 刪除DOM

要刪除一個節(jié)點,首先要獲得該節(jié)點本身以及它的父節(jié)點蔫浆,然后殖属,調(diào)用父節(jié)點的removeChild把自己刪掉:

// 拿到待刪除節(jié)點:
var self = document.getElementById('to-be-removed');
// 拿到父節(jié)點:
var parent = self.parentElement;
// 刪除:
var removed = parent.removeChild(self);
removed === self; // true 刪除后的節(jié)點不在文檔樹中,但其實還在內(nèi)存中瓦盛,可以時再次被添加到別的位置忱辅。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末七蜘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子墙懂,更是在濱河造成了極大的恐慌橡卤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损搬,死亡現(xiàn)場離奇詭異碧库,居然都是意外死亡,警方通過查閱死者的電腦和手機巧勤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門嵌灰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颅悉,你說我怎么就攤上這事沽瞭。” “怎么了剩瓶?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵驹溃,是天一觀的道長。 經(jīng)常有香客問我延曙,道長豌鹤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任枝缔,我火速辦了婚禮布疙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愿卸。我一直安慰自己灵临,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布趴荸。 她就那樣靜靜地躺著俱诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赊舶。 梳的紋絲不亂的頭發(fā)上睁搭,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音笼平,去河邊找鬼园骆。 笑死,一個胖子當(dāng)著我的面吹牛寓调,可吹牛的內(nèi)容都是我干的锌唾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晌涕!你這毒婦竟也來了滋捶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤余黎,失蹤者是張志新(化名)和其女友劉穎重窟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惧财,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡巡扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垮衷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅翔。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搀突,靈堂內(nèi)的尸體忽然破棺而出刀闷,到底是詐尸還是另有隱情,我是刑警寧澤仰迁,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布甸昏,位于F島的核電站,受9級特大地震影響轩勘,放射性物質(zhì)發(fā)生泄漏筒扒。R本人自食惡果不足惜怯邪,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一绊寻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悬秉,春花似錦澄步、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至武氓,卻和暖如春梯皿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背县恕。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工东羹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忠烛。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓属提,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冤议,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353