[Javascript]:BOM對象詳解和BOM與DOM的層次關係

BOM與DOM的結構層次圖

    

BOM對象是什麼

  • BOM:瀏覽器對象模型(Brower Object Model),是用於操作瀏覽器而出現的API,BOM對象則是Javascript對BOM接口的實現。
  • BOM提供了獨立於內容的、可以與瀏覽器窗口進行交互的對象結構。通過BOM對象可以訪問瀏覽器功能部件和屬性。
  • BOM中代表瀏覽器窗口的window對象是Javascript頂層對象,其他BOM對象均爲window對象的子對象。被作爲window對象的屬性來引用。
  • 其他BOM對象都是在window對象中進行操作。

DOM對象是什麼

DOM:文檔對象模型(Document Object Model),是W3C定義的一套用於處理HTML和XML文檔內容的標準編程接口API。javascript實現DOM接口的對象對應的是document對象,JS通過該對象來對HTML/XML文檔進行增刪改查。DOM定義了HTML和XML的邏輯結構,將整個頁面劃分成由層次節點構成的文檔,以樹的形式來展現,如上面那張圖所示。在BOM和DOM結構層次圖中,document對象屬於window對象,所以DOM也可以看作是BOM的一部分。

BOM對象大小寫的區別

      在查找BOM資料時,總會看到有的叫做Window對象、有的叫做window對象這種情況,和JS數據類型中的對象類型和基本類型的問題一樣,非常容易令人搞混淆兩者概念,很不嚴謹。關於此問題,所以在這裏將它們的概念理清楚,才能更好的理解基礎,而不是隻會用window、document對象來完成操作。
      都知道,在開發中,都有一些約定俗成的編程規範。例如面嚮對象語言中的類名一般採用大寫,包括接口、枚舉和註解等,而對象名、變量名一般採用小寫,方法採用駝峯寫法。它們的目的都是爲了方便區分,這些規範放在JS中,也是通用的。這裏我採用vs code來演示它們的作用:


從上面圖例中,可以很清楚的看到Window和Document其實是接口,而window、document和location這種纔是真正的對象,這些BOM對象就是實現這些BOM接口的實例,而且是單例模式。所以我們不能自己隨意創建BOM對象。

PS:在學習一個知識點時,除了多寫相關代碼之外,還需要去深入瞭解下所學的知識點,才能鞏固基礎。這樣才能明白自己在用什麼,以及該怎麼去用,這樣來學習纔會事半功倍,而且知識記得很牢。當以後遇到相關問題時,就可以避免一些沒必要的坑。


下面將介紹每個BOM對象的作用與用法。由於篇幅問題,DOM對象的相關知識放在後續博客文章中進行介紹。
  1. window對象 :表示瀏覽器窗口,是JS的頂層對象。
  2. location對象:瀏覽器當前的URL信息。
  3. navigator對象:瀏覽器本身信息。
  4. history對象:瀏覽器的瀏覽歷史記錄信息。
  5. screen對象:瀏覽器的屏幕信息。
  6. document對象:代表當前窗口的網頁文檔。該對象是JS對DOM的具體實現,本篇章不談論其用法。

 window對象 

  • 是BOM對象的核心,JS的頂層對象,瀏覽器窗口只要打開一個HTML文檔,瀏覽器就會爲我們創建一個window對象。
  • window對象是JS中的全局對象,可以在任何地方調用,而且任何對象的使用都會追溯到對window對象的訪問,所以在使用window對象的屬性和方法時,可以省略window這個前綴。看起來很像with語句塊的作用。
  • 簡寫案例:window.alert() ,可以直接用alert(). window.document.write(),可以簡寫成document.write()
下面的屬性和方法只是常用部分,如果想了解全部屬性和方法,可以點擊http://www.w3school.com.cn/jsref/dom_obj_window.asp查看window對象資料。
window對象屬性值 描述
closed 返回窗口是否已被關閉。true是已關閉,false是未關閉。
defaultStatus 設置或返回窗口狀態欄中的默認文本。
document 對 Document 對象的只讀引用。請參閱 Document 對象
history 對 History 對象的只讀引用。請參數 History 對象
location 用於窗口或框架的當前的URL信息。請參閱 Location 對象
navigator 對 Navigator 對象的只讀引用。請參數 Navigator 對象
screen 對 Screen 對象的只讀引用。請參數 Screen 對象
length 設置或返回窗口中的框架數量。
name 設置或返回窗口的名稱。
opener 返回對創建此窗口的窗口引用。即父窗口。
status 設置窗口狀態欄的文本。
self、window 返回對當前窗口的引用。等價於 window 屬性。它包含了對窗口自身的引用
window對象常用方法 描述

