《DOM編程藝術(shù)》一霍弹、DOM


title: 《DOM編程藝術(shù)》一萍倡、DOM
date: 2017-04-13 22:27:25
tags: DOM編程藝術(shù)


1身弊、DOM的含義

  • 文檔(D),指的是document列敲,當(dāng)創(chuàng)建了一個(gè)網(wǎng)頁(yè)并把它加載到web瀏覽器中時(shí)阱佛,DOM就在幕后悄然而生,DOM把我們編寫的網(wǎng)頁(yè)文檔轉(zhuǎn)換為一個(gè)文檔對(duì)象戴而。

  • 對(duì)象(O)凑术,指的就是javascript中的三種對(duì)象,用戶定義對(duì)象所意、內(nèi)建對(duì)象淮逊、宿主對(duì)象。

  • 模型(M)扶踊,可以理解為模型Model或者地圖Map壮莹,我們可以通過javascript代碼來(lái)讀取這張地圖。

要理解模型或者地圖的概念姻檀,首先我們要理解DOM是把一份文檔表示為一棵樹命满。以下面文檔為例。

<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset = "utf-8">
        <title>Shopping list</title>
    </head>
    <body>
        <h1>What to buy</h1>
        <p title = "a gentle reminder">Don't forget to buy this stuff</p>
        <ul id = "purchases">
            <li>A tin of beans</li>
            <li class = "sale">Cheese</li>
            <li class = "sale">Milk</li>
        </ul>
    </body>
</html>

上面的一長(zhǎng)串代碼可以理解為以下的DOM樹


image

從上圖可以看出绣版,html永遠(yuǎn)是一個(gè)文檔的開始胶台,可以看作是樹根,再深一層就是head和body杂抽,它們位于一層诈唬,所以是兄弟關(guān)系(sibling),它們都有各自的子元素(child)缩麸,有著共同的父元素(parent)铸磅。

實(shí)際上用parent、silbling杭朱、child就可以代表整個(gè)DOM樹的結(jié)構(gòu)阅仔,比如ul是ul是body的child元素,而ul又是li的parent元素弧械,ul和p是sibling元素八酒,并且這棵樹上的每個(gè)元素都是一個(gè)DOM節(jié)點(diǎn)。

2刃唐、節(jié)點(diǎn)

上面介紹了DOM的概念羞迷,由圖也可以看出界轩,DOM樹是由一個(gè)個(gè)節(jié)點(diǎn)組成的,這些就是DOM節(jié)點(diǎn)衔瓮。分為三種類型浊猾。

  • 元素節(jié)點(diǎn)
    標(biāo)簽的名字就是元素節(jié)點(diǎn),例如"p"热鞍、"ul"葫慎、"body"等等。

  • 文本節(jié)點(diǎn)
    被元素包括的文本內(nèi)容就是文本節(jié)點(diǎn)碍现,比如上面文檔中被<li>包含的"A tin of beans"幅疼。

  • 屬性節(jié)點(diǎn)
    屬性節(jié)點(diǎn)用來(lái)對(duì)元素做出更具體的描述米奸,比如<p>的title屬性昼接,也包括id和class屬性,屬性節(jié)點(diǎn)也總是被包含在元素節(jié)點(diǎn)內(nèi)部悴晰。

那么我們?nèi)绾螀^(qū)分這三種節(jié)點(diǎn)呢慢睡?可以使用nodeType屬性。
nodeType屬性總共有12種可取值铡溪,但其中僅有3種有實(shí)用價(jià)值漂辐。

  • 元素節(jié)點(diǎn)的nodeType屬性值是1

  • 屬性節(jié)點(diǎn)的nodeType屬性值是2

  • 文本節(jié)點(diǎn)的nodeType屬性值是3

實(shí)際使用中可以通過元素對(duì)象的nodeType屬性值來(lái)判斷節(jié)點(diǎn)類型。

3棕硫、獲取元素

有3種DOM方法可以獲取元素節(jié)點(diǎn)髓涯,分別是通過元素id、通過標(biāo)簽名哈扮、通過class獲取纬纪。

通過id名獲取

這個(gè)方法將返回一個(gè)與給定id屬性值的元素節(jié)點(diǎn)對(duì)應(yīng)的元素對(duì)象,它是document對(duì)象特有函數(shù)滑肉。

document.getElementById('box');

獲取id屬性值是'box'的元素對(duì)象包各。

這里一直再說元素對(duì)象這個(gè)概念,其實(shí)就是指的html元素靶庙,但是在DOM里html元素都是DOM節(jié)點(diǎn)问畅。而DOM節(jié)點(diǎn)本身就是一個(gè)對(duì)象,所以叫做元素對(duì)象六荒。
另外函數(shù)和方法其實(shí)也是一個(gè)概念护姆,對(duì)象的方法其實(shí)就是一個(gè)函數(shù)。

通過標(biāo)簽名獲取

