DOM

DOM

DOM:Document Object Model(文檔對(duì)象模型)

用來(lái)將標(biāo)記型文檔封裝成對(duì)象,并將標(biāo)記型文檔中的所有的內(nèi)容(標(biāo)簽,文本抵卫,屬性等)都封裝成對(duì)象垂蜗。封裝成對(duì)象的目的是為了更方便操作這些文檔中的所有內(nèi)容蜓竹,因?yàn)閷?duì)象的出現(xiàn)可以有屬性和行為被調(diào)用

  • 文檔:標(biāo)記型文檔
  • 對(duì)象:封裝了屬性和行為的實(shí)例付燥,可以直接被調(diào)用
  • 模型:所有標(biāo)記型文檔都具備一些共性特征的一個(gè)體現(xiàn)

只要是標(biāo)記型文檔奢入,DOM這種技術(shù)都可以對(duì)其進(jìn)行操作唧取,常見(jiàn)的標(biāo)記型文檔:(HTML展辞、XML)要操作標(biāo)記型文檔必須對(duì)其進(jìn)行解析

DOM技術(shù)的解析方式:dom解析將按照標(biāo)簽的層次關(guān)系體現(xiàn)出標(biāo)簽的所屬奥邮,形成一個(gè)樹(shù)狀結(jié)構(gòu),稱為DOM樹(shù)罗珍,樹(shù)中的標(biāo)簽以及文本甚至屬性稱為節(jié)點(diǎn)洽腺,這個(gè)節(jié)點(diǎn)也成為對(duì)象,標(biāo)簽通常也稱為頁(yè)面中的元素覆旱。

  • 好處:可以對(duì)樹(shù)中的節(jié)點(diǎn)進(jìn)行任意操作蘸朋,比如:增刪改查

  • 弊端:這種解析需要將整個(gè)標(biāo)記型文檔加載進(jìn)內(nèi)存

DOM解析文檔.png

簡(jiǎn)介另一種解析方式:SAX:是由一些組織定義的一種民間常用的解析方式,并不是w3c標(biāo)準(zhǔn)扣唱,而DOM是w3c的標(biāo)準(zhǔn)

SAX解析方式:基于事件驅(qū)動(dòng)的解析

  • 好處:獲取速度非撑号鳎快
  • 弊端:無(wú)法進(jìn)行增刪改

如果僅僅只是查詢,可以使用SAX

DOM的三層模型

  • DOM level 1:將html文檔封裝成對(duì)象

  • DOM level 2:在level 1基礎(chǔ)上加入了新功能噪沙,比如解析名稱空間(可以使用域名來(lái)標(biāo)識(shí))

    <html xmlns = "my"> <table></table> </html> <html xmlns = "you"> <table></table> </html>

  • DOM level 3:將xml文檔封裝成對(duì)象

DHTML

動(dòng)態(tài)的html炼彪,不是一門(mén)語(yǔ)言:是多項(xiàng)技術(shù)綜合體的簡(jiǎn)稱(HTML,CSS正歼,JavaScript辐马,DOM)

  • HTML:負(fù)責(zé)提供標(biāo)簽,對(duì)數(shù)據(jù)進(jìn)行封裝朋腋,目的是便于對(duì)該標(biāo)簽中的數(shù)據(jù)進(jìn)行操作

    簡(jiǎn)述:用標(biāo)簽封裝數(shù)據(jù)

  • CSS:負(fù)責(zé)提供樣式屬性齐疙,對(duì)標(biāo)簽中的數(shù)據(jù)進(jìn)行樣式的定義

    簡(jiǎn)述:對(duì)數(shù)據(jù)進(jìn)行樣式定義

  • DOM:負(fù)責(zé)將標(biāo)簽型文檔以及文檔中的所有內(nèi)容進(jìn)行解析膜楷,并封裝成對(duì)象旭咽,在對(duì)象中定義了更多的屬性和行為,便于對(duì)對(duì)象操作

    簡(jiǎn)述:將文檔和標(biāo)簽及其他內(nèi)容變成對(duì)象

  • JavaScript:負(fù)責(zé)提供程序設(shè)計(jì)語(yǔ)言赌厅,對(duì)頁(yè)面中的對(duì)象進(jìn)行邏輯操作

    簡(jiǎn)述:頁(yè)面的行為定義穷绵,頁(yè)面的動(dòng)態(tài)效果,是動(dòng)態(tài)效果的主力編程語(yǔ)言

