1. 程式人生 > >javascript day05 外部物件,document物件(DOM模型),查詢節點的方式

javascript day05 外部物件,document物件(DOM模型),查詢節點的方式

目錄

1.外部物件


    1.BOM 和 DOM

        BOM:Browser Object Model
            瀏覽器物件模型
            將瀏覽器比喻成一個物件-window(網頁初始化時自動建立的),可以通過 window物件操控瀏覽器中的內容

        DOM:Document Object Model
            文件物件模型
            將HTML文件比喻成一個物件 - document(屬於window的一個屬性),可以靈活的操控網頁上的內容

    2.window 物件(BOM模型)

        1.作用

            表示瀏覽器
            window物件下的屬性和方法在使用時,可以省略window.直接去呼叫
            ex:
                window.alert() --> alert()
                window.prompt() --> prompt()
                window.document --> document
                window.history --> history

        2.window中的對話方塊

            1.警告框
                window.alert() / alert()
            2.輸入框
                window.prompt() / prompt()
            3.確認框
                window.confirm("") / confirm("")
                點選 "確定" 按鈕的話,返回 True 其餘所有操作,都返回false

            練習:
                1.網頁中建立一個 按鈕,顯示"關閉"
                2.點選按鈕時,彈出確認框"確認關閉網頁嗎"
                3.如果點選確定的話,則關閉網頁
                    關閉網頁: window.close();
                4.否則什麼都不操作即可

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
</head>
<body>
    <script>
        function testConfirm(){
            if(confirm("確認關閉網頁嗎")){
                close();
            }                
        }
    </script>
    <button onclick="testConfirm()">關閉</button>
</body>
</html>

        3.window中的定時器

            1.定時器的分類
                1.週期性定時器
                    每間隔一段時間後,就執行一段程式,反覆執行
                2.一次性定時器
                    在指定的時間間隔後,只執行一次操作
            2.週期性定時器
                1.宣告定時器
                    var ret = setInterval(fun,time);
                    fun:函式,要週期性執行的操作,可以是匿名函式
                    time:要間隔的時間週期,以毫秒為單位的數字
                    ret:返回已建立好的定時器物件
                2.清除定時器
                    window.clearInterval(timer)
                    timer: 要停止的定時器物件

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
</head>
<body>
    <script>
        // 儲存建立好的定時器物件
        var timer;
        // 每隔1s列印當前時間
        function showTime(){
            timer = setInterval(function(){
                var now = new Date();
                console.log(now.toLocaleString());
            },1000);
        }
        // 暫停定時器(清除)
        function stopTime(){
            clearInterval(timer);
        }
    </script>
    <button onclick="showTime()">顯示時間</button>
    <button onclick="stopTime()">暫停</button>
</body>
</html>

            3.一次性定時器
                1.宣告定時器
                    var ret = setTimeout(fun,time);
                    fun:等待一定時間後要執行的操作
                    time:要等待的時長,以ms為單位
                    ret:建立好的定時器物件
                2.清除定時器
                    clearTimeout(timer);
                    timer:已經建立好的一次性定時器物件
                練習:
                    1.建立一個按鈕
                    2.點選按鈕時,彈出一個確認框
                        確認一下是否要關閉網頁??
                    3.如果使用者點選確定的話,5s鍾之後再關閉網頁

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
</head>
<body>
    <script>
        function closePage(){
            if(confirm("確認關閉網頁嗎")){
                setTimeout(function(){
                    close();
                },5000);            
            }
        }
    </script>
    <button onclick="closePage()">關閉</button>
</body>
</html>

        4.window中的屬性

            1.screen 屬性
                作用:獲取客戶端顯示器的相關資訊
                屬性:
                    1.width / height
                        獲取螢幕解析度
                    2.availWidth / availHeight
                        可用寬度和可用高度
            2.history 屬性
                1.作用:處理當前視窗所訪問過的url地址們
                2.屬性&方法:
                    1.屬性:length,表示當前視窗所訪問過的url數量
                    2.方法:
                        1.back():後退
                        2.forward():前進
                        3.go(num)
                            在當前頁面的基礎上前進或後退num步
                            num:
                                取值為正,前進
                                取值為負,後退
            3.location 屬性
                1.作用
                    表示瀏覽器位址列的資訊
                2.屬性&方法
                    1.屬性:href
                        表示當前視窗中正在瀏覽的網頁地址
                        如果為href屬性設定值的話,相當於實現了瀏覽器跳轉的功能
                        location.href = www.baidu.com
                    2.方法:reload()
                        從新載入當前網頁,等同於重新整理操作
            4.navigator 屬性
                1.作用
                    封裝了瀏覽器的相關資訊
                2.屬性
                    userAgent:顯示瀏覽器相關資訊
            5.document 屬性(重點)

