天天看點

第七章:DOM模型一

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

對文檔的結構化的表述

定義了在程式中對該結構進行通路的方式

DOM 分類

核心 DOM:用于任何結構化文檔的标準模型

定義了與系統平台和程式設計語言無關的接口,DOM 是一種 API

HTML DOM:用于 HTML 文檔的标準模型

XML DOM:用于 XML 文檔的标準模型

DOM 作用

通路文檔内容,包括元素、屬性、文本

增加文檔内容,包括元素、屬性、文本

删除文檔内容,包括元素、屬性、文本

修改文檔内容,包括元素、屬性、文本

DOM 的應用十分廣泛,各種網頁特效均有 DOM 的蹤影

DOM 樹

DOM 将 HTML 文檔抽象為樹形結構,稱這棵樹為 DOM 樹

HTML 中的每一項内容都可以在 DOM 樹中找到

對文檔内容的操作即對 DOM 樹的操作

HTML 文檔中的所有内容都是節點:

是根節點,其他标簽都是元素,屬性是屬性。 ① 整個文檔是一個文檔節點 ; ② 每個 HTML 元素是元素節點 ; ③ HTML 元素内的文本是文本節點 ,回車也是文本節點; ④ 每個 HTML 屬性是屬性節點 ; ⑤ 注釋是注釋節點 ;

DOM 節點是一個對象,擁有屬性和方法

元素節點

HTML 開始标簽中的屬性為元素節點對象的屬性

HTML 開始标簽中的事件屬性為元素節點對象的方法

元素節點對象中的方法函數中的 this 指向目前觸發事件的元素

屬性節點

文本節點

空格、換行空格屬于文本節點

<body>
	<div id="contianer">
	</div>
</body>
<!-- lastchild-->
	<script>
		//得到一個元素的節點
		var contianer=document.getElementById("contianer")
		//事件也可以看成一個特殊的屬性
		//在對象的方法内部,this指向目前對象
		//DOM對象的回調函數内部,this指向目前對象
		contianer.onclick=function(){
			console.log(this.id);
		}
		console.log(contianer);

	</script>
           
第七章:DOM模型一

元素樹

在節點樹中,頂端節點被稱為根(root)

父節點: 每個節點都有父節點、除非該元素是文檔的根節點

子節點: 每個元素節點可以有 0 個、1 個或多個子節點

同胞節點: 指擁有相同父節點的節點

JavaScript 解釋器會為載入的每個 HTML文檔建立一個對應的document 對象

通過使用 document對象,可以從腳本中對 HTML 頁面中的所有節點進行通路

擷取節點的方式:

直接擷取:

通過ID屬性擷取節點

通過标簽名獲得所有的同名節點

通過類名擷取所有相同類名的标簽

通過節點關系擷取

通過父節點擷取子節點

通過子節點獲得父節點

獲得前後兄弟節點

//第一個單詞首字母小寫,其餘單詞首字母大寫(小駝峰命名法)

通過 id 屬性獲得節點(ID選擇器)

document.getElementById( )

通過标簽名獲得所有同名标簽(标簽選擇器)

document.getElementsByTagName( )

傳回值是數組,用時注意帶上角标

通過類名獲得所有類名相同的标簽(類選擇器)

document.getElementsByClassName( )

var arr=["welcome","to the","westworld"]; 
		var pList=document.getElementsByTagName("p");
		for(var num=0;num<pList.length;++num)
		{
			//雙标記标簽可以使用這個屬性
			pList[num].innerHTML=arr[num];
		}
           

document.documentElement 傳回 HTML 文檔中元素

document.head 傳回 HTML 文檔中元素

document.body 傳回 HTML 文檔中元素

<body>
    <div id="container">
        <p id="p1">這是一個段落</p>
    </div>
</body>
<script>
    p1.onclick = function() {
        container.replaceChild(hNode, p1);
    }
</script>
           
  • childNodes 屬性——傳回節點的子節點集合。之後可以通過循環或者索引找到需要的元素節點。

    例:document.getElementById(“myList”).childNodes;

    document.getElementById(“myList”).childNodes[0];

  • children 屬性——傳回節點的所有元素子節點集合。

    例:document.getElementById(“myList”).children;

    document.getElementById(“myList”).children[0];

DOM對象。chilnodes表示子節點的集合(子節點對象),包括空格,注釋,實際網頁元素

children,擷取具體的元素子節點對象的集合,不包含空格與注釋

  • firstChild 屬性——傳回指定節點的首個子節點。可遞歸使用,即支援 parentObj.firstChild.firstChild… 的形式,如此可獲得更深層次的節點。

    例:document.getElementById(“myList”).firstChild;

  • firstElementChild 屬性——傳回指定節點的首個元素子節點。

    例:document.getElementById(“myList”).firstElementChild;

  • lastChild 屬性——傳回指定節點的最後一個子節點。可遞歸使用,即支援 parentObj.lastChild.lastChild… 的形式,如此可獲得更深層次的節點。

    例:document.getElementById(“myList”).lastChild;

  • lastElementChild 屬性——傳回指定節點的最後一個元素子節點

    例:document.getElementById(“myList”).lastElementChild;

parentNode 屬性——傳回指定節點的父節點

parentElement 屬性——傳回指定節點的父節點

html代碼:
<h1>新聞動态<span id="time">2018-10-7</span></h1>
js代碼:
var parent= document.getElementById("time").parentNode;
console.log(parent.innerHTML);
輸出結果:
新聞動态<span id="time">2018-10-7</span>
           
  • previous(Element)Sibling 屬性——傳回指定節點緊跟的前一個(元素)兄弟節點。

    例:document.getElementById(“item1”).previousSibling;

  • next(Element)Sibling 屬性——傳回指定節點之後緊跟的一個(元素)兄弟節點

    例:document.getElementById(“item2”).nextSibling

  • innerHTML 屬性

    innerHTML 是 DOM 中元素節點的屬性,相當于一個容器

    用于擷取或改變任意元素節點的内容,該屬性可讀可寫

    操作簡單,幾乎所有浏覽器均支援 innerText 屬性