DHTML + XMLhttpRequest = AJAX


BOM模型

BOM:Browser Object Model(瀏覽器對(duì)象模型)這個(gè)模型方便操作瀏覽器

瀏覽器對(duì)應(yīng)的對(duì)象就是window對(duì)象特愿,可以通過(guò)查閱DHTML api獲得

<input type = "button" value = "演示window對(duì)象" onclick = "windowDemo()" />
<script type = "text/javascript">
    function windowDemo(){
        // 獲取瀏覽器信息navigator
        var name = window.navigator.appName;
        var version = navigator.appVersion;   // window可以省略
        document.write(name + ":" + version);
    }
    
    function windowDemo1(){
        // 演示地址欄 location
        var pro = location.protocol;  // file
        var text = location.href;   // file:///E:/demo.html
        // 給location的href屬性設(shè)置一個(gè)值仲墨。改變了地址欄的值,并對(duì)其進(jìn)行了解析揍障,如果是http目养,還進(jìn)行連接訪問(wèn)
        location.;
        document.write(pro);
    }
    
    function windowDemo2(){
        // 確認(rèn)點(diǎn)擊彈窗
        var b = confirm("are you sure onClick!");
        alert(b);
        // 設(shè)置鬧鐘
        var id = setTimeout("alert('time run')", 4000);       // 4s后執(zhí)行
        var id1 = setInterval("alert('Interval run')", 3000);    // 每3s執(zhí)行一次
        clearInterval(id1);
        clearTimeout(id);
    }
    
    function windowMove(){
        moveBy(10,10);  // 每次點(diǎn)擊,窗口移動(dòng)x = 10, y = 10
        moveTo(40,50);  // 移動(dòng)到指定位置
    }
    
    function windowOnunload(){
        onunload = function(){  // 3
            alert("unload run");
        }
        onload = function(){  // 1
            alert("load run");
            window.status = "a load is finish"
        }
        onbeforeunload = function(){  // 2
            alert("before unload run");
        }
    }
</script>

練習(xí):廣告彈窗

<html>
    <head>
        <meta http-equiv = "Content-Type" content = "text/html; charset = GBK">
        <title>test</title>
    </head>
    <body>
        <script type = "text/javascript">
            /**
             *  彈窗廣告效果毒嫡,頁(yè)面一加載完就執(zhí)行
             */
            onload = function(){
                open("./AD.html", "_blank","height = 300, width = 400, status = no, toolbar = no, location = no");
            }
            // 一分鐘獲取一次焦點(diǎn)
            setInterval("focus()", 1000);
        </script>
    </body>
</html>

Document對(duì)象

該對(duì)象將標(biāo)記型文檔進(jìn)行封裝癌蚁,該對(duì)象的作用,是對(duì)可以標(biāo)記型文檔進(jìn)行操作

最常見(jiàn)的操作:想要實(shí)現(xiàn)動(dòng)態(tài)效果,需要對(duì)節(jié)點(diǎn)操作努释,那么要先獲取到這個(gè)節(jié)點(diǎn)碘梢。要想獲取節(jié)點(diǎn),就必須先要獲取到節(jié)點(diǎn)所屬的文檔對(duì)象document

