Web基礎(chǔ)復(fù)習(xí)——DOM

DOM

Document Object Model,文檔對(duì)象模型灯荧。是HTML和XML文檔的編程接口驶兜。
DOM將HTML和XML文檔作為一個(gè)樹形結(jié)構(gòu)聂儒,而樹葉被定義為節(jié)點(diǎn)灼擂。

HTML DOM

HTML DOM是關(guān)于如何獲取嫉入、修改焰盗、添加或刪除HTML元素的標(biāo)準(zhǔn)。

樹形結(jié)構(gòu)

<!DOCTYPE html>
<html>
<head>
    <title>HTML DOM</title>
</head>
<body>
    <h1 style="color:pink">今天的你也很可愛呢</h1>
    <p>Yeah, I'm pretty!</p>
</body>
</html>
HTML樹形結(jié)構(gòu)

整個(gè)HTML文檔的內(nèi)容都是節(jié)點(diǎn)咒林,HTML文檔為文檔節(jié)點(diǎn)熬拒,HTML元素為元素節(jié)點(diǎn),元素內(nèi)的文本是文本節(jié)點(diǎn)垫竞,HTML屬性是屬性節(jié)點(diǎn)澎粟,連注釋也是注釋節(jié)點(diǎn)。
在這個(gè)示例中欢瞪,元素<head>是元素<html>的首個(gè)子節(jié)點(diǎn)活烙,元素<body>是元素<html>的最后一個(gè)子節(jié)點(diǎn)。

對(duì)象

方法

在節(jié)點(diǎn)(HTML元素)上執(zhí)行的動(dòng)作引有。

getElementById(id)獲取帶有指定id的節(jié)點(diǎn)/元素;
appendChild(node)插入新的子節(jié)點(diǎn)/元素;
removeChild(node)刪除子節(jié)點(diǎn)/元素;
createAttribute(node)創(chuàng)建屬性節(jié)點(diǎn);
createElement(node)創(chuàng)建元素節(jié)點(diǎn);
createTextNode(node)創(chuàng)建文本節(jié)點(diǎn);
getAttribute(node)返回指定節(jié)點(diǎn)的屬性值;
createAttribute(node)修改指定屬性的值;

屬性

在節(jié)點(diǎn)(HTML元素)上設(shè)置和修改的值瓣颅。

innerHTML獲取或改變?nèi)我夤?jié)點(diǎn)/元素的文本值;
parentNode節(jié)點(diǎn)/元素的父節(jié)點(diǎn);
childNodes節(jié)點(diǎn)/元素的子節(jié)點(diǎn);
attributes節(jié)點(diǎn)/元素的屬性節(jié)點(diǎn);
nodeName規(guī)定節(jié)點(diǎn)名稱;
nodeVaue規(guī)定節(jié)點(diǎn)的值;
nodeType返回節(jié)點(diǎn)的類型,只讀譬正;

nodeName
只讀宫补;
元素節(jié)點(diǎn)的nodeName與標(biāo)簽名相同;
屬性節(jié)點(diǎn)的nodeName與屬性名相同曾我;
文本節(jié)點(diǎn)的nodeName始終是#text粉怕;
文檔節(jié)點(diǎn)的nodeName始終是#document;
nodeValue
元素節(jié)點(diǎn)的nodeValue是undefine或null;
文本節(jié)點(diǎn)的nodeValue是文本本身;
屬性節(jié)點(diǎn)的nodeValue是屬性值抒巢;

example:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>對(duì)象</title>
</head>
<body>
    <p id="demo1">You are pretty!</p>
    <p id="demo2">FlexibleCat</p>

    <script type="text/javascript">
        var x = document.getElementById('demo1').innerHTML;
        document.write(x);
        document.write('<br>');
        var y = document.getElementById('demo2');
        document.write(y.firstChild.nodeValue); //獲取元素的值
    </script>
</body>
</html>

運(yùn)行結(jié)果:

操作元素

創(chuàng)建新的HTML元素

