JS章節(jié)③ (上) DOM應(yīng)用

1.DOM基礎(chǔ)

  • 什么是DOM :
    document ,節(jié)點(diǎn)! 其實(shí)說的都是一個(gè)東西, CSS時(shí)管叫標(biāo)簽, JS時(shí)管叫元素,DOM時(shí),管叫節(jié)點(diǎn);
  • 瀏覽器支持情況
    IE:10% Chrome:60% FF:99% 支持
  • DOM節(jié)點(diǎn)
    childNodes:子節(jié)點(diǎn)
    nodeType:節(jié)點(diǎn)的類型
  • nodeType == 3 -> 文本節(jié)點(diǎn)
  • nodeType == 1 -> 元素節(jié)點(diǎn)
childNodes 和 nodeType配合使用
<head>
    <meta charset="UTF-8">
    <title>01-DOM基礎(chǔ)</title>
    <script>
        window.onload = function () {
            //        ul的子節(jié)點(diǎn)為li
            var oUl = document.getElementById('ul1');
            for(var i=0;i<oUl.childNodes.length;i++){
                //由于在不同的瀏覽器下,獲取到的oUl.childNodes是不一樣的;IE6-8會(huì)將文本節(jié)點(diǎn)也算進(jìn)去;
                //故若想給元素節(jié)點(diǎn)修改樣式,可以通過 oUl.childNodes[i].nodeType == 1 來獲取元素節(jié)點(diǎn),并修改樣式;
                //nodeType==3   ->  文本節(jié)點(diǎn)
                //nodeType==1   ->  元素節(jié)點(diǎn)

                //給所有的li設(shè)置背景顏色
                if(oUl.childNodes[i].nodeType == 1){
                    oUl.childNodes[i].style.background = 'red';
                }
            }
        }
    </script>
</head>
<body>

<ul id="ul1">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
abcdefg //文本節(jié)點(diǎn)
<span>abcdefg</span> //元素節(jié)點(diǎn)
</body>
</html>
  • 獲取子節(jié)點(diǎn)
    children:他只包括元素,不包含文本,兼容所有瀏覽器
    故上面的例子可以這樣寫,簡單粗暴!!!
for (var i=0;i<oUl.children.length;i++){
     oUl.children[i].style.background = 'red';
}

parentNode:父節(jié)點(diǎn)
例子:點(diǎn)擊鏈接说庭,隱藏整個(gè)li
parentNode示例:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02-parentNode</title>
    <script>
        window.onload = function () {
            var aA = document.getElementsByTagName('a');
            for(var i=0;i<aA.length;i++){
                aA[i].onclick = function () {
                    this.parentNode.style.display = 'none';
                }
            }
        }
    </script>
</head>
<body>
<ul>
    <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>
</html>
parentNode應(yīng)用
  • offsetParent
    例子:獲取元素在頁面上的實(shí)際位置
    主要用作定位時(shí),獲取元素的實(shí)際父節(jié)點(diǎn).
示例一:給第二個(gè)div2設(shè)置絕對(duì)定位,給div2的父節(jié)點(diǎn)div1什么也不設(shè)置,那么div2的offsetParentbody.
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>offsetParent</title>
    <style>
        #div1{width: 200px;height: 200px;background: #ccc;margin-left: 100px;}
        #div2{width: 100px;height: 100px;background: red;position: absolute;left: 10px;}
    </style>
    <script>
        window.onload = function () {
            oDiv2 = document.getElementById('div2');
            alert(oDiv2.offsetParent); //結(jié)果:[object HTMLBodyElement] 父節(jié)點(diǎn)為body;
        }
    </script>
</head>
<body>
<div id="div1">
    <div id="div2"></div>
</div>
</body>
</html>
示例二:給第二個(gè)div2設(shè)置絕對(duì)定位,給div2的父節(jié)點(diǎn)div1設(shè)置相對(duì)定位,那么div2offsetParentdiv1.
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>offsetParent</title>
    <style>
        #div1{width: 200px;height: 200px;background: #ccc;margin-left: 100px;
            position: relative;}
        #div2{width: 100px;height: 100px;background: red;position: absolute;left: 10px;}
    </style>
    <script>
        window.onload = function () {
            oDiv2 = document.getElementById('div2');
            alert(oDiv2.offsetParent); //結(jié)果:[object HTMLDivElement] 父節(jié)點(diǎn)為div;
        }
    </script>