<body>
	<ul id="list">
		<li class="bg">香蕉</li>
		<li class="bg">蘋果</li>
		<li class="bg">橘子</li>
	</ul>
</body>
	<script>
		var list=document.getElementById("list");
		list.innerHTML="<h1>這是标題</h1>"//會解析内容
		list.innerText="<h1>這是标題</h1>";//不解析内容
		//這是标題
		//<h1>這是标題</h1>
		console.log(list.innerText);//過濾标記,純文字
	</script>
           
  • textContent 屬性//有缺陷,不使用
  • 讀取元素節點内容

    var txt = document.getElementById(“intro”).innerHTML;

    document.write(txt);

  • 修改元素節點内容

    document.getElementById(“intro”).innerHTML = “hello”;

  • 擷取某一進制素節點的屬性

    node.getAttribute( attrName )

  • 設定某一進制素節點的屬性

    node.setAttribute( attrName,value )

    當屬性存在時,為修改相應屬性值

    當屬性不存在時,為添加相應屬性

  • 删除某一進制素節點的屬性

    node.removeAttribute( attrName )

  • 判斷某一進制素節點是否含有某屬性

    node.hasAttribute( attrName )

    傳回值為布爾值 true/false

設定節點屬性 當屬性不存在時,添加相應屬性
    three.setAttribute("class", "red");

    當屬性存在時,為修改相應屬性值
   three.setAttribute("class", "green");
           
var btn2=document.getElementById("btn2");
		btn2.onclick=function(){
			this.parentNode.firstElementChild.removeAttribute("class");//移除class屬性
		}
		btn2.onclick=function(){
			var isExist=this.parentNode.firstElementChild.hasAttribute("class");//判斷是否有class
			console.log(isExist);//傳回判斷結果
			if(isExist==true)
			{
				this.parentNode.firstElementChild.removeAttribute("class");//移除class屬性
			}
		}
           

DOM 操作注意事項:

擷取 DOM 節點的操作要在被浏覽器加載之後進行
 <script>标簽放在 HTML 内容後面,即<body>結束标簽前面
 通用性強,幾乎所有浏覽器均支援
 操作比較複雜,書寫代碼量過大
 DOM 節點、DOM 樹與元素樹
 通路 DOM 元素節點的方式
 直接通路
 間接通路
 特殊節點通路
 元素節點的屬性操作
 增、删、改、查、判斷方法
 元素節點的文本内容操作 —— innerHTML
           
<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>綜合練習</title>
    <style>
    body {
        padding: 50px;
    }

    td {
        width: 100px;
    }
    </style>
</head>

<body>
    <table id="tab" border="1" cellspacing="0">
        <tr>
            <td>
                <button>删除本行0</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行1</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行2</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行3</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行4</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行5</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行6</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>
                <button>删除本行7</button>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </table>
    <script>
    //效果:點選按鈕,删除按鈕所在行
    var button = document.getElementsByTagName("button"); //類似數組
    var tab = document.getElementById('tab')
    for (var i = 0; i < button.length; i++) { //周遊類似數組
        button[i].onclick = function() {
            // this.parentNode.parentNode.innerHTML = "";
            tab.children[0].removeChild(this.parentNode.parentNode)
        }

    }
    </script>
</body>

</html>
           
<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
    body {
        padding: 50px;
    }

    #div {
        display: inline-flex;
        flex-wrap: wrap;
    }

    .circle {
        width: 100px;
        height: 100px;
        margin: 15px;
        border-radius: 50%;
    }
    </style>
</head>

<body>
    <div id="div">
        <div class="circle" style="background:rgba(100,100,200,0.4)"></div>
    </div>
    <script>
    //效果:點選桌面圓,然後添加一個随機顔色的圓

    //第一步:随機顔色函數
    function color() {
        var r = parseInt(Math.random() * 255);
        var g = parseInt(Math.random() * 255);
        var b = parseInt(Math.random() * 255);
        var a = Math.random() * 0.7 + 0.3;
        //a = a.toFixed(2)  //保留兩位小數
        var rgba = "rgba(" + r + "," + g + "," + b + "," + a + ")";

        return rgba;
    }

    //第二步:添加随機顔色圓函數
    function circle(that) {
        that.innerHTML += '<div class="circle" style="background:' + color() + '"></div>';//字元串拼接
    }

    //第三步:為div綁定函數功能
    var div = document.getElementById("div");
    div.setAttribute("onclick", "circle(this)");
    
    </script>
</body>

</html>
           
<body>
    <p>我喜歡的水果:</p>
    <ul id="fruit">
        <li>百香果</li>
        <li>山竹</li>
        <li class="three">火龍果</li>
        <li>猕猴桃</li>
    </ul>
    <p>我喜歡的動物:</p>
    <ul id="animal">
        <li>小猴子</li>
        <li>獅子</li>
        <li class="three">小豬</li>
        <li>大熊貓</li>
    </ul>
    <script>
    //類似數組對象 具有長度屬性,可以周遊,但不是真正的數組,不具有數組的方法
    // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Typed_arrays


    //類似數組對象周遊
    var p = document.getElementsByTagName("p");//傳回類似數組對象
    for (var i = 0; i < p.length; i++) {
        document.write(p[i].innerHTML)
        document.write("<br/>");
    }
    </script>