2020/6/10 JavaScript高級程序設計 BOM
- 2020 年 6 月 26 日
- 筆記
- BOM, javascript, 十年燈
BOM(瀏覽器對象模型):提供用於訪問瀏覽器的對象。
8.1 window對象
window是BOM的核心對象,表示瀏覽器的一個實例。
- JavaScript訪問瀏覽器窗口的接口
- ECMAScript規定的Global對象
8.1.1 全局作用域
全局變量會成為window的屬性,但是定義全局變量和直接在window對象上定義屬性是有差別的——全局變量不能通過delete刪除,但window對象上定義的可以。
這是因為使用var添加的window屬性[[Configurable]]被設置為false(不可刪除)。
訪問未聲明的變量會發生錯誤,但通過查詢window對象,可以知道某個可能未聲明的變量是否存在。
//這裡會拋出錯誤,因為oldValue未定義 var newValue = oldValue; //這裡不會拋出錯誤,因為這是一次屬性查詢 var newValue = window.oldValue; //newValue的值是undefined
8.1.2 窗口關係及框架
如果頁面中包含框架,則每個框架都擁有自己的window對象,並保存在frames集合中。在frames集合中可以通過數值索引/框架名稱來訪問相應的window對象。每個window對象都有一個name屬性,其中包含框架的名稱。
PS1:對於最高層窗口來說:除非最高層窗口是通過window.open()打開的,否則其window對象的name屬性不會包含任何值。
與框架有關的window對象屬性(同時也是對象):
- top:始終指向最高(最外)層的框架,也就是瀏覽器窗口。使用它可以正確地在一個框架中訪問另一個框架。因為對任意一個框架中的代碼來說,window對象指向的都是那個框架的特定實例,而非最高層框架。
- parent:始終指向當前框架的直接上層框架。在沒有框架的情況下,parent等於top。
- self:始終指向window。引入self的目的僅僅是為了和top和parent對象對應,因此他不包含其他值。
8.1.3 窗口位置
用來確定window對象位置的屬性:screenLeft, screenTop / screenX, screenY,分別表示窗口相對於屏幕左邊和上邊的位置。
兩組方法分別支持的瀏覽器:
screenLeft, screenTop | IE、Safari、Opera、Chrome |
screenX, screenY | Firefox、Safari、Chrome |
跨瀏覽器取得窗口位置的代碼:
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX; var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
缺點:
- screenTop表示的是由從屏幕上邊到window對象表示的頁面可見區域的距離(即頁面可見區域上方瀏覽器工具欄的像素高度)。
- screenY表示整個瀏覽器窗口相對於屏幕的坐標值(0)。
將窗口精確移動到一個新位置的方法:
- moveTo():接收最新位置的x,y坐標值。
- moveBy():接收在水平和垂直方向上移動的像素數。
PS:這兩個方法很可能會被瀏覽器禁用(Opera和IE7+),且不適合框架,只能對最外層window對象使用。
8.1.4 窗口大小
IE9+、Safari、Firefox | Opera | Chrome | |
innerWidth、innerHeight | 視圖區大小 | 該容器中頁面視圖區的大小(減去邊框寬度) | 視口大小 |
outerWidth、outerHeight | 瀏覽器窗口本身的尺寸 | 頁面視圖容器的大小(單個標籤頁對應瀏覽器窗口的大小) | 視口大小 |
document.documentElement.clientWidth / document.documentElement.clientHeight:保存了頁面視口的信息。
resizeTo()和resizeBy():調整瀏覽器窗口的大小。(分別接收新寬度高度和新窗口與原窗口的寬度和高度之差,同樣可能被瀏覽器禁用)
8.1.5 導航和打開窗口