這個(gè)方法返回一個(gè)對(duì)象數(shù)組掏击,與getElementById不同的是签则,這個(gè)返回的是一個(gè)數(shù)組,返回的數(shù)組中铐料,每個(gè)元素都是獲取到的元素對(duì)象渐裂,可以用length屬性查出這個(gè)數(shù)組的長(zhǎng)度豺旬。

document.getElementsByTagName('li');

這個(gè)方法允許把一個(gè)通配符作為它的參數(shù),可以獲取文檔里的所有元素柒凉,也可以和getElementById結(jié)合使用

var box = document.getElementById('box');
var lis = box.getElementsByTagName('*');

這樣可以獲取id為box的元素下的所有元素對(duì)象族阅。

通過class獲取

這是HTML5中新增的方法,可以通過class名獲取元素膝捞,返回的也是一個(gè)對(duì)象數(shù)組坦刀。

document.getElementsByClassName('sale important');

獲取class屬性為sale和important的元素對(duì)象,這個(gè)元素必須同時(shí)有這兩個(gè)class名蔬咬,順序無(wú)所謂鲤遥。也可以和getElementById結(jié)合使用。

var box = document.getElementById('box');
var sales = box.getElementsByClassName('sale');

獲取id值為box的元素下的所有class名為sale的元素林艘。

需要注意的是這個(gè)方法比較新盖奈,所以用的時(shí)候要小心,為了彌補(bǔ)這個(gè)不足狐援,我們可以自己封裝一個(gè)獲取class名的方法以適用于舊版瀏覽器钢坦。

獲取class名的兼容性處理

function getElementsByClassName(node, className) {
    if (node.getElementsByClassName) {
        return node.getElementsByClassName(className);
    } else {
        var results = new Array();
        var elems = node.getElementsByClassName('*');
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].className.indexOf(className) != -1) {
                results[results.length] = elems[i];
            }
        }
        return results;
    }
}

這個(gè)函數(shù)接收兩個(gè)參數(shù),node表示搜索起點(diǎn)啥酱,className是要搜索的class名爹凹,這個(gè)方法不足的地方是不適用多個(gè)class名。

4镶殷、獲取和設(shè)置屬性

已經(jīng)了解了三種獲取元素節(jié)點(diǎn)的方法禾酱,現(xiàn)在可以去獲取它們的屬性。

獲取屬性

var paras = document.getElementsByTagName('p');
for(var i = 0;i < paras.length;i++){
    var title_text = paras[i].getAttribute('title');
    if(title_text != null){
        alert(title_text);
    }
}

getAttribute用于獲取屬性绘趋,需要用元素節(jié)點(diǎn)去調(diào)用颤陶,參數(shù)是要獲取的屬性名,如果調(diào)用的元素節(jié)點(diǎn)里沒有要查找的屬性就會(huì)返回null埋心。

設(shè)置屬性

var paras = document.getElementsByTagName('p');
for(var i = 0;i < paras.length;i++){
    paras[i].setAttribute('title','brand new title text');
    alert(paras[i].getAttribute('title'));
}

setAttribute用于設(shè)置屬性指郁,不管調(diào)用的元素原來(lái)有沒有設(shè)置的屬性,最終都會(huì)被設(shè)置上拷呆,用setAttribute對(duì)文檔做出修改后闲坎,在瀏覽器中查看源代碼仍是改變前的屬性,這就是DOM的工作模式茬斧,對(duì)頁(yè)面內(nèi)容更新卻不需要在瀏覽器里刷新腰懂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市项秉,隨后出現(xiàn)的幾起案子绣溜,更是在濱河造成了極大的恐慌,老刑警劉巖娄蔼,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怖喻,死亡現(xiàn)場(chǎng)離奇詭異底哗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锚沸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門跋选,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人哗蜈,你說我怎么就攤上這事前标。” “怎么了距潘?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵炼列,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我音比,道長(zhǎng)俭尖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任硅确,我火速辦了婚禮目溉,結(jié)果婚禮上明肮,老公的妹妹穿的比我還像新娘菱农。我一直安慰自己,他們只是感情好柿估,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布循未。 她就那樣靜靜地躺著,像睡著了一般秫舌。 火紅的嫁衣襯著肌膚如雪的妖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天足陨,我揣著相機(jī)與錄音嫂粟,去河邊找鬼。 笑死墨缘,一個(gè)胖子當(dāng)著我的面吹牛星虹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镊讼,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼宽涌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蝶棋?” 一聲冷哼從身側(cè)響起卸亮,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玩裙,沒想到半個(gè)月后兼贸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體段直,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年溶诞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坷牛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡很澄,死狀恐怖京闰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甩苛,我是刑警寧澤蹂楣,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站讯蒲,受9級(jí)特大地震影響痊土,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墨林,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酌呆。 院中可真熱鬧,春花似錦菩收、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)队魏。三九已至胡桨,卻和暖如春刽虹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阀圾。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工肾筐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抓歼。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓卒稳,卻偏偏與公主長(zhǎng)得像染突,于是被迫代替她去往敵國(guó)和親也榄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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