alert()

顯示帶有一段消息和一個確認按鈕的對話框。
open() 打開一個新瀏覽器窗口或查找一個已命名的窗口。可以獲得該窗口的window對象。
confirm() 顯示帶有一段消息以及確認按鈕和取消按鈕的對話框。確定則返回true,取消則false。
prompt() 顯示可提示用戶輸入的對話框。
setInterval() 按照指定的週期(以毫秒計)來調用函數或計算表達式。
setTimeout() 在指定的毫秒數後調用函數或計算表達式。只會執行一次。
clearInterval() 取消由 setInterval() 方法設置的 timeout。
clearTimeout() 取消由 setTimeout() 方法設置的 timeout。
close() 關閉瀏覽器窗口。
print() 打印當前窗口的內容。

window對象實例
<body>
    <!-- 加載網頁文檔後,彈出對話框,點擊確定後關閉當前網頁 -->
    <script>
        window.onload = function(){
            alert("點擊確定後,網頁就關閉了");
            window.close();
        }
    </script>
    網頁文檔加載完成~
</body>
<body  window.onunload = "closeChild()"> <!-- 頁面關閉事件 -->
    <script type="text/javascript">
        var newWindow; //接收子窗口的window對象
        // 打開一個新窗口
        function openHTML(){
            newWindow = window.open("./時間顯示與暫停.html", "_blank","width=100, height=100,toolbar = no");
        }
        //當前頁面關閉時,先關閉子窗口
        function closeChild(){
            //子窗口未關閉
            if(!newWindow.closed){
                newWindow.close();
            }
        }
    </script>
    <button onclick="openHTML()">打開新窗口</button> <!-- 單擊事件 -->
</body>
<!-- 點擊按鈕實現時間的暫停和顯示 -->
<body>
    <script>
        //每隔1s就加載一次顯示時間函數
        var interval = window.setInterval("displayTime()", 999);
        //頁面加載完成就顯示時間
        window.onload = displayTime;

        //顯示時間
        function displayTime(){
            var date = new Date();
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var day = date.getDate();
            var hh = date.getHours();
            var mm = date.getMinutes();
            var ss = date.getSeconds();
            var currentTime = year + "/" + month + "/" + day + "/" + hh + ":" + mm + ":" + ss + "秒";
            //將當前時間內容賦給指定DOM節點
            document.getElementById('display-time').innerText = currentTime;
        }

        //暫停時間和顯示時間
        function stopTime(){
            //時間還在持續顯示,時間暫停
            var text = document.getElementById('btn-time').innerText;
            if(text == '暫停時間'){
                window.clearInterval(interval); //清除周期函數,時間暫停
                document.getElementById('btn-time').innerText = "顯示時間"; //修改按鈕文本內容
            }else{
                //這裏執行的周期函數的返回值和之前一樣。這樣才能同時關閉!
                interval = window.setInterval("displayTime()", 999); 
                document.getElementById('btn-time').innerText = "暫停時間"; //修改按鈕文本內容
            }
        }
    </script>
    <button onclick = "stopTime()" id="btn-time">暫停時間</button>
    <p id="display-time"></p> 
</body>


 location對象 

  • 可以獲取當前頁面的URL所有信息,而且還能和a標籤一樣,用assign()做跳轉,reload()用於刷新。比較常用。
location對象屬性 描述

hash