2.document 物件(DOM模型)

    1.document 的概述

        document物件,是DOM模型中的頂層物件,封裝了所有和HTML元素相關的屬性,方法以及事件.
        由於document是屬於window物件的核心屬性之一,所以不用宣告在網頁中就可以直接使用

        網頁在載入的時候,會在記憶體中形成一顆節點樹(DOM樹).DOM樹會封裝網頁上所有的內容.
        網頁上的每一個元素,每一個屬性,每一段文字,都是DOM樹上的一個獨立的"節點"

        DOM所提供的操作:
            1.查詢節點的操作方法
            2.讀取節點的資訊
            3.修改節點的資訊
            4.刪除節點
            5.建立節點

        注意:只要DOM樹上的內容產生變化的話,網頁也會一同變化

        DOM樹上的節點的型別:
            1.元素節點 - 表示的是網頁中的一個元素
            2.屬性節點 - 表示的是元素中的一個屬性
            3.文字節點 - 表示的是元素中的文字內容
            4.註釋節點 - 表示網頁中的一個註釋
            5.文件節點 - 表示整個HTML文件

    2.查詢元素節點

        1.通過元素id查詢元素節點
            前提:元素一定要具備id屬性,否則無法查詢
            方法:
            var elem = document.getElementById("元素ID");(低版本支援)
                elem:對應的ID的元素在JS中的表現形式 - DOM元素/DOM物件
                變簡介的方法
                    1.在DOM中,允許直接使用元素的ID進行元素的操作(低版本瀏覽器不支援)
                    2.放進函式裡
                        function $(id){
                            return document.getElementById(id);
                        }
        DOM物件屬性:
            1.innerHTML
                修改 或 獲取當前DOM物件的HTML檔案
            2.innerText
                修改 或 獲取當前DOM物件的普通文字
            注意:以上兩個屬性只針對雙標記有效


            3.value
                該屬性只針對表單控制元件,允許獲取或設定表單控制元件的值

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
</head>
<body>
    <p>
        使用者名稱稱:<input type="text" id="uname">
    </p>
    <p>
        <button onclick="getUname()">獲取/設定文字框的值</button>
    </p>
    <script>
        function getUname(){
            // 通過id=uname 得到input元素
            var uname = document.getElementById("uname");
            // 獲取 或 設定 uname 的 value值
            console.log(uname.value);
            // 為 uname 的 value 屬性賦值
            uname.value = "動態設定的文字"
        }
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<p>
		使用者名稱稱: <input type="text" id="uname">
		<button onclick="checkUname()">驗證</button>
	</p>
	<div id="uname-show"></div>
	<script src="common.js"></script>
	<script>
		/*function checkUname(){
			//1.獲取 id 為 uname 的文字框的 value 值
			var val = document.getElementById("uname").value;
			var uShow = document.getElementById("uname-show");
			//2.判斷 value 值得長度範圍,並將結果顯示在 id為 uname-show 的 div 元素中
			if(val.length >= 6 && val.length <= 18){
				uShow.innerText = "通過";
			}else{
				uShow.innerText = "使用者名稱稱不規範";
			}
		}*/

		function checkUname(){
			
			//1.獲取 id 為 uname 的文字框的 value 值
			var val = $("uname").value;
			//2.判斷 value 值得長度範圍,並將結果顯示在 id為 uname-show 的 div 元素中
			if(val.length >= 6 && val.length <= 18){
				$("uname-show").innerText = "通過";
			}else{
				$("uname-show").innerText = "使用者名稱稱不規範";
			}
		}
	</script>