獲取節(jié)點(diǎn)的方法體現(xiàn)

  1. getElementById():通過(guò)標(biāo)簽的id屬性值伐蒂,獲取該標(biāo)簽節(jié)點(diǎn)煞躬。返回該標(biāo)簽節(jié)點(diǎn)
  2. getElementsByName():通過(guò)標(biāo)簽的name屬性,獲取該節(jié)點(diǎn)逸邦。因?yàn)閚ame有相同恩沛,返回該節(jié)點(diǎn)數(shù)組
  3. getElementsByTagName():通過(guò)標(biāo)簽名,獲取該標(biāo)簽節(jié)點(diǎn)缕减。因?yàn)闃?biāo)簽名會(huì)重復(fù)复唤,返回該標(biāo)簽數(shù)組
  4. 凡是帶s返回的都是數(shù)組
  • 常見(jiàn)節(jié)點(diǎn)有三種:
    1. 標(biāo)簽節(jié)點(diǎn):類型 1
    2. 屬性節(jié)點(diǎn):類型 2
    3. 文本節(jié)點(diǎn):類型 3
  • 標(biāo)簽型節(jié)點(diǎn)是沒(méi)有值的,屬性和文本節(jié)點(diǎn)是可以有值的
<html>
    <head>
        <meta http-equiv = "Content-Type" content = "text/html; charset = utf-8">
        <title>document</title>
    </head>
    <body>
        <div id = "hh">11111111111111111</div>    <!-- getElementById -->
        <input type = "texy" name = "user"  />    <!-- getElementsByName -->
        <a >百度</a>    <!-- getElementsByTagName -->
        <a >百度1</a>
        <a >百度2</a>
        <div id = "news">
            <a >百度</a>
            <a >百度1</a>
            <a >百度2</a>
        </div>
        
        <input type = "button" value = "演示document獲取節(jié)點(diǎn)" onclick = "getNodeDemo()" />
        
        <script type = "text/javascript">
           function getNodeDemo(){
               var hhNode = document.getElementById("hh");
               console.log(hhNode.nodeName + hhNode.nodeType + hhNode.nodeValue);
               // 獲取div中的文本
               var text = hhNode.innerHTML;   // 11111111111111111
               // 修改div中的文本
               hhNode.innerHTML = "hhhhhhhhhhhhhhh".fontcolor("red");
               ---------------------------------------------------------------------------
               var nodes = document.getElementsByName("user");
               console.log(nodes[0].type + nodes[0].value); // text  文本框?qū)懮赌蒙?               var userNode = document.getElementsByName("user")[0];  // 須保證name = user 只有唯一一個(gè)
               ---------------------------------------------------------------------------
               var aNode = document.getElementsByTagName("a");
               console.log(aNode[0].innerHTML);
               // 給所有超鏈接設(shè)置新窗口打開(kāi)
               for(var i = 0; i < aNode.length; i++){
                   aNode[i].target = "_blank";
               }
               // 給部分超鏈接設(shè)置打開(kāi)新窗口
               var newNode = document.getElementById("news");
               var newArrNode = newNode.getElementsByTagName("a");
               for(var i = 0; i < newArrNode.length; i++){
                   newArrNode[i].target = "_blank";
               }
           }
        </script>
    </body>
</html>

通過(guò)節(jié)點(diǎn)的層次關(guān)系獲取節(jié)點(diǎn)

  1. 父節(jié)點(diǎn):parentNode對(duì)應(yīng)一個(gè)節(jié)點(diǎn)對(duì)象
  2. 子節(jié)點(diǎn):childNodes對(duì)應(yīng)一個(gè)節(jié)點(diǎn)集合烛卧,只包含下一層子節(jié)點(diǎn)佛纫,沒(méi)有孫子節(jié)點(diǎn)
  3. 兄弟節(jié)點(diǎn):盡量少用兄弟節(jié)點(diǎn),\color{red}{因?yàn)樵诮馕鰰r(shí)會(huì)出現(xiàn)瀏覽器不同解析不一致总放,會(huì)出現(xiàn)解析出標(biāo)簽間的空白文本節(jié)點(diǎn)}
    • 上一個(gè)兄弟節(jié)點(diǎn):previousSibling
    • 下一個(gè)兄弟節(jié)點(diǎn):nextSibling
