8.1 window對象
BOM的核心對象是window,它表示瀏覽器的一個實(shí)例烘挫。在網(wǎng)頁中定義的任何一個對象诀艰、變量和函數(shù),都以window作為其Global對象饮六,因此有權(quán)限訪問parseInt()等方法其垄。
8.1.1 全局作用域
所有在全局作用域中聲明的變量、函數(shù)都會變成window對象的屬性和方法卤橄。但是定義全局變量和在window對象上直接定義屬性有一個差別:全局變量不能通過delete操作符刪除绿满,而直接在window對象上定義的屬性可以(因?yàn)槿肿兞坑幸粋€名為[[Configurable]]的特性,這個特性被設(shè)置為false窟扑,因此不能通過delete操作符刪除)喇颁。
var a=1;
window.b=2;
console.log(window.a); // 1
delete window.a;
delete window.b;
console.log(window.a); // 1
console.log(window.b); // undefined
嘗試訪問未聲明的變量會拋出錯誤,但是通過window對象的屬性進(jìn)行查詢就可以知道某個未聲明的全局變量是否存在辜膝。
var b = a; // 報(bào)錯
var b = window.a; // b為undefined
8.1.2 窗口關(guān)系及框架
在多框架的頁面中无牵,因?yàn)槊總€框架都有自身的window屬性,但top對象始終指向最高層框架厂抖,也就是瀏覽器窗口茎毁。parent對象表示當(dāng)前框架的父框架。self對象始終指向window忱辅,與window對象可以互換使用七蜘。這些對象都是window對象的屬性,可以通過window.parent墙懂,window.top訪問橡卤。
8.1.3 窗口位置
IE、Safari损搬、Opera和chrome用screenLeft和screenTop分別表示窗口相對于屏幕左邊和上邊的距離碧库,F(xiàn)irefox用screenX和screenY提供同樣的窗口位置信息。使用下列代碼可跨瀏覽器取得窗口位置巧勤。
var leftScreen = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
var topScreen = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
8.1.4 窗口大小
現(xiàn)代瀏覽器(IE9+)提供4個屬性表示窗口大星痘摇:innerWidth,innerHeight颅悉,outerWidth沽瞭,outerHeight。其中innerWidth剩瓶,innerHeight表示頁面視圖區(qū)域的大芯岳!(減去網(wǎng)頁邊框的可見區(qū)域)城丧,outerWidth,outerHeight表示瀏覽器窗口本身的尺寸豌鹤。
早期瀏覽器(IE8以前)通過DOM提供相關(guān)信息亡哄,標(biāo)準(zhǔn)模式下document.documentElement.clientWidth,document.documentElement.clientHeight保存視口信息傍药,混雜模式下document.body.clientWidth磺平,document.body.clientHeight表示視口信息。
// 表示去除邊框的瀏覽器范圍大小
console.log("window.innerWidth",window.innerWidth);
console.log("window.innerHeight",window.innerHeight);
// 表示整個瀏覽器窗口大小
console.log("window.outerWidth",window.outerWidth);
console.log("window.outerHeight",window.outerHeight);
// 表示去除邊框和滾動條的瀏覽器范圍大小
console.log("document.documentElement.clientWidth",document.documentElement.clientWidth);
console.log("document.documentElement.clientHeight",document.documentElement.clientHeight);
// 表示body元素的大小
console.log("document.body.clientWidth",document.body.clientWidth);
console.log("document.body.clientHeight",document.body.clientHeight);
8.1.5 導(dǎo)航和打開窗口
使用window.open()方法可以導(dǎo)航到一個特定的URL拐辽,接受4個參數(shù):要加載的URL拣挪,窗口目標(biāo),一個特性字符串以及一個表示新頁面是否取代瀏覽器歷史記錄中當(dāng)前加載頁面的布爾值俱诸。通常只需要傳入第一個參數(shù)即可菠劝。打開的窗口可以通過top.close()進(jìn)行關(guān)閉。關(guān)閉打開的窗口后睁搭,其引用仍然存在赶诊,可以通過其引用的closed屬性來判斷是否關(guān)閉掉了打開的窗口。
當(dāng)彈出窗口被屏蔽時园骆,如果是被瀏覽器內(nèi)置屏蔽程序阻止的舔痪,則window.open()很可能會返回null,如果是被瀏覽器擴(kuò)展或其他程序阻止的锌唾,則會報(bào)錯锄码。
8.1.6 間歇調(diào)用和超時調(diào)用
超時調(diào)用,window.setTimeout()晌涕,接受兩個參數(shù)滋捶,第一個是要執(zhí)行的代碼,第二個是經(jīng)過該時間后將改代碼添加到Javascript的任務(wù)隊(duì)列中余黎。由于Javascript是單線程語言重窟,所以經(jīng)過給定的時間后代碼不一定會執(zhí)行,而是添加到當(dāng)前任務(wù)隊(duì)列中惧财,隊(duì)列是空就會立即執(zhí)行巡扇,否則需要等待隊(duì)列中前面的代碼執(zhí)行完畢才會執(zhí)行。
setTimeout()調(diào)用后會返回一個唯一標(biāo)識ID垮衷,setTimeout()里的代碼執(zhí)行前厅翔,可以通過clearTimeout(ID)方法將超時調(diào)用清除。
間歇調(diào)用帘靡,window.setInterval()知给,參數(shù)與setTimeout()方法相同瓤帚,每次經(jīng)過給定時間間隔將代碼添加到任務(wù)隊(duì)列中執(zhí)行描姚∩可使用setTimeout()代替:
var a=0;
var b=10;
function time() {
a++;
if(a<b){
setTimeout(time,1000);
}else{
alert("OK");
}
}
setTimeout(time,1000);
8.1.7 系統(tǒng)對話框
瀏覽器通過alert()、confirm()轩勘、prompt()方法可以調(diào)用系統(tǒng)對話框向用戶顯示消息筒扒,它們的外觀由操作系統(tǒng)及瀏覽器本身設(shè)置決定,而不是CSS決定绊寻。通過這幾個方法打開的對話框都是同步的花墩,也就是說,顯示這些對話框的時候代碼會停止執(zhí)行澄步,關(guān)閉對話框的時候代碼又會恢復(fù)執(zhí)行冰蘑。
alert()方法接收一個字符串并將其顯示給用戶。通常用來生成警告類的對話框顯示一些用戶無法控制的信息村缸。
confirm()方法同樣接收一個字符串顯示給用戶祠肥,它有兩個選擇按鈕,一個是確認(rèn)梯皿,一個是取消仇箱,點(diǎn)擊確認(rèn)該方法會返回true,點(diǎn)擊取消或者單擊右上角的X會返回false东羹。
prompt()方法創(chuàng)建的對話框會帶有一個輸入框和確認(rèn)取消兩個按鈕剂桥,接收兩個參數(shù),一個是顯示給用戶的提示信息属提,另一個是其自帶輸入框中的默認(rèn)值权逗,點(diǎn)擊確認(rèn)則返回輸入框中的內(nèi)容,點(diǎn)擊取消或者關(guān)閉對話框返回null垒拢。
8.2 location對象
location對象提供了當(dāng)前窗口中加載的文檔有關(guān)信息旬迹。還提供了一些導(dǎo)航功能,它既是window對象的屬性求类,也是document對象的屬性奔垦,即window.location和document.location引用的是同一個對象。所有屬性文檔尸疆。
8.2.1 查詢字符串參數(shù)
location.search可以返回URL中從問號到結(jié)尾的所有內(nèi)容椿猎,通過下列方法可以解析查詢字符串,將其轉(zhuǎn)化為一個包含所有參數(shù)的對象寿弱。
function changeSearchString() {
// 獲取查詢字符串犯眠,創(chuàng)建儲存信息對象
var str = location.search;
var obj = {};
// 查詢字符串存在時去除問號
if(str.length>0){
str = str.substring(1);
}else {
return obj;
}
// 分割查詢字符串為一個數(shù)組,創(chuàng)建臨時變量
var items = str.split("&");
var item,name,value,i;
// 解析分割后的字符串症革,因?yàn)椴樵冏址潜痪幋a過的筐咧,用decodeURIComponent()方法解碼,并將每一項(xiàng)添加到obj對象當(dāng)中
for(i =0; i<items.length; i++){
item = items[i].split("=");
name = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if(name.length){
obj[name] = value;
}
}
return obj;
}
8.2.2 位置操作
location.assign()方法接收一個URL,立即打開新的URL并在歷史記錄中生成記錄量蕊,如果是將location.href或者window.location設(shè)置為一個新的URL值铺罢,也會以該值調(diào)用location.assign()方法〔信冢可以使用后退按鈕退回之前的頁面韭赘。
location.replace()與location.assign()方法相似,也是打開新的URL势就,但location.replace()方法不會生成歷史記錄泉瞻,相當(dāng)于用新的URL代替了原來的頁面。無法使用后退按鈕回到之前的頁面苞冯。
location.reload()方法的作用是重新加載當(dāng)前顯示的頁面袖牙,不傳任何參數(shù)時,瀏覽器會以最有效的方式重新加載舅锄,即自上次請求以來沒有改變過贼陶,則從緩存中加載。傳遞true作為參數(shù)時巧娱,會沖服務(wù)器重新加載當(dāng)前頁面碉怔。
8.3 navigator對象
navigator對象是識別客戶端瀏覽器的事實(shí)標(biāo)準(zhǔn)。navigator對象的屬性通常用來檢測顯示頁面的網(wǎng)頁瀏覽器類型禁添。所有屬性文檔撮胧。
8.4 screen對象
screen對象在編程中用處不大,基本只用來表明客戶端的能力老翘。包括瀏覽器窗口外部的顯示器信息芹啥。
8.5 history對象
history對象保存著用戶上網(wǎng)的歷史記錄,從窗口被打開的那一刻算起铺峭,因?yàn)閔istory是window對象的屬性墓怀,所以每個瀏覽器窗口、每個標(biāo)簽?zāi)酥撩總€框架卫键,都有自己的history對象與特定的window對象相關(guān)聯(lián)傀履。
history.go()方法可以在歷史記錄中任意跳轉(zhuǎn),這個方法接收一個參數(shù)莉炉,傳入整數(shù)值時钓账,跳轉(zhuǎn)相應(yīng)的頁面:
// 前進(jìn)一頁,相當(dāng)于前進(jìn)按鈕絮宁,簡寫方法為history.forward();
history.go(1);
// 后退一頁梆暮,相當(dāng)于后退按鈕,簡寫方法為history.back();
history.go(-1);
// 前進(jìn)兩頁
history.go(2);
傳入字符串時绍昂,跳轉(zhuǎn)到歷史記錄中包含該字符串的第一個頁面啦粹,可能前進(jìn)偿荷,也可能后退
// 跳轉(zhuǎn)到最近的baidu.com頁面
history.go("baidu.com");
history對象還有一個length屬性,保存著歷史記錄的數(shù)量唠椭,即當(dāng)length屬性為0的時候遭顶,表示這是瀏覽器當(dāng)前標(biāo)簽打開的第一個頁面。