</body>
</html>

    3.讀取節點的資訊

        1.節點的型別
            屬性:nodeType
            值:
                返回1:元素節點
                返回2:屬性節點
                返回3:文字節點
                返回8:註釋節點
                返回9:文件節點
        2.節點名稱
            屬性:nodeName
                元素節點 或 屬性節點:返回標籤名或屬性名
                文字節點:返回 #text
                文件節點:返回 #document
                註釋節點:返回 #comment

    4.獲取 或 設定 元素節點的屬性

        所有元素節點具備以下方法,用於操作屬性:
        1.getAttribute("attrName")
            作用:獲取指定屬性的值
            attrName:要獲取的屬性名稱
            返回值:attrName屬性對應的值
        2.setAttribute("attrName","attrValue")
            作用:設定指定屬性的值
            attrName:要設定的屬性名
            attrValue:要設定的屬性值
        3.removeAttribute("attrName")
            作用:將 attrName 屬性從節點中刪除出去
        練習:
            1.建立一個網頁
            2.建立一個a標記,
                連結地址為:http://www.baidu.com
                文字:百度
            3.建立一個按鈕,文字為修改
            4.點選按鈕時,將a標記修改為
                連結地址為:http://www.tmooc.cn
                文字:TMOOC

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
</head>
<body>
    <a href="http://www.baidu.com" id="anchor">百度</a>
    <button onclick="btnChange()">變</button>
    <script src="common.js"></script>
    <script>
        function btnChange(){
            var a = $("anchor");
            a.innerHTML = "TMOOC";
            a.setAttribute("href","http://www.tmooc.cn");
        }
    </script>
</body>
</html>

    5.元素節點的樣式

        1.使用setAttribute() 設定 class 屬性值
            相當於動態的為元素繫結類選擇器
            elem.setAttribute("class","類選擇器")
        2.使用元素的 className 屬性修改 class 的值
            elem.className = "類選擇器"
        3.變相的使用內聯方式設定屬性 
            elem.style.css屬性名 = 值;

            elem.style.color = "red";
            注意:
                如果css屬性名中包含"-"的話,"-"要取消,並且後面的單詞的首字元變大寫
                elem.style.fontSize = "18px";
                //設定 elem 元素有邊框的顏色為紅色
                elem.style.borderRightColor:"red";

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
    <style>
        #main{
            width: 300px;
            height: 200px;
            background: red;

        }
        .hide{
            display: none;
        }
    </style>
</head>
<body>
    <script src="common.js"></script>
    <div id="main">這是測試div</div>
    <button onclick="btnRadius()">邊框倒角</button>
    <button onclick="btnShow()">顯示</button>
    <button onclick="btnHide()">隱藏</button>
    <script>
        function btnRadius(){
            $("main").style.borderRadius = "50%";
        }
        function btnHide(){
            // 動態的為 #main 元素繫結 class 屬性,值為 hide
            // $("main").setAttribute("class","hide"); 
            $("main").className="hide"
        }
        function btnShow(){
            //動態的將 #main 的 class 屬性值清除
            // $("main").removeAttribute("class");
            $("main").className = "";

        }
    </script>
</body>
</html>

3.查詢節點的方式

    1.根據id查詢  
        document.getElementById();
    2.根據節點的層級關係查詢節點
        1.parentNode屬性
            返回當前節點的父節點元素
        2.childNodes屬性
            返回當前節點的所有子元素陣列
        3.chiledren屬性
            返回當前節點的所有子元素陣列(元素節點)
        4.nextSibling
            獲取當前節點的下一個兄弟節點
        5.nextElementSibling
            獲取當前節點的下一個元素兄弟節點
        6.previousSibling
            獲取當前節點的上一個兄弟節點
        7.previousElementSibling
            獲取當前節點的上一個兄弟元素節點

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="main">
        <p id="pp">這是main中的p</p>
    </div>

    <div id="poem">
        <h3 id="title">靜夜思</h3>
        <p>床前明月光</p>
        <p>疑是地上霜</p>
        <p>舉頭望明月</p>
        <p>低頭思故鄉</p>
    </div>

    <button onclick="getParent()">獲取pp的父元素</button>
    <button onclick="getChild()">獲取poem的子元素</button>
    <button onclick="getChildren()">獲取poem的子元素</button>
    <button onclick="getNextSib()">獲取h3的下一個兄弟節點</button>

    <script src="common.js"></script>
    <script>
        function getNextSib(){
            //獲取下一個兄弟節點
            //var elem = $("title").nextSibling;

            //獲取下一個元素兄弟節點
            var elem=$("title").nextElementSibling;
            console.log(elem);
        }

        function getChildren(){
            var arr=$("poem").children;
            console.log(arr);
        }

        function getChild(){
            var poem = $("poem");
            var arr = poem.childNodes;
            //迴圈遍歷arr中的每個元素
            for(var i=0;i<arr.length;i++){
                // console.log(arr[i].nodeType + ":" + arr[i].nodeName);
                // 將元素節點過濾出來
                if(arr[i].nodeType == 1){
                    arr[i].style.color="red";
                }

                // arr[i].style.color = "red";
            }
        }

        function getParent(){
            var pp = $("pp");
            var parent = pp.parentNode;
            console.log(parent);
        }
    </script>
</body>
</html>