</head>
<body>
<div id="div1">
    <div id="div2"></div>
</div>
</body>
</html>

2.DOM節(jié)點(diǎn)(2)

  • 首尾子節(jié)點(diǎn)
  • 有兼容性問題
  • firstChild然磷、firstElementChild
  • lastChild 、lastElementChild
    //IE6-8
    //oUl.firstChild.style.background='red';
    //高級(jí)瀏覽器
    //oUl.firstElementChild.style.background='red';

使用示例

<html>
<head>
<meta charset="utf-8">
<title>無標(biāo)題文檔</title>
<script>
window.onload=function ()
{
    var oUl=document.getElementById('ul1');
    //IE6-8
    //oUl.firstChild.style.background='red';
    //高級(jí)瀏覽器
    //oUl.firstElementChild.style.background='red';

    //給第一個(gè)li設(shè)置紅色背景:由于兼容問題,故需判斷下
    if(oUl.firstElementChild)
    {
        oUl.firstElementChild.style.background='red';
    }
    else
    {
        oUl.firstChild.style.background='red';
    }
};
</script>
</head>
<body>
<ul id="ul1">
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>
</body>
</html>
  • 兄弟節(jié)點(diǎn) (使用同上)
  • 有兼容性問題
  • nextSibling刊驴、nextElementSibling
  • previousSibling姿搜、previousElementSibling

3.操縱元素屬性

  • 元素屬性操作
    第一種:oDiv.style.display='block';
    第二種:oDiv.style['display']='block';
    第三種:Dom方式: oDiv2.setAttribute('display','none');

  • DOM方式操作元素屬性
    獲取:getAttribute(名稱)
    設(shè)置:setAttribute(名稱, 值)
    刪除:removeAttribute(名稱)

4.用className選擇元素

  • 如何用className選擇元素
  • 選出所有元素
  • 通過className條件篩選
    初級(jí)用法
<html>
<head>
    <meta charset="utf-8">
    <title>無標(biāo)題文檔</title>
    <script>
        window.onload=function ()
        {
            var oUl=document.getElementById('ul1');
            var aLi=oUl.getElementsByTagName('li');
            for(var i=0;i<aLi.length;i++)
            {
                if(aLi[i].className=='box')
                {
                    aLi[i].style.background='red';
                }
            }
        };
    </script>
</head>
<body>
<ul id="ul1">
    <li class="box"></li>
    <li class="box"></li>
    <li></li>
    <li></li>
    <li></li>
    <li class="box"></li>
    <li></li>
</ul>
</body>
</html>
  • 封裝成函數(shù)
    高級(jí)用法
    <script>
         //封裝成函數(shù)
        function getByClass(oParent, sClass)
        {
            var aResult=[];
            var aEle=oParent.getElementsByTagName('*');//*通配符,獲取oParent下面所有的節(jié)點(diǎn)

            for(var i=0;i<aEle.length;i++)
            {
                if(aEle[i].className==sClass)
                {
                    aResult.push(aEle[i]);
                }
            }
            return aResult;
        }
        window.onload=function ()
        {
            var oUl=document.getElementById('ul1');
            var aBox=getByClass(oUl, 'box');

            for(var i=0;i<aBox.length;i++)
            {
                aBox[i].style.background='red';
            }
        };
    </script>
    <body>
       <ul id="ul1">
          <li class="box"></li>
          <li class="box"></li>
          <li></li>
          <li></li>
          <li></li>
         <li class="box"></li>
         <li></li>
       </ul>
</body>

5.創(chuàng)建捆憎、插入和刪除元素

  • 創(chuàng)建DOM元素
    createElement(標(biāo)簽名) 創(chuàng)建一個(gè)節(jié)點(diǎn) appendChild(節(jié)點(diǎn)) 追加一個(gè)節(jié)點(diǎn)
