1. 程式人生 > >Javascript高階程式設計學習筆記(27)—— BOM(1)window物件1

Javascript高階程式設計學習筆記(27)—— BOM(1)window物件1

ECMAScript是JS的核心

但是對於在瀏覽器中執行的JS,BOM顯然才是真正的核心

 

我們知道JS是由三個部分組成的 BOM、DOM、ECMAScript

之前的文章我們主要介紹的是ECMAScript

也就是JS的核心語法

但是JS作為一種指令碼語言,其建立的初衷不就是為了控制瀏覽器中的頁面的表現形勢嘛

 

所以JS與瀏覽器的互動由什麼控制呢?

當然就是我們的BOM了(瀏覽器物件模型)

 

BOM提供了一系列的物件用於訪問瀏覽器的功能,由於各個廠商會按照各自的想法去拓展它

所以只有其中的一部分被標準化,並被納入HTML5規範

下面我們就來聊聊標準化的這些內容

 

Window物件

Bom物件的核心是window,在瀏覽器環境中這個物件除了是JS訪問瀏覽器功能的介面物件外

還是JS的Global物件,parseInt等全域性方法在瀏覽器環境中也就屬於window物件

 

由於window物件也是瀏覽器環境中的全域性物件

所以全域性變數和全域性方法最終都會是 window 物件的屬性和方法

 

不過要注意的地方在於,為window物件定義屬性,和宣告全域性變數是有區別的

看以下程式碼

var a = 10;
window.b = 10;

雖然變數 a 可以通過window.a 進行訪問

但是我們不能通過 delete 操作符來刪除 window.a

卻可以刪除 window.b

這是因為雖然全域性變數會作為 window物件的屬性,但是這個屬性有個特點

那就是這個屬性的特性 [[Configurable]] 是false,所以我們不能通過delete來刪除它

 

這也是瀏覽器環境中所有全域性變數,儲存在window物件上的特點

 

視窗關係及框架 

如果你的瀏覽器中包含框架(另外的視窗),那麼每個視窗都有自己的window物件

每個window物件都有frames屬性,該屬性的值為一個數組

window.frames 陣列中我們可以訪問所有的window物件

這些框架的索引從0開始,從左到右,從上到下增加

每個 window 都有一個name屬性,也就是當前框架的名稱

也可以在 frames 陣列中通過window的name進行索引

 

為了避免層級關係的混淆,Bom還有 top、parent物件

top指向當前的框架最頂層,也就是瀏覽器視窗

而 parent 指向當前視窗的父級框架

有時候 top會等於parent

但在不包含框架的頁面中 top 一定等於 parent

除此而外還有個 self 用於標識當前window,但是隻是為了與top、parent對應,並沒有什麼特殊的功能

 

PS. 由於框架之間的window 物件是獨立的,所以都擁有獨立的建構函式,所以 a視窗的Array型別不等於b視窗的Array型別

 

視窗位置

除火狐而外的瀏覽器都通過 screenLeft、screenTop來提供當前視窗相對於螢幕的座標

火狐使用 screenX、screenY來提供相應屬性

跨瀏覽器相容如下

var left = (typeof window.screenLeft ==="number")?window.screenLeft:window.screenX;
var top = (typeof window.screenTop ==="number")?window.screenTop:window.screenY;

moveTo(x,y) 將視窗移動到螢幕的指定位置

moveBy(x,y)視窗水平移動x,垂直移動y

要注意的是上述方法雖然可以移動瀏覽器視窗,但絕大多數情況下都會被瀏覽器禁用

 

視窗大小

由於獲取瀏覽器視窗的大小,各個瀏覽器實現、行為各異

所以就不多說

主要說明一下獲取可視區域的大小

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.clientWidht;
        pageHeight = document.body.clinetHeight;
    }
}

這裡也有兩個方法控制視窗大小

resizeTo()

resizeBy()

使用和上面的move類似to是移動到某個座標,by是朝垂直和水平分別移動多少

當然,這兩個方法也很有可能被瀏覽器禁用

 

今天就先介紹這麼多,明天繼續~~~