方法:createElement()
過程:

  1. 創(chuàng)建一個(gè)新的元素:var para=document.createElement("h1");
  2. 假設(shè)要向這個(gè)元素添加文本贫贝,則要?jiǎng)?chuàng)建文本節(jié)點(diǎn):var node=document.createTextNode("這是一個(gè)大標(biāo)題");
  3. 要把這個(gè)新的元素和文本節(jié)點(diǎn)連起來,不能讓它們孤零零地各自在一邊:para.appendChild(node);
  4. 必須要向已有的元素追加這個(gè)新的元素,所以先查找已有代碼段中存在的元素:var element=document.getElementById("1");
  5. 向已有的元素追加新的元素:element.appendChild(para);
example:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>創(chuàng)建HTML元素</title>
</head>
<body id="1">
    <p id="2">這是已有的標(biāo)簽</p>
    <script type="text/javascript">
        var para=document.createElement("h1");
        var node=document.createTextNode("這是一個(gè)大標(biāo)題");
        para.appendChild(node);
        var element=document.getElementById("1");
        element.appendChild(para);
    </script>
</body>
</html>

運(yùn)行結(jié)果:

把創(chuàng)建的新HTML元素插入到某個(gè)元素前

方法:insertBefore()

  • 完成創(chuàng)建新的HTML元素的第四步之后稚晚,選擇想要安排在哪個(gè)元素前面: var child=document.getElementById("1");
  • 使用相應(yīng)方法把新建的HTML元素放在該元素之前:element.insertBefore(para, child);
example:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>創(chuàng)建HTML元素并選擇位置插入</title>
</head>
<body id="1">
    <p id="2">這是已有的標(biāo)簽</p>
    <script type="text/javascript">
        var para=document.createElement("h1");
        var node=document.createTextNode("這是一個(gè)大標(biāo)題");
        para.appendChild(node);
        var element=document.getElementById("1");
        var child=document.getElementById("2");
        element.insertBefore(para,child);
    </script>
</body>
</html>

運(yùn)行結(jié)果:

刪除已有的HTML元素

在刪除已有的HTML元素時(shí)崇堵,必須清楚該元素的父元素。從父元素中刪除要?jiǎng)h除的子元素客燕。

  1. 找到父元素:var parent=document.getElementById("1");
  2. 找到要?jiǎng)h除的子元素:var child=document.getElementById("2");
  3. 刪除:parent.removeChild(child);

如果不想費(fèi)腦子自己去找父元素的話鸳劳,可以使用parentNode屬性來查找。將第三部修改成child.parentNode.removeChild(child);就可以省去第一步找父元素也搓。

example:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>刪除已有的HTML元素</title>
</head>
<body id="1">
    <p id="2">這是一個(gè)優(yōu)秀的段落</p>
    <p id="3">這個(gè)段落不太優(yōu)秀</p>
    <p id="4">這個(gè)段落既優(yōu)秀又可愛呢</p>
    
    <script type="text/javascript">
        var parent=document.getElementById("1");
        var child=document.getElementById("3");
        parent.removeChild(child);
        var child1=document.getElementById("2");
        child1.parentNode.removeChild(child1);
    </script>
</body>
</html>

運(yùn)行結(jié)果:

替換HTML元素

與創(chuàng)建新的HTML元素差不多赏廓,將最后的方法換成replaceChild()即可。

修改HTML DOM

包括:

  • 改變HTML內(nèi)容傍妒;
  • 改變CSS樣式幔摸;
  • 改變HTML屬性;
  • 創(chuàng)建新的HTML元素颤练;
  • 刪除已有的HTML元素既忆;
  • 改變事件/處理程序;

事件的使用與Java中類似嗦玖,這里不再叨叨尿贫。其他形式,下面給出一個(gè)簡(jiǎn)單的示例還不是因?yàn)椴幌雽?/del>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>修改HTML元素</title>
</head>
<body id="0">
    <p id="1">今天的天氣有點(diǎn)冷</p>
    <p id="2">今天是有點(diǎn)冷呢</p>
    <script type="text/javascript">
        document.getElementById("1").innerHTML="天氣被修改啦"; //修改內(nèi)容
        document.getElementById("2").style.color="pink"; //改變樣式
        var son=document.createElement("p");
        var node=document.createTextNode('NEW');
        son.appendChild(node); //創(chuàng)建新的元素
        var element=document.getElementById("0");
        element.appendChild(son);
    </script>