設置或返回從井號 (#) 開始的 URL(錨)。
host 設置或返回主機名和當前 URL 的端口號。
hostname 設置或返回當前 URL 的主機名。
href 設置或返回完整的 URL。
pathname 設置或返回當前 URL 的路徑部分。
protocol 設置或返回當前 URL 的協議。
port 設置或返回當前 URL 的端口號。
search 設置或返回從問號 (?) 開始的 URL(查詢部分)。
location對象方法 描述
assign() 加載新的文檔。
reload()
重新加載當前文檔。
replace()
用新文檔代替當前文檔。

location對象實例

<!-- 這裏要用到服務器才能更好地體現其作用,使用的是JSP -->

<body>
	<script type="text/javascript">
		window.onload = function(){
			document.writeln("錨點:" + location.hash + "<br>");
			document.writeln("主機名和端口號:" + location.host  + "<br>");
			document.writeln( "主機名:" + location.hostname  + "<br>");
			document.writeln( "完整URL:" + location.href  + "<br>");
			document.writeln( "協議:" + location.protocol  + "<br>");
			document.writeln( "URL路徑:" + location.pathname  + "<br>");
			document.writeln( "URL參數:" + location.search  + "<br>");
		}
	</script>
	<form action="#" method="get">
		用戶:<input type="text" name="username"/><br>
		密碼:<input type="text" name="pwd"/><br>
		<input type="submit" value="提交"/><br>
	</form>
</body>

錨點:
主機名和端口號:localhost:8088
主機名:localhost
完整URL:http://localhost:8088/TestOk/index.jsp?username=admin&pwd=123456
協議:http:
URL路徑:/TestOk/index.jsp
URL參數:?username=admin&pwd=123456


 navigator對象 

  • 該對象的屬性描述當前正在使用的瀏覽器信息,如下。至於該對象的方法基本不怎麼用,所以就不給出了。
navigator對象屬性 描述

appCodeName

返回瀏覽器的代碼名。
appMinorVersion 返回瀏覽器的次級版本。
appName 返回瀏覽器的名稱。
appVersion 返回瀏覽器的平臺和版本信息。
browserLanguage 返回當前瀏覽器的語言。
cookieEnabled 返回指明瀏覽器中是否啓用 cookie 的布爾值。
cpuClass 返回瀏覽器系統的 CPU 等級。
onLine 返回指明系統是否處於脫機模式。true則沒聯網,false則是聯網。
platform 返回運行瀏覽器的操作系統平臺。
systemLanguage 返回 OS 使用的默認語言。
userAgent
返回由客戶機發送服務器的 user-agent 頭部的值。
userLanguage
返回 OS 的自然語言設置。
 //其他屬性大同小異,就不過多演示了
     //在控制檯查看
     console.log("瀏覽器名稱:" + window.navigator.appName);
     console.log("瀏覽器版本:" + navigator.appVersion);
     console.log("服務器發送的頭部值:" + navigator.userAgent);


 history對象 

  • 該對象保存了用戶上網的歷史記錄。爲了安全考慮,開發人員無法獲得用戶瀏覽器的URL。但能通過歷史列表來進行前進和後退網頁。
  • 它提供的back()和forward()就是模擬瀏覽器本身自帶的回退和前進功能。
  • 因爲該對象很少用到,所以就不給實例了。這些方法都很簡單,可以自己寫代碼來驗證。
history對象屬性 描述

length

返回瀏覽器歷史列表中的 URL 數量。
history對象方法 描述
back() 加載 history 列表中的前一個 URL。
forward() 加載 history 列表中的下一個 URL。
go() 加載 history 列表中的某個具體頁面。


 screen對象 

  • screen對象存放着有關顯示瀏覽器屏幕的信息。可以通過JS拿到這些信息,從而做出一些優化。
  • 它的使用方式很簡單,使用screen.屬性的方式就能獲得對應信息。該對象在JS中基本用不到,所以這裏就不給出實例了。
screen對象屬性 描述
availHeight 返回顯示屏幕的高度 (除 Windows 任務欄之外)。
availWidth 返回顯示屏幕的寬度 (除 Windows 任務欄之外)。
bufferDepth 設置或返回調色板的比特深度。
colorDepth 返回目標設備或緩衝器上的調色板的比特深度。
deviceXDPI 返回顯示屏幕的每英寸水平點數。
deviceYDPI 返回顯示屏幕的每英寸垂直點數。
fontSmoothingEnabled     返回用戶是否在顯示控制面板中啓用了字體平滑。
height 返回顯示屏幕的高度。
logicalXDPI 返回顯示屏幕每英寸的水平方向的常規點數。
logicalYDPI 返回顯示屏幕每英寸的垂直方向的常規點數。
pixelDepth 返回顯示屏幕的顏色分辨率(比特每像素)。
updateInterval 設置或返回屏幕的刷新率。
width 返回顯示器屏幕的寬度。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章