第8章探熔、BOM

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)簽打開的第一個頁面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泪蔫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喘批,更是在濱河造成了極大的恐慌撩荣,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饶深,死亡現(xiàn)場離奇詭異餐曹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敌厘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門台猴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俱两,你說我怎么就攤上這事饱狂。” “怎么了宪彩?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵休讳,是天一觀的道長。 經(jīng)常有香客問我尿孔,道長俊柔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任活合,我火速辦了婚禮雏婶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘白指。我一直安慰自己留晚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布告嘲。 她就那樣靜靜地躺著倔丈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪状蜗。 梳的紋絲不亂的頭發(fā)上需五,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音轧坎,去河邊找鬼宏邮。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜜氨。 我是一名探鬼主播械筛,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼飒炎!你這毒婦竟也來了埋哟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤郎汪,失蹤者是張志新(化名)和其女友劉穎赤赊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煞赢,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抛计,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了照筑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吹截。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凝危,靈堂內(nèi)的尸體忽然破棺而出波俄,到底是詐尸還是另有隱情,我是刑警寧澤蛾默,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布弟断,位于F島的核電站,受9級特大地震影響趴生,放射性物質(zhì)發(fā)生泄漏阀趴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一苍匆、第九天 我趴在偏房一處隱蔽的房頂上張望刘急。 院中可真熱鬧,春花似錦浸踩、人聲如沸叔汁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽据块。三九已至,卻和暖如春折剃,著一層夾襖步出監(jiān)牢的瞬間另假,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工怕犁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留边篮,地道東北人己莺。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像戈轿,于是被迫代替她去往敵國和親凌受。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • BOM:瀏覽器對象模型 這一章思杯,主要講了window對象,location對象胜蛉,navigator對象,scree...
    __越過山丘__閱讀 224評論 0 0
  • 1.我怎么如此幸運(yùn)色乾,今天看了沈勤姐姐下載的簡書的文章誊册,我的小靈魂跟我對接,我也要做這樣的程序杈湾,我也要下載這個簡書來...
    史真如閱讀 326評論 0 0
  • 在膩兒生命中曾有過一段灰暗時光,那時她“邂逅”安妮寶貝攘须。于是幾乎讀遍關(guān)于安妮寶貝所有的文字漆撞,瘋狂的癡迷她。(讀過...
    美膩太太閱讀 261評論 0 1
  • 我 想拉著你的手 走遍天涯海角 永不分開于宙! 我的寶貝你別哭 別再為...
    MC孫震呢閱讀 721評論 0 0