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是朝垂直和水平分別移動多少
當然,這兩個方法也很有可能被瀏覽器禁用
今天就先介紹這麼多,明天繼續~~~