DOM文檔對象模型

DOM : Document Object Model 文檔對象模型
文檔:html頁面
文檔對象:頁面中元素
文檔對象模型:定義 為了能夠讓程序(js)去操作頁面中的元素

DOM會把文檔看作是一棵樹,同時定義了很多方法來操作這棵數(shù)中的每一個元素(節(jié)點)
DOM節(jié)點

getElementById
getElementByTagName
document
document.body

1.childNodes和children

元素.childNodes :只讀 屬性 子節(jié)點列表集合
標(biāo)準(zhǔn)下:包含文本和元素類型的節(jié)點,也會包含非法嵌套的子節(jié)點
非標(biāo)準(zhǔn)下(ie9以下):包含元素類型的節(jié)點,ie7以下不包含非法嵌套子節(jié)點

childNodes只包含一級子節(jié)點,不包含后輩孫級以下的節(jié)點
不推薦使用

DOM節(jié)點類型有很多種 12種

元素.nodeType :只讀 屬性 當(dāng)前元素的節(jié)點類型

元素節(jié)點 nodeType 1
文本節(jié)點 nodeType 3
屬性節(jié)點 nodeType 2

元素.attributes : 只讀 屬性 屬性列表集合
oUl.attributes.length
name value nodeType

元素.children : 只讀 屬性 子節(jié)點列表集合
標(biāo)準(zhǔn)下:只包含元素類型節(jié)點
非標(biāo)準(zhǔn)下:只包含元素類型的節(jié)點

2.firstChild,lastChild,nextSibling,previousSibling

元素.firstChild : 只讀 屬性 第一個子節(jié)點
標(biāo)準(zhǔn)下:firstChild包含文本類型的節(jié)點
非標(biāo)準(zhǔn)下:只包含元素節(jié)點
元素.firstElementChild :只讀 屬性 標(biāo)準(zhǔn)下獲取第一個元素類型的子節(jié)點

if ( oUl.firstElementChild ) {
        oUl.firstElementChild.style.background = 'red';
    } else {
        oUl.firstChild.style.background = 'red';
    }
var oFirst = oUl.firstElementChild || oUl.firstChild;
    oFirst.style.background = 'red';

問題?ul沒有子節(jié)點,返回文本節(jié)點oUl.firstChild,報錯
最好的做法

if ( oUl.children[0] ) {
        oUl.children[0].style.background = 'red';
    } else {
        alert('沒有子節(jié)點可以設(shè)置')
    }

元素.lastChild || 元素.lastElementChild 最后一個子節(jié)點

    var oLast = oUl.lastElementChild || oUl.lastChild;
    oLast.style.background = 'yellow';

元素.nextSibling || 元素.nextElementSibling 下一個兄弟節(jié)點

    var oNext = oFirst.nextElementSibling || oFirst.nextSibling;
    oNext.style.background = 'blue';

元素.previousSibling || 元素.previousElementSibling 上一個兄弟節(jié)點

    var oPrev = oLast.previousElementSibling || oLast.previousSibling;
    oPrev.style.background = 'orange';
<ul id="ul1">
        <li>11111</li>
        <li>22222</li>
        <li>33333</li>
        <li>44444</li>
    </ul>

3.父節(jié)點parentNode和offsetParent

元素.parentNode

實例

<script>
window.onload = function() {
    
    var aA = document.getElementsByTagName('a');
    
    for (var i=0; i<aA.length; i++) {
        
        aA[i].onclick = function() {
            
            /*
                元素.parentNode : 只讀 屬性 當(dāng)前節(jié)點的父級節(jié)點
            */
            
            this.parentNode.style.display = 'none';
            
            
        }
        
    }
    
    
}
</script>
<body>
    <ul id="ul1">
        <li>11111 <a href="javascript:;">隱藏</a></li>
        <li>22222 <a href="javascript:;">隱藏</a></li>
        <li>33333 <a href="javascript:;">隱藏</a></li>
        <li>44444 <a href="javascript:;">隱藏</a></li>
    </ul>
</body>

元素.offsetParent :只讀 屬性 當(dāng)前元素最近的有定位的父節(jié)點
如果沒有定位父級,默認(rèn)是body
ie7一下,如果當(dāng)前元素沒有定位,默認(rèn)是body,如果自身加了定位屬性,父級是html,或者觸發(fā)haslayout的上級元素

<script>
window.onload = function() {
    
    var oDiv3 = document.getElementById('div3');
    
    //parentNode : 父節(jié)點
    //alert( oDiv3.parentNode.id );
    
    /*
        元素.offsetParent : 只讀 屬性 離當(dāng)前元素最近的一個有定位屬性的父節(jié)點
            如果沒有定位父級抚岗,默認(rèn)是body
            ie7以下良蛮,如果當(dāng)前元素沒有定位默認(rèn)是body帮寻,如果有定位則是html
            ie7以下旺订,如果當(dāng)前元素的某個父級觸發(fā)了layout弄企,那么offsetParent就會被指向到這個觸發(fā)了layout特性的父節(jié)點上
    */
    
    //layout
    
    /*alert( document.getElementById('div2').currentStyle.hasLayout );*/
    
    alert( oDiv3.offsetParent.id );
    
    
}
</script>
<body id="body1">
    <div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
    </div>
