1. 程式人生 > 其它 >BOM(瀏覽器物件模型詳解)

BOM(瀏覽器物件模型詳解)

摘要

如果想在Web中使用JavaScript,那麼BOM無疑是真正的核心。BOM提供了許多物件用於訪問瀏覽器的功能,這些功能與任何網頁內容無關。

這一篇就來說一下BOM物件的核心內容。

1.Window 物件

BOM的核心物件是window,它表示瀏覽器的一個例項。在瀏覽器中,window物件有雙重角色,它既是通過JavaScript訪問瀏覽器視窗的一個介面,又是ECMAscript規定的Global物件。

(1)全域性作用域

這意味著在網頁中定義的任何變數,方法和物件,都是在以window為Global物件的下面定義的。
我們來看一下這段程式碼:

var age = 29;
function
sayAge(){ console.log(this.age); } console.log(age); //29 console.log(window.age); //29 sayAge(); //29

不管定義的變數還是方法,都是以window來定義的。
所以在sayAge方法裡面的this指向的是呼叫該方法的window物件。

(2)不同定義的區別

那這個時候我們要想一個問題了,我們直接定義變數和給window新增變數有什麼區別嗎?
讓我們看一下這段程式碼:

var name = 'lisi';
window.age = 29;

delete window.name; //返回false
delete window.age; // 返回true

這裡我們可以看到,通過var來定義在window下的變數,不能通過delete刪除。

這裡面的原理,其實是在定義屬性的時候,將一個叫Configurable屬性設定為了false,從而不能被delete刪除(這裡面不懂可以看一下之前的文章)

Object.defineProperty方法(詳解)

2.視窗位置

用來確定和修改window物件位置的屬性和方法有很多。
獲取視窗位置,針對於不同的瀏覽器,有兩對屬性。

1.screenLeft和screenTop

2.screenX和screenY

使用下面的方法可以解決瀏覽器的相容問題

        var
leftPos = typeof window.screenLeft == 'number' ? window.screenLeft : window.screenX; var topPos = typeof window.screenTop == 'number' ? window.screenTop : window.screenY;

而用來移動視窗的方法我們可以使用moveTomoveBy這兩個方法。
前者是接收新位置的x和y座標的值,後者接收的是水平和豎直方向上移動的畫素數。

說白了就是moveTo可以移動到給定位置,moveBy就是以原先為基礎進行移動。

像這兩段程式碼:

        window.moveTo(0,0); // 將視窗移動到螢幕的左上角
        window.moveBy(0,100); // 將視窗向下移動100畫素

3.視窗大小

想要獲取視窗的大小並且解決瀏覽器的相容問題,可不是那麼簡單。
針對於不同的瀏覽器,確定視窗大小的屬性也有兩對。

1.innerWidth,innerHeight

2.outerWidth,outerHeight

但如果瀏覽器不允許上面的屬性使用,我們可以採用其他的方法

1.標準模式下:

document.documentElement.clientWidth
和document.documentElement.clientHeight
可以進行獲取

2.混雜模式下

document.body.clientWidth
和document.body.clientHeigh
t可以進行獲取

所以針對於瀏覽器的相容,我們可以這樣去寫:

        var pageWidth = window.innerWidth;
        var pageHeight = window.innerHeight;

        if(typeof pageWidth != 'number'){
        	//判斷是否為標準模式
            if(document.compatMode == 'CSS1Compat'){
                pageWidth = document.documentElement.clientWidth;
                pageHeight = document.documentElement.clientHeight;
            }else{
                pageWidth = document.body.clientWidth;
                pageHeight = document.body.clientHeight;
            }
        }

另外,使用**resizeTo()resizeBy()**這兩個方法可以調整瀏覽器視窗的大小:

        window.resizeTo(100,100); //調整到100 * 100
        window.resizeBy(100,50); // 調整到(100 + 100) * (100 + 50)

前者是調整到指定大小。
後者是根據原先的值進行調整。

4.導航和開啟視窗

使用window.open()可以導航到一個特定的URL,也可以開啟一個新的視窗。
這個方法接收4個引數:

URL,視窗目標,一個特定的字串,一個布林值。

正常來講我們一般只傳遞第一個引數。

所以後面的三個引數在這裡面不進行特殊說明,如果需要了解可以查閱資料進行學習。

5.間接呼叫和超時呼叫

OK,現在該說所有人都很熟悉的兩個方法了。

先說一下超時呼叫:

        //設定超時呼叫
        var timer = setTimeout(() => {
            console.log('超時呼叫');
        }, 3000);

        //把它取消
        clearTimeout(timer);

使用起來應該也是很熟悉了。

再說一下間接呼叫:

        //設定間接呼叫
        var interval = setInterval(() => {
            console.log('間接呼叫');
        }, 3000);

        //把它取消
        clearInterval(interval)

6.系統對話方塊

1.alert() 提示框

他的效果是這個樣子的,平時也是我們除錯用的最多的。
在這裡插入圖片描述

2.confirm() 警告框

他的效果是這樣的:
在這裡插入圖片描述
根據點選確定還是取消我們可以有不同的操作:

        var flag = confirm('Are you srue');
        if(flag){
            alert('yes')
        }else{
            alert('no')
        }

3.prompt() 輸入框

他的效果是這個樣子:
在這裡插入圖片描述
我們可以根據輸入來進行操作:

        var result = prompt('enter your name','');
        if(result != null){
            alert(result)
        }

7.location物件

location是最有用的BOM物件之一,他提供了與當前視窗中載入的文件的資訊,還提供了一些導航功能。
現在我們來看一下它的屬性

屬性名例子說明
hash"#contents返回#後面跟著的零或多個字元,如果URL不包含雜湊,則返回空字串
host“www.wrox.com:80”返回伺服器名稱和埠號
hostname“www.wrox.com”返回不帶埠號的伺服器名稱
href“http://www.wrox.com”返回當前載入頁面的完整URL
pathname“/WillyCDA/”返回URL的目錄或檔名
port“8080”返回URL中指定的埠號
protocol“http:”返回頁面使用的協議
search“?name = lisi”返回URL的查詢字串

然後還有方法

方法名說明
assign()載入新文件
reload重新載入當前文件
replace用新的文件替換當前文件

當我們需要用到location物件的時候就可以查閱這個表格啦。

8.history物件

history物件儲存著使用者上網的歷史記錄,從視窗被開啟的那一刻算起。
使用go()方法可以在使用者的歷史記錄任意跳轉:

        history.go(-1); //後退一頁
        history.go(1); // 前進一頁
        history.go('wrox.com');// 跳轉到最近的wrox頁面

另外還有back和forward方法來代替go,顧名思義,就是前進和後退的意思。

        history.back();//後退一頁
        history.forward();// 前進一頁

除了上述幾個方法以外,history還有一個length屬性,用來表示使用者歷史記錄的數量,根據這個屬性我們可以確定使用者是否只打開了一個頁面:

        if(history.length == 0){
            console.log("使用者只打開了一個頁面");
        }

OK,關於BOM下的物件,也就說到這裡!