<html>
    <head>
        <title>title</title>
    </head>
    <body>
        <input type = "botton" value = "click" />
        <div>div區(qū)域</div>
        <table id = "table">
            <tr>
                <td>d1</td>
                <td>d2</td>
            </tr>
        </table>
        <dl>
            <dt>up</dt>
            <dt>down</dt>
        </dl>
        <script type = "text/javascript">
            function getNodeByLevel(){
                // 獲取頁(yè)面中的表格節(jié)點(diǎn)
                var tableNode = document.getElementById("table");
                // 獲取父節(jié)點(diǎn)
                var pNode = tableNode.parentNode;   // body節(jié)點(diǎn)
                // 獲取子節(jié)點(diǎn)
                var cNode = tableNode.childNodes;   // tbody
                // 獲取孫子
                var cNode = cNode[0].childNodes[0].nodeName;  // tr
            }
        </script>
    </body>
</html>

節(jié)點(diǎn)操作

  1. 創(chuàng)建并添加
  2. 刪除
  3. 修改
<div id = "1">    </div>
<div id = "2">22222222</div>
<div id = "3">33333333</div>
<div id = "4">44444444</div>

<input type="botton" value = "創(chuàng)建并添加節(jié)點(diǎn)" onclick = "creatAndAdd()" />
<input type="botton" value = "刪除節(jié)點(diǎn) " onclick = "del()" />
<input type="botton" value = "修改節(jié)點(diǎn)" onclick = "update()" />

<script type = "text/javascript">
    // 增
    function creatAndAdd(){
        // 1.創(chuàng)建文本節(jié)點(diǎn)/按鈕節(jié)點(diǎn)
        var text = document.createTextNode("這是一個(gè)新節(jié)點(diǎn)")
        var botton = document.createElement("input");
        botton.type = "botton";
        botton.value = "click";
        // 2.獲取1節(jié)點(diǎn)
        var div1Node = document.getElementById("1");
        // 3.添加到1節(jié)點(diǎn)中
        div1Node.appendChild(text);
        div1Node.appendChild(botton);
    }
    function creatAndAdd1(){
      var div1Node = document.getElementById("1");
        div1Node.innerHTML = "hahahahaha";
        div1Node.innerHTML = "<input type = 'botton' value = 'newClick' />";
    }
    // 刪
    function del(){
        // 獲取2節(jié)點(diǎn)
        var div2Node = document.getElementById("2");
        // 刪除2節(jié)點(diǎn)
        div2Node.removeNode(false); // true:遞歸刪除節(jié)點(diǎn)下所有內(nèi)容  該方法較少使用
        // 一般使用removeChild方法
        div2Node.parentNode.removeChild(div2Node);
    }
    // 改
    function update(){
        // 獲取1呈宇,3節(jié)點(diǎn)
        var div1Node = document.getElementById("1");
        var div3Node = document.getElementById("3");
        // 用3替換1節(jié)點(diǎn)
        // div1Node.replaceNode(div3Node);    // 該操作會(huì)把原來(lái)的3搬到1位置上,3位置消失
        div1Node.parentNode.replaceChild(div3Node,div1Node);
        
        // 3不動(dòng)局雄,復(fù)制一份到1上
        var div3Copy = div3Node.cloneNode(true);  // true:遞歸克隆節(jié)點(diǎn)下所有內(nèi)容  該方法較少使用
        div1Node.parentNode.replaceChild(div3Copy,div1Node);
    }
</script>