注意:appendChild(節(jié)點(diǎn)) 有兩個(gè)作用:

(一)如果這個(gè)元素是通過createElement(標(biāo)簽名)創(chuàng)建出來的,那么它可以直接添加到新的父級(jí);
(二).如果這個(gè)元素有父級(jí), 那么1.先把元素從原有父級(jí)上刪除;2.再添加到新的父級(jí).

例子:為ul插入li

<html>
<head>
    <meta charset="utf-8">
    <title>無標(biāo)題文檔</title>
    <script>
        window.onload=function ()
        {
            var oBtn=document.getElementById('btn1');
            var oUl=document.getElementById('ul1');
            var oTxt=document.getElementById('txt1');
            oBtn.onclick=function ()
            {
                //創(chuàng)建節(jié)點(diǎn)
                var oLi=document.createElement('li');
                oLi.innerHTML=oTxt.value;
                //添加節(jié)點(diǎn) 父級(jí).appendChild(子節(jié)點(diǎn));
                oUl.appendChild(oLi);
            };
        };
    </script>
</head>
<body>
<input id="txt1" type="text"/>
<input id="btn1" type="button" value="創(chuàng)建li"/>
<ul id="ul1">
</ul>
</body>
</html>
創(chuàng)建DOM元素,并添加
  • 插入元素
    insertBefore(節(jié)點(diǎn), 原有節(jié)點(diǎn)) 在已有元素前插入 例子:倒序插入li
<html>
<head>
    <meta charset="utf-8">
    <title>無標(biāo)題文檔</title>
    <script>
        window.onload=function ()
        {
            var oBtn=document.getElementById('btn1');
            var oUl=document.getElementById('ul1');
            var oTxt=document.getElementById('txt1');
            oBtn.onclick=function ()
            {
                var oLi=document.createElement('li');
                var aLi=oUl.getElementsByTagName('li');
                oLi.innerHTML=oTxt.value;

                if(aLi.length>0)
                {//當(dāng)aLi 中有元素時(shí),直接插入到最上面
                    oUl.insertBefore(oLi, aLi[0]);
                }
                else
                {//當(dāng)aLi 中沒有元素時(shí),先添加一個(gè)
                    oUl.appendChild(oLi);
                }
            };
        };
    </script>
</head>
<body>
<input id="txt1" type="text"/>
<input id="btn1" type="button" value="創(chuàng)建li"/>
<ul id="ul1">
</ul>
</body>
</html>
插入DOM:一直插入到第一個(gè)位置
  • 刪除DOM元素
    removeChild(節(jié)點(diǎn)) 刪除一個(gè)節(jié)點(diǎn) 例子:刪除li
<html>
<head>
    <meta charset="utf-8">
    <title>無標(biāo)題文檔</title>
    <script>
        window.onload=function ()
        {
            var aA=document.getElementsByTagName('a');
            var oUl=document.getElementById('ul1');
            for(var i=0;i<aA.length;i++)
            {
                aA[i].onclick=function ()
                {
                     //a標(biāo)簽的父節(jié)點(diǎn)是li
                    oUl.removeChild(this.parentNode);
                };
            }
        };
    </script>
</head>
<body>
<ul id="ul1">
    <li>asfasd <a href="javascript:;">刪除</a></li>
    <li>5645 <a href="javascript:;">刪除</a></li>
    <li>ghdfjgj <a href="javascript:;">刪除</a></li>
    <li>mvbnmvnb <a href="javascript:;">刪除</a></li>
</ul>
</body>
</html>
刪除DOM元素

6.文檔碎片