</body>

4.元素偏移位置

元素.offsetLeft[Top] : 只讀 屬性 當(dāng)前元素到定位父級的距離(偏移值)
到當(dāng)前元素的offsetParent的距離

如果沒有定位父級
offsetParent -> body
offsetLeft -> html

如果有定位父級
ie7以下:
如果自己沒有定位,那么offsetLeft[Top]是到body的距離
如果自己有定位区拳,那么就是到定位父級的距離
其他:到定位父級的距離

5.元素寬高

style.width 行間值
clientWidth 可視寬度 width+padding
offsetWidth 占位寬 可視寬+border

6.獲取元素相對頁面位置

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標(biāo)題文檔</title>
<style>
div {padding: 40px 50px;}
#div1 {background: red;position: relative;}
#div2 {background: green; position: relative;}
#div3 {background: orange; position: relative;}
</style>
<script>
window.onload = function() {
    
    var oDiv3 = document.getElementById('div3');
    
    //alert( oDiv3.offsetLeft );
    
    /*var iTop = 0;
    var obj = oDiv3;
    while (obj) {
        alert( obj.id + ' : ' + obj.offsetTop );
        iTop += obj.offsetTop;
        obj = obj.offsetParent;
        alert(obj + ' : ' + obj.id);
    }
    
    alert( iTop );*/
    
    alert( document.body.offsetParent );//null
    
    var p = getPos( oDiv3 );
    
    //alert( p.top );
    
    function getPos(obj) {
        
        var pos = {left:0, top:0};
        
        while (obj) {
            pos.left += obj.offsetLeft;
            pos.top += obj.offsetTop;
            obj = obj.offsetParent;
        }
        
        return pos;
        
    }
    
}
</script>
</head>

<body id="body1">
    <div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
    </div>
</body>
</html>

7.操作元素屬性的方式

otext.value 訪問 賦值 value不可以是變量
otext['value'] 可使用變量

元素.getAttribute() ;方法獲取指定元素制定屬性值
otext.getAttribute('value') ;
元素.setAttribute() ;方法 給指定元素指定的屬性設(shè)置值
otext.setAttribute('value','hello') ;
元素.removeAttribute(屬性名稱) 移除元素屬性

區(qū)別
1.用.和[]無法操作元素自定義屬性,非標(biāo)準(zhǔn)下
getAttribute()可以操作自定義屬性
.[]src完整路徑
getAttribute(src)標(biāo)準(zhǔn)下是src設(shè)置值,ie7是絕對路徑值
oImg.style.getAttribute('width')標(biāo)準(zhǔn)下報錯

8.元素的動態(tài)創(chuàng)建

innerHTML開銷大,效率
document.createElement('li')
document.createElement(標(biāo)簽名稱); 創(chuàng)建元素
父級.removeChild(要刪除的元素); 刪除元素
父級.appendChild(要添加的元素) 方法 追加子元素
父級.insertBefore(新的元素拘领,被插入的元素) 方法 在指定元素前面插入一個新元素
在ie下如果第二個參數(shù)的節(jié)點不存在,會報錯
在其他標(biāo)準(zhǔn)瀏覽器下如果第二個參數(shù)的節(jié)點不存在樱调,則會以appendChild的形式進行添加

if ( oUl.children[0] ) {
            oUl.insertBefore( oLi, oUl.children[0] );
        } else {
            oUl.appendChild( oLi );
        }

父級.replaceChild(新節(jié)點约素,被替換節(jié)點) 替換子節(jié)點
appendChild,insertBefore,replaceChild都可以操作動態(tài)創(chuàng)建出來的節(jié)點,也可以操作已有節(jié)點

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笆凌,一起剝皮案震驚了整個濱河市圣猎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菩颖,老刑警劉巖样漆,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晦闰,居然都是意外死亡放祟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門呻右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跪妥,“玉大人,你說我怎么就攤上這事声滥∶寄欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵落塑,是天一觀的道長纽疟。 經(jīng)常有香客問我,道長憾赁,這世上最難降的妖魔是什么污朽? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮龙考,結(jié)果婚禮上蟆肆,老公的妹妹穿的比我還像新娘。我一直安慰自己晦款,他們只是感情好炎功,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缓溅,像睡著了一般蛇损。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天淤齐,我揣著相機與錄音束世,去河邊找鬼。 笑死床玻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沉帮。 我是一名探鬼主播锈死,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穆壕!你這毒婦竟也來了待牵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喇勋,失蹤者是張志新(化名)和其女友劉穎缨该,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體川背,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贰拿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了熄云。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膨更。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缴允,靈堂內(nèi)的尸體忽然破棺而出荚守,到底是詐尸還是另有隱情,我是刑警寧澤练般,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布矗漾,位于F島的核電站,受9級特大地震影響薄料,放射性物質(zhì)發(fā)生泄漏敞贡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一都办、第九天 我趴在偏房一處隱蔽的房頂上張望嫡锌。 院中可真熱鬧,春花似錦琳钉、人聲如沸势木。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啦桌。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甫男,已是汗流浹背且改。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留板驳,地道東北人又跛。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像若治,于是被迫代替她去往敵國和親慨蓝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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