核心DOM模型

  • Document:文檔對(duì)象
    1. 創(chuàng)建(獲壬摹):在HTML DOM模型中可以使用window對(duì)象來(lái)獲取
      1. window.document
      2. document
    2. 方法:
      1. 獲取Element對(duì)象:
        • getElementById():查找具有指定的唯一id的元素,id屬性一般唯一
        • getElementsByTagName():根據(jù)元素名稱獲取元素對(duì)象集合炬搭,返回?cái)?shù)組
        • getElementsByClassName():根據(jù)Class屬性值獲取元素對(duì)象集合蜈漓,返回?cái)?shù)組
        • getElementsByName():根據(jù)name屬性值獲取元素對(duì)象集合,返回?cái)?shù)組
      2. 創(chuàng)建其他DOM對(duì)象:
    3. 屬性
  • Element:元素對(duì)象
    1. 獲取/創(chuàng)建:通過(guò)document來(lái)獲取和創(chuàng)建
    2. 方法:
      • removeAttribute():刪除屬性
      • setAttribute()
  • Node:節(jié)點(diǎn)對(duì)象宫盔,其他5個(gè)的父對(duì)象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末融虽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灼芭,更是在濱河造成了極大的恐慌有额,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼绷,死亡現(xiàn)場(chǎng)離奇詭異巍佑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)寄悯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)萤衰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人猜旬,你說(shuō)我怎么就攤上這事脆栋「烀” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵筹吐,是天一觀的道長(zhǎng)糖耸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)丘薛,這世上最難降的妖魔是什么嘉竟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮洋侨,結(jié)果婚禮上舍扰,老公的妹妹穿的比我還像新娘。我一直安慰自己希坚,他們只是感情好边苹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著裁僧,像睡著了一般个束。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聊疲,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天茬底,我揣著相機(jī)與錄音,去河邊找鬼获洲。 笑死阱表,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贡珊。 我是一名探鬼主播最爬,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼门岔!你這毒婦竟也來(lái)了爱致?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤固歪,失蹤者是張志新(化名)和其女友劉穎蒜鸡,沒(méi)想到半個(gè)月后胯努,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牢裳,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年叶沛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒲讯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灰署,死狀恐怖判帮,靈堂內(nèi)的尸體忽然破棺而出局嘁,到底是詐尸還是另有隱情,我是刑警寧澤晦墙,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布悦昵,位于F島的核電站,受9級(jí)特大地震影響晌畅,放射性物質(zhì)發(fā)生泄漏但指。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一抗楔、第九天 我趴在偏房一處隱蔽的房頂上張望棋凳。 院中可真熱鬧,春花似錦连躏、人聲如沸剩岳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拍棕。三九已至,卻和暖如春勺良,著一層夾襖步出監(jiān)牢的瞬間莫湘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工郑气, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幅垮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓尾组,卻偏偏與公主長(zhǎng)得像忙芒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讳侨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • DOM Extensions(DOM擴(kuò)展) 雖然W3C中的DOM規(guī)范已經(jīng)很完備了呵萨,為了瀏覽器能有更多豐富的功能,各...
    小菜101閱讀 335評(píng)論 0 1
  • 之前通過(guò)深入學(xué)習(xí)DOM的相關(guān)知識(shí)跨跨,看了慕課網(wǎng)DOM探索之基礎(chǔ)詳解篇這個(gè)視頻(在最近看第三遍的時(shí)候潮峦,準(zhǔn)備記錄一點(diǎn)東西...
    微醺歲月閱讀 4,459評(píng)論 2 62
  • ====DOM==================================================...
    悅動(dòng)燃爆閱讀 210評(píng)論 0 0
  • 用來(lái)將標(biāo)記型文檔封裝成對(duì)象,并將標(biāo)記型文檔中的所有的內(nèi)容(標(biāo)簽勇婴,文本忱嘹,屬性等)都封裝成對(duì)象。封裝成對(duì)象的目...
    xinkule閱讀 510評(píng)論 0 0
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)耕渴、焦點(diǎn)拘悦、注意力、語(yǔ)言聯(lián)想橱脸、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析础米,社會(huì)...
    Jenaral閱讀 5,705評(píng)論 0 5