使用文檔碎片在某些情況下可以提高頁面效率舅柜。
javascript操作dom是一個(gè)很耗性能的過程,在某些情況下攻礼,不得不進(jìn)行dom循環(huán)操作业踢,我們每次對(duì)dom的操作都會(huì)觸發(fā)"重排",這嚴(yán)重影響到能耗礁扮,一般通常采取的做法是盡可能的減少dom操作來減少"重排"。
面對(duì)循環(huán)操作dom的過程瞬沦,我們選擇使用文檔碎片(creatDocumentFragment)太伊,將需要添加到dom中的內(nèi)容一次性添加到文檔碎片中,然后將文檔碎片添加到dom樹逛钻,這樣就可以有效的減少操作dom的次數(shù)僚焦。

  • 文檔碎片可以提高DOM操作性能(理論上)
  • 文檔碎片原理
  • document.createDocumentFragment()
<html>
<head>
    <meta charset="utf-8">
    <title>無標(biāo)題文檔</title>
    <script>
        window.onload=function ()
        {
            //在IE6-8等低版本瀏覽器上,可以提高下性能;在高級(jí)瀏覽器上提高性能不大,有時(shí)候還會(huì)降低性能
            var oUl=document.getElementById('ul1');
            //1.創(chuàng)建文檔碎片
            var oFrag=document.createDocumentFragment();
            for(var i=0;i<10000;i++)
            {
                var oLi=document.createElement('li');
                //2.給文檔碎片添加元素
                oFrag.appendChild(oLi);
            }
            //3.把文檔碎片添加給ul
            oUl.appendChild(oFrag);
        };
    </script>
</head>
<body>
<ul id="ul1"></ul>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曙痘,隨后出現(xiàn)的幾起案子芳悲,更是在濱河造成了極大的恐慌,老刑警劉巖边坤,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件名扛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡茧痒,警方通過查閱死者的電腦和手機(jī)肮韧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺订,“玉大人弄企,你說我怎么就攤上這事∏” “怎么了拘领?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長樱调。 經(jīng)常有香客問我约素,道長洽瞬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任业汰,我火速辦了婚禮伙窃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘样漆。我一直安慰自己为障,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布放祟。 她就那樣靜靜地躺著鳍怨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跪妥。 梳的紋絲不亂的頭發(fā)上鞋喇,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音眉撵,去河邊找鬼侦香。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纽疟,可吹牛的內(nèi)容都是我干的罐韩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼污朽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼散吵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蟆肆,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤矾睦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后炎功,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枚冗,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年亡问,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了官紫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡州藕,死狀恐怖束世,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情床玻,我是刑警寧澤毁涉,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站锈死,受9級(jí)特大地震影響贫堰,放射性物質(zhì)發(fā)生泄漏穆壕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一其屏、第九天 我趴在偏房一處隱蔽的房頂上張望喇勋。 院中可真熱鬧,春花似錦偎行、人聲如沸川背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熄云。三九已至,卻和暖如春妙真,著一層夾襖步出監(jiān)牢的瞬間缴允,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工珍德, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留练般,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓菱阵,卻偏偏與公主長得像踢俄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晴及,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • DOM 變化 如何確認(rèn)瀏覽器是否支持 DOM 2 和 DOM 3 新增的模塊:var supportsDOM2Co...
    云之外閱讀 467評(píng)論 0 0
  • 我們首先要明白,我們給頁面添加效果用到的js到底是什么嫡锌?js其實(shí)包含三部分:dom 文檔對(duì)象模型 bom 瀏覽...
    一直以來都很好閱讀 800評(píng)論 0 0
  • 一虑稼、JS前言 (1)認(rèn)識(shí)JS 也許你已經(jīng)了解HTML標(biāo)記(也稱為結(jié)構(gòu)),知道了CSS樣式(也稱為表示)势木,會(huì)使用HT...
    凜0_0閱讀 2,769評(píng)論 0 8
  • 1. 什么是DOM 文檔對(duì)象模型 (DOM) 是HTML和XML文檔的編程接口蛛倦。它提供了對(duì)文檔的結(jié)構(gòu)化的表述,并定...
    hanyuntao閱讀 1,266評(píng)論 0 4
  • 最近聽到一首歌曲《笑忘書》沒有蠟燭啦桌,就不用勉強(qiáng)慶祝溯壶,沒想到答案,就不用尋找題目甫男,沒有退路且改,那我也不要散步,沒人去仰...
    胡鬧鬧的Angel閱讀 268評(píng)論 0 1