</body>
</html>

運(yùn)行結(jié)果:

XML DOM

與HTML一樣踏揣,XML的每個(gè)成分都是節(jié)點(diǎn)。
XML DOM包含了便利XML樹匾乓,訪問捞稿、插入及刪除節(jié)點(diǎn)的方法/函數(shù)。
在對(duì)XML文檔進(jìn)行操作及訪問時(shí)拼缝,該XML文檔必須加載到XML DOM對(duì)象中娱局。

XML DOM解析器

大概流程:

  1. 加載XML文檔到XML DOM對(duì)象中;
  2. 解析器讀取XML文檔咧七;
  3. 把XML文檔轉(zhuǎn)換為XML DOM對(duì)象衰齐,使JS可以訪問它。

補(bǔ)充:
創(chuàng)建XMLHttpRequest對(duì)象
語法:xmlhttp=new XMLHttpRequest();
IE5和IE6(舊版本的IE)中继阻,使用ActiveX對(duì)象耻涛,即:
xmlhttp=new activeXObject("Microsoft.XMLHTTP");
創(chuàng)建DOMParser對(duì)象
語法:parser=new DOMParser();`
IE瀏覽器使用loadXML()方法,即:
xmlDOc

加載XML文檔示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>加載XML文檔</title>
</head>
<body>
    <script type="text/javascript">
        if (window.XMLHttpRequest) {
            xhttp=new XMLHttpRequest();
        }else {
            xhttp=new ActiveXObject("Microsoft.XMLHTTP");
        } //創(chuàng)建XMLHTTP對(duì)象

        xhttp.open("open", "demo.xml",false); //打開XMLHTTP對(duì)象
        xhttp.send(); //發(fā)送XML HTTP請(qǐng)求到服務(wù)器
        xmlDoc=xhttp.responseXML; //設(shè)置響應(yīng)為XML DOM對(duì)象
        document.write("XML文檔已被載入");
    </script>
</body>
</html>

運(yùn)行結(jié)果:

加載XML字符串實(shí)例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>加載字符串</title>
</head>
<body>
    <script type="text/javascript">
        text = "<family><person><name>Tiny Guo</name><age>25</age><profession>photographer</profession></person></family>";
        if (window.DOMParser) {
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(text, "text/xml");
        }else {
            //IE瀏覽器用loadXML()方法載入字符串
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false; //判斷是否異步進(jìn)行
            xmlDoc.loadXML(text);
        }
        document.write("XML字符串已被載入");
    </script>
</body>
</html>

運(yùn)行結(jié)果:

為了使加載函數(shù)更容易維護(hù)瘟檩,可以把加載XML文檔的代碼存儲(chǔ)在函數(shù)中抹缕。

XML DOM的對(duì)象方法、屬性以及對(duì)節(jié)點(diǎn)的操作與HTML DOM中的基本相同墨辛,就不重復(fù)寫了卓研。下面寫點(diǎn)前面HTML DOM里面沒寫過的。

克隆節(jié)點(diǎn)

使用cloneNode()來復(fù)制一個(gè)節(jié)點(diǎn),并把它追加到XML文檔的根節(jié)點(diǎn)奏赘。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Clone</title>
</head>
<body>
    <script type="text/javascript">
        function loadXMLDoc(doc) {
            if (window.XMLHttpRequest) {
                xhttp=new XMLHttpRequest();
            } else {
                xhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xhttp.open("GET",doc,false);
            xhttp.send();
            return xhttp.responseXML;
        }

        xmlDoc = loadXMLDoc("demo.xml");
        //克隆person標(biāo)簽中的第一個(gè)節(jié)點(diǎn)
        x = xmlDoc.getElementsByTagName('person')[0];
        cloneNode = x.cloneNode(true);
        xmlDoc.documentElement.appendChild(cloneNode);

        //輸出name節(jié)點(diǎn)的所有文本值
        y = xmlDoc.getElementsByTagName("name");
        for (var i = 0; i <= y.length; i++) {
            document.write(y[i].childNodes[0].nodeValue);
            document.write("<br>");
        }
    </script>
</body>
</html>

運(yùn)行結(jié)果:

關(guān)于對(duì)象寥闪、對(duì)象屬性和對(duì)象方法

可能初學(xué)者一開始對(duì)這三個(gè)東西沒什么大感覺,感覺好像簡(jiǎn)單的代碼也能寫磨淌,但是到后面就會(huì)稀里糊涂疲憋,啥是對(duì)象啊伦糯?啥是對(duì)象屬性肮衲场?對(duì)象方法又是啥敛纲?

這里來通俗的解釋一下這三個(gè)東西:
對(duì)象喂击,可以理解為任何一個(gè)被操作的東西;
對(duì)象屬性淤翔,反應(yīng)對(duì)象的某些特定性質(zhì)的翰绊,比如數(shù)據(jù)的字節(jié)數(shù)、圖片的大小等旁壮。表現(xiàn)形式一般為"對(duì)象名.屬性名"监嗜;
對(duì)象方法,能夠在對(duì)象上執(zhí)行的動(dòng)作抡谐。表現(xiàn)形式為函數(shù)裁奇。函數(shù)名一般開頭為setxxx()、getxxx()麦撵、removexxx()之類的刽肠。

具體的對(duì)象有需要且不清楚不知道的時(shí)候可以度娘,已經(jīng)是個(gè)大孩子了免胃,要學(xué)會(huì)自己搜索信息音五。

其他的點(diǎn)

  • 在DOM解析時(shí),不同的瀏覽器處理節(jié)點(diǎn)之間的換行羔沙、空格字符時(shí)躺涝,操作是不同的。IE瀏覽器不會(huì)把空的空白或換行作為文本節(jié)點(diǎn)扼雏,但是其他瀏覽器會(huì)坚嗜。example:
<!-- 以下代碼顯示demo.xml文檔的根元素有多少個(gè)子節(jié)點(diǎn) -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Clone</title>
</head>
<body>
    <script type="text/javascript">
        function loadXMLDoc(doc) {
            if (window.XMLHttpRequest) {
                xhttp=new XMLHttpRequest();
            } else {
                xhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xhttp.open("GET",doc,false);
            xhttp.send();
            return xhttp.responseXML;
        }

        xmlDoc = loadXMLDoc("demo.xml");
        
        x = xmlDoc.documentElement.childNodes;
        document.write("Have " + x.length + " child nodes");
    </script>
</body>
</html>

節(jié)點(diǎn)之間包含了換行、空白符呢蛤。

  • 可以通過檢查節(jié)點(diǎn)類型來忽略元素節(jié)點(diǎn)之間的空文本字節(jié)惶傻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市其障,隨后出現(xiàn)的幾起案子银室,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈敢,死亡現(xiàn)場(chǎng)離奇詭異辜荠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抓狭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伯病,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人否过,你說我怎么就攤上這事午笛。” “怎么了苗桂?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵药磺,是天一觀的道長。 經(jīng)常有香客問我煤伟,道長癌佩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任便锨,我火速辦了婚禮围辙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘放案。我一直安慰自己姚建,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布吱殉。 她就那樣靜靜地躺著桥胞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪考婴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天催烘,我揣著相機(jī)與錄音沥阱,去河邊找鬼。 笑死伊群,一個(gè)胖子當(dāng)著我的面吹牛考杉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舰始,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崇棠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了丸卷?” 一聲冷哼從身側(cè)響起枕稀,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后萎坷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凹联,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年哆档,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔽挠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓜浸,死狀恐怖澳淑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情插佛,我是刑警寧澤杠巡,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站朗涩,受9級(jí)特大地震影響忽孽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谢床,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一兄一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧识腿,春花似錦出革、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至成箫,卻和暖如春展箱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹬昌。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工混驰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皂贩。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓栖榨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親明刷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婴栽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355