1. 程式人生 > >[TimLinux] JavaScript BOM瀏覽器對象模型

[TimLinux] JavaScript BOM瀏覽器對象模型

位置 允許 closed 目的 com history對象 nbsp 窗口大小 變量

1. 簡介

ECMAScript是JavaScript的核心,但是如果要在WEB中使用JavaScript,那麽BOM則無疑才是真的的核心。BOM提供了很多對象,用於訪問瀏覽器的功能,這些功能與任何網頁內容無關。BOM沒有標準,各瀏覽器廠商間定義的公共對象,可以作為事實上的標準存在。W3C在HTML5中把BOM納入了規範中。

2. window對象

window對象:表示瀏覽器的一個實例。window的雙重角色:通過JavaScript訪問瀏覽器窗口的一個接口,又是ECMAScript規定的Global對象。

2.1. 全局作用域

所有在全局作用域中聲明的變量、函數都會變成window對象的屬性和方法。與直接在window對象上定義屬性和方法的區別在於刪除操作:window對象上定義的可以delete,全局變量不可以被刪除。

// 1. 全局變量為window對象的屬性和方法
var age = 29;
function sayAge() { console.log(this.age); }

window.age; // 29
window.sayAge(); // 29

// 2. 全局變量不可刪除, window對象的屬性和方法可以被刪除
window.color = ‘red‘;

delete window.age;
delete window.color;

window.age; // 29, 不可刪除
window.color; // undefined,可被刪除

// 3. 訪問全局對象未定義值會拋出異常,訪問window屬性不會
var newValue = oldValue; // 拋出異常 var newValue = window.oldValue; // undefined

很多全局JavaScript對象(如:location, navigator等)都是window對象的屬性。

2.2. 窗口關系與框架

如果頁面包含框架,每個框架有自己的window對象,並且保存在 frames 集合中(可以通過數值索引:0開始,從左到右,從上到下,或者框架名來訪問window對象)。每個window對象都有一個name屬性,用來包含框架名。使用框架的頁面中,瀏覽器中會存在多個Global對象,每個框架內的變量是獨立的,不同框架間的變量進行邏輯運算是沒有意義的。框架相關對象:

  • top對象: 始終執行最高、最外層的框架,也就是瀏覽器窗口。通過它可以訪問另外一個框架對象,window對象指向的是當前框架自身。
  • parent對象:始終指向當前框架的直接上層框架,某些情況下,parent === top。在沒有框架時,parent 一定等於 top.
  • self對象:始終指向window,self與window對象可以互換使用,引入的目的是與top、parent對象對應起來。
<frameset rows="160,*">
    <frame src=‘frame.html‘ name=‘topFrame‘>
    <frameset cols="50%,50%">
        <frame src=‘anotherframe.htm‘ name=‘leftFrame‘>
        <frame src=‘yetanotherframe.htm‘ name=‘rightFrame‘>
    </frameset>
</frameset>

+--------------------------------------------------------------+
| window.frames[0] |
| window.frames[‘topFrame‘] |
| top.Frames[0] |
| frames[0] |
| frames[‘topFrame‘] |
+--------------------------------------------------------------+
| window.frames[1] | window.frames[2] |
| window.frames[‘leftFrame‘] | window.frames[‘rightFrame‘] |
| top.frames[1] | top.frames[2] |
| top.frames[‘leftFrame‘] | top.frmaes[‘rightFrame‘] |
| frames[1] | frames[2] |
| frames[‘leftFrame‘] | frames[‘rightFrame‘] |
+--------------------------------------------------------------+

2.3. 窗口位置

確定瀏覽器窗口左邊、上邊的位置:

var leftPos = (typeof window.screenLeft === ‘number‘)? window.screenLeft : window.screenX;
var rightPos = (typeof window.screenTop === ‘number)? window.screenTop : window.screenY;

// IE, Opera: screenLeft、screenTop保存的是從屏幕左邊、上邊到由window對象表示的頁面可見區域的距離。

moveTo、moveBy方法可以移動瀏覽器,但是多數瀏覽器禁用了該功能。

2.4. 窗口大小

IE9+、Firefox、Safari、Opera和Chrome提供4個屬性來確定瀏覽器窗口大小:innerWidth、innerHeight、outerWidth、outerHeight。document.documentElement.clientWidth、document.documentElement.clientHeight保存了頁面viewport口的信息。

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;
    }
}

window.resizeTo(100, 100); // 調整到 100 x 100
window.resizeBy(100, 50); // 參數為新窗口與原窗口寬度、高度之差。調整到:100 x 50
window.resizeTo(300, 300); // 調整到 300 x 300

resizeTo、resizeBy方法可以調整瀏覽器窗口的大小,可能被瀏覽器禁用。

2.5. 導航與打開窗口

window.open(參數1, 參數2, 參數3, 參數4)
參數1:要加載的URL 
參數2:窗口目標,在哪裏打開窗口,窗口名:‘topFrame‘, 或特殊字符名: _self, _parent, _top 或 _blank. (都需要用引號引上!)
參數3:一個特性字符串,一個逗號分隔的設置字符串,表示新窗口中使用哪些屬性,屬性表如下表所示。
參數4:一個表示新頁面是否取代瀏覽器歷史中當前加載頁面的布爾值

var bingWindow = window.open(‘http://cn.bing.com‘, ‘newBingWindow‘, ‘height=400,width=400,top=10,left=10,resizable=yes‘);
bingWindow.resizeTo(500, 500);
bingWindow.moveTo(100, 100);
bingWindow.close();
console.log(bingWindow.closed); // true
bingWindow.openar === window; // true
bingWindow.openar === null; // 表示:使用單獨的進程運行新標簽頁(_blank)

參數3屬性表:

設置 說明
fullscreen yes | no 僅限IE,是否最大化
height 數值 新窗口的高度,最小值 100
left 數值 新窗口的左坐標,不能為負值
location yes | no 是否顯示地址欄,默認 no
menubar yes | no 是否顯示菜單欄,默認 no
resizable yes | no 是否可被拖動改變大小,默認 no
scrollbars yes | no 是否允許滾動,默認 no
status yes | no 是否顯示狀態欄,默認 no
toolbar yes | no 是否顯示工具欄,默認 no
top 數值 新窗口的上坐標,不能為負值
width 數值 新窗口的寬度,最小值 100

2.6. 間接調用與超時調用

var timeoutId = setTimeout(function() {}, 1000); // 1000毫秒後執行函數
clearTimeout(timeoutId);

var intervalId = setInterval(function () {}, 1000); // 每1000毫秒執行函數一次
clearInterval(intervalId);

3. location對象

tbd

4. navigator對象

tbd

5. screen對象

tbd

6. history對象

tbd

7. 總結

tbd

[TimLinux] JavaScript BOM瀏覽器對象模型