Window對(duì)象

window對(duì)象是客戶端JavaScript程序的全局對(duì)象,包含多數(shù)的屬性和方法组民。

計(jì)時(shí)器

Window對(duì)象包含2個(gè)方法可以進(jìn)行計(jì)時(shí)操作:

  • setTimeout()用來注冊(cè)在指定的時(shí)間后單次調(diào)用的函數(shù)回挽,返回一個(gè)值嫡良,這個(gè)值可以傳遞給clearTimeout()用于取消函數(shù)的執(zhí)行搓侄。
  • setInterval()用來注冊(cè)在指定時(shí)間后重復(fù)調(diào)用的函數(shù)牲剃,返回一個(gè)值鳖轰,這個(gè)值可以傳遞給clearInterval()用于取消后續(xù)函數(shù)的調(diào)用清酥。

如果以0毫秒的超時(shí)時(shí)間來調(diào)用setTimeout(),那么指定的函數(shù)不會(huì)立即執(zhí)行蕴侣。相反焰轻,會(huì)把指定函數(shù)放到隊(duì)列中,等到前面處理等待狀態(tài)的事件處理程序全部執(zhí)行完成后昆雀,再調(diào)用它鹦马。

瀏覽器定位 location

window對(duì)象的location屬性引用的是Location對(duì)象胧谈,它表示該窗口中當(dāng)前顯示的文檔的URL。
Document對(duì)象的Location屬性也引用到Location對(duì)象:

window.location === document.location // 總是返回true

解析URL

Location對(duì)象包含一些屬性:protocol, host, hostname, port, pathname和search荸频,分別表示URL的各個(gè)部分菱肖。hash屬性返回URL中的"片段標(biāo)識(shí)符"(#top)部分,search屬性返回的是問號(hào)之后的URL旭从,這部分通常是某種類型的查詢字符串稳强。
比如,提取URL的搜索字符串中的參數(shù):

function urlArgs() {
    var args  = {};
    // 查找到查詢串和悦,并去掉'?'
    var query = location.search.substring(1);
    var pairs = query.split("&");
    for(var i=0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('=');
        if(pos == -1) continue;
        var name  = pairs[i].substring(0, pos);
        var value = pairs[i].substring(pos + 1);
        value = decodeURIComponent(value);
        args[name] = value;
    }
    
    return args;
}

載入新的文檔

  • Location對(duì)象的assign()方法可以使窗口載入并顯示你指定的URL中的文檔退疫。
  • replace()方法也類似,但是它在載入新文檔之前會(huì)從瀏覽器歷史中把當(dāng)前文檔刪除鸽素。所有如果檢測(cè)到用戶瀏覽器不支持某些特性來顯示功能齊全的版本褒繁,可以用location.replace()來載入靜態(tài)的HTML版本,防止"后退"按鈕把瀏覽器帶回到原始文檔馍忽。
  • 可以直接給location進(jìn)行賦值實(shí)現(xiàn)頁面的跳轉(zhuǎn):
location = "http://www.example.com";    // location直接賦值實(shí)現(xiàn)跳轉(zhuǎn)

如果將片段標(biāo)識(shí)賦值給location棒坏,則不會(huì)讓瀏覽器載入新文檔,只會(huì)使它滾動(dòng)到文檔的某個(gè)位置遭笋。

location = "#top";  // 跳轉(zhuǎn)到文檔的頂部

同時(shí)坝冕,location的分解屬性是可寫的,對(duì)它們重新賦值也會(huì)改變URL的位置瓦呼。

location.search = "?page=" + (pagenum + 1); // 載入下一個(gè)頁面

瀏覽歷史

Window對(duì)象的history屬性引用的是該窗口的History對(duì)象喂窟,History對(duì)象是用來把窗口的瀏覽歷史用文檔和文檔狀態(tài)列表的形式表示。

  • History對(duì)象的length屬性表示瀏覽歷史列表中的元素?cái)?shù)量央串,但出于安全考慮磨澡,腳本不能訪問已保存的URL。
  • History對(duì)象的back()和forward()方法與瀏覽器的"后退"和"前進(jìn)"按鈕一樣质和。
  • History對(duì)象還包含一個(gè)go()方法稳摄,可以在歷史列表中向前或向后跳過任意多個(gè)頁。
history.go(-2); // 后退2個(gè)歷史記錄侦另,相當(dāng)于單擊"后退"按鈕2次

注:如果窗口包含多個(gè)子窗口(比如<iframe>元素)秩命,子窗口的瀏覽歷史會(huì)按時(shí)間順序穿插在主窗口的歷史中尉共。這意味著主窗口調(diào)用history.back()可能會(huì)導(dǎo)致其中一個(gè)子窗口往回跳轉(zhuǎn)到前一個(gè)顯示的文檔褒傅,但主窗口保持不變。

Navigator對(duì)象

Window對(duì)象的navigator屬性引用的是包含瀏覽器廠商和版本信息的Navigator對(duì)象袄友。
以下4個(gè)屬性用于提供關(guān)于運(yùn)行中的瀏覽器的版本信息:

屬性 含義
appName web瀏覽器的全稱殿托。在IE中為"Microsoft Internet Explorer",在Firefox中為"Netscape"剧蚣,為了兼容現(xiàn)存的瀏覽器嗅探代碼支竹,其他瀏覽器通常也取值為"Netscape"旋廷。
appVersion 此屬性通常以數(shù)字開始,并跟著瀏覽器廠商和版本信息的詳細(xì)字符串礼搁。appVersion字符串沒有標(biāo)準(zhǔn)的格式饶碘,所以沒有辦法直接用它來判斷瀏覽器的類型。
userAgent 瀏覽器在它的USER-AGENT HTTP頭部中發(fā)送的字符串馒吴。這個(gè)屬性通常包含appVersion中的所有信息扎运,并且也可能包含其他的細(xì)節(jié)。和appVersion一樣饮戳,它也沒有標(biāo)準(zhǔn)格式豪治。但由于這個(gè)屬性包含絕大部分信息,因此瀏覽器嗅探代碼通常用它來嗅探扯罐。
platform 在其上運(yùn)行瀏覽器的操作系統(tǒng)(并且可能是硬件)的字符串负拟。
onLine 表示瀏覽器當(dāng)前是否連接網(wǎng)絡(luò)。
geolocation 用于確定用戶位置信息的接口歹河。
javaEnabled() 一個(gè)非標(biāo)準(zhǔn)的方法掩浙,當(dāng)瀏覽器可以運(yùn)行java小程序時(shí)返回true。
cookieEnable() 非標(biāo)準(zhǔn)的方法启泣,如果瀏覽器可以保存永久的cookie時(shí)涣脚,返回true。

比如寥茫,使用navigator.userAgent來進(jìn)行瀏覽器嗅探:

// 
// "webkit":  Safari或Chrome
// "opera":   Opera
// "mozilla": FireFox或者其他基于gecko內(nèi)核的瀏覽器
// "msie":    IE
//
var browser = (function() {
    var s = navigator.userAgent.toLowerCase();
    var match = /(webkit)[ \/]([\w.]+)/.exec(s) ||
                /(opera)(?:.*version)?[ \/]([\w.]+)/.exec(s) ||
                /(msie)([\w.]+)/.exec(s) ||
                !/compatible/.test(s) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(s) ||
                [];
    
    return { name: match[1] || "", version: match[2] || "" };
}());

Screen對(duì)象

Window對(duì)象的screen屬性引用的是Screen對(duì)象遣蚀,它提供有關(guān)窗口顯示的大小和可用的顏色信息。

  • 屬性width和height指定的是以像素為單位的窗口大小纱耻。
  • 屬性availWidth和availHeight指定的是實(shí)際可用的顯示大小芭梯,排除了像桌面任務(wù)欄占用的空間。
  • 屬性colorDepth指定的是顯示的BPP(bits-per-pixel)值弄喘。
    可以使用Screen對(duì)象來確定web應(yīng)用是否運(yùn)行在一個(gè)小屏幕的設(shè)備上(比如上網(wǎng)本)玖喘,然后選擇更小的字體和圖片等。

對(duì)話框

Window對(duì)象提供了4個(gè)方法來向用戶顯示對(duì)話框蘑志,3個(gè)簡(jiǎn)單方法:alert()累奈、confirm()、prompt()急但。1個(gè)復(fù)雜方法:showModalDialog()澎媒。

  • 方法ocnfirm()和prompt()都會(huì)產(chǎn)生阻塞,也就是說波桩,在用戶關(guān)掉對(duì)話框前戒努,它們不會(huì)返回。
  • alert()方法也會(huì)產(chǎn)生阻塞镐躲,但并不總是這樣储玫。
  • showModalDialog()顯示一個(gè)"模態(tài)對(duì)話框"(顯示出來就可點(diǎn)選位于其下面的對(duì)話框)侍筛,第1個(gè)參數(shù)指定對(duì)話框HTML內(nèi)容的URL,第2個(gè)參數(shù)是一個(gè)任意值(數(shù)組和對(duì)象均可)撒穷,這個(gè)值在對(duì)話框里的腳本可以通過window.dialogArguments屬性的值訪問匣椰。第3個(gè)參數(shù)是一個(gè)非標(biāo)準(zhǔn)的列表,包含name=value對(duì)端礼,可以配置對(duì)話框的尺寸或其他屬性窝爪。
var p = showModalDialog("multiprompt.html", 
                        ["Enter 3D point coordinates", "x", "y", "z"],
                        "dialogwidth:400; dialogheight:300; resizable:yes");

錯(cuò)誤處理

Window對(duì)象的onerror屬性是一個(gè)事件處理程序,當(dāng)未捕獲的異常傳播到調(diào)用棧上時(shí)就會(huì)調(diào)用它齐媒。
onerror處理程序是早期的JavaScript的遺物蒲每,那里語言核心不包含try/catch異常處理語句,現(xiàn)在很少使用它喻括,使用try/catch即可邀杏。

作為Window對(duì)象屬性的文檔元素

  • 如果在HTML文檔中用id屬性來為元素命名,Window對(duì)象會(huì)賦予一個(gè)屬性唬血,它的名字是id屬性的值望蜡,而它們的值指向表示文檔元素的HTMLElement對(duì)象,可以通過GetElementById()來獲取拷恨。但是脖律,如果Window對(duì)象已經(jīng)具有此名字的屬性時(shí),這就不會(huì)發(fā)生腕侄,比如小泉,id是"history"、"location"等冕杠。
  • id元素在文檔中必須是唯一的微姊,但是name屬性不一定唯一,如果HTML元素有多于一個(gè)相同的name屬性(或者一個(gè)元素有name屬性分预,而另一個(gè)元素有相同值的id屬性)兢交,則該名稱的隱式全局變量會(huì)引用一個(gè)類數(shù)組對(duì)象,這個(gè)類數(shù)組對(duì)象的元素是所有命名的元素笼痹。
  • 有name或id屬性的<iframe>元素是個(gè)特殊的例子配喳,為它們創(chuàng)建的變量不會(huì)引用表示自身的Element對(duì)象,而是引用表示<iframe>元素創(chuàng)建的嵌套窗體的window對(duì)象凳干。

多窗口和窗體

如果瀏覽器窗口包含多個(gè)標(biāo)簽頁晴裹,則每一個(gè)標(biāo)簽頁都是獨(dú)立的Window對(duì)象上下文,而且相互之間互不干擾纺座。由<iframe>所創(chuàng)建的嵌套瀏覽上下文是用它自己的Window對(duì)象所表示息拜。
和相互獨(dú)立的標(biāo)簽頁不同溉潭,嵌套的瀏覽上下文之間并不是相互獨(dú)立的净响。在一個(gè)窗體中運(yùn)行的JavaScript程序總是可以看到它的祖先和子孫窗體少欺,盡管腳本查看這些窗體的文檔受到同源策略的限制。

打開窗口

使用Window對(duì)象的open()方法可以打開一個(gè)新的瀏覽器窗口(或標(biāo)簽頁馋贤,這通常和瀏覽器配置有關(guān))赞别。

  • open()的第一個(gè)參數(shù)是要在新窗口中顯示的文檔URL。
  • open()的第二個(gè)參數(shù)是新打開的窗口的名字配乓。如果指定的是一個(gè)已經(jīng)存在的窗口的名字仿滔,則會(huì)直接使用已存在的窗口。如果省略此參數(shù)犹芹,會(huì)使用指定的名字"_blank"打開一個(gè)新的崎页、未命名的窗口。
  • open()的第三個(gè)參數(shù)是可選的腰埂,一個(gè)以逗號(hào)分隔的列表飒焦,包含大小和各種屬性,此參數(shù)是非標(biāo)準(zhǔn)的屿笼,HTML5規(guī)范也主張瀏覽器應(yīng)該忽略它牺荠。
  • open()的第四個(gè)參數(shù)只在第二個(gè)參數(shù)命名是一個(gè)存在的窗口時(shí)才有用。它是一個(gè)布爾值驴一,聲明了由第一個(gè)參數(shù)指定的URL是否應(yīng)該替換掉窗口瀏覽歷史的當(dāng)前條目(true)休雌,默認(rèn)是不替換。
  • open()的返回值是新創(chuàng)建窗口的Window對(duì)象肝断。
var w = window.open("smallwin.html", "smallwin",
                    "width=400, height=350, status=yes, resizable=yes");
  • 在新創(chuàng)建的窗口中杈曲,opener屬性引用的是打開它的腳本的Window對(duì)象。
w.open.opener === w;    // true胸懈,對(duì)于任意窗口w

關(guān)閉窗口

就像方法open()打開一個(gè)新窗口一樣鱼蝉,方法close()將關(guān)閉一個(gè)窗口。

  • 在表示窗體而不是窗口或標(biāo)簽頁上的Window對(duì)象上執(zhí)行close()方法不能關(guān)閉一個(gè)窗體箫荡,相反魁亦,只能從包含它的文檔中刪除iframe
  • 即使用一個(gè)窗口關(guān)閉了羔挡,代表它的Window對(duì)象仍然存在洁奈。但是它的closed屬性為true、它的document會(huì)是null绞灼、它的方法通常也不會(huì)再工作利术。

窗體之間的關(guān)系

  • 任何窗口和窗體都可以引用為window或self。
  • 窗體可以用parent屬性引用包含它的窗口或窗體的Window對(duì)象低矮。如果一個(gè)窗口是頂級(jí)窗口或標(biāo)簽印叁,而不是窗體,那么其parent屬性引用是這個(gè)窗口本身。
  • 無論窗體被嵌套了幾層轮蜕,它的top屬性引用的都是包含它的頂級(jí)窗口昨悼。
  • <iframe>元素有contentWidow屬性,引用該窗體的Window對(duì)象跃洛,同樣率触,可以進(jìn)行反向操作--從表示窗體的Window對(duì)象來獲取該窗體的<iframe>元素,使用Window對(duì)象的frameElement屬性汇竭。窗體中的Window對(duì)象的frameElement屬性不是null葱蝗,但頂級(jí)窗口的Window對(duì)象的frameElement屬性是null
  • 每個(gè)Window對(duì)象都有一個(gè)frames屬性细燎,它引用自身包含的窗口或窗體两曼,frames屬性引用的是類數(shù)組對(duì)象,frames[0]引用窗口的第一個(gè)子窗體玻驻,依次類推合愈。

交互窗口中的JavaScript

每個(gè)窗口和窗體都有它自身的執(zhí)行上下文,以Window作為全局對(duì)象击狮。

  • 當(dāng)用構(gòu)造函數(shù)定義一個(gè)類佛析,這個(gè)類只在一個(gè)單獨(dú)的窗口定義。如果要在另一個(gè)窗口中使用彪蓬,則需要顯式的引用寸莫。
  • 和用戶定義的類不同,內(nèi)置的類(String,Date,RegExp...)都會(huì)在所有的窗口中自動(dòng)預(yù)定義档冬。但要注意膘茎,每個(gè)窗口都有構(gòu)造函數(shù)的一個(gè)獨(dú)立副本和構(gòu)造函數(shù)對(duì)應(yīng)原型對(duì)象的一個(gè)獨(dú)立副本。這意味著instanceof操作符不能跨窗口使用酷誓。例如披坏,當(dāng)用instanceof來比較窗體B的一個(gè)字符串和窗體A的String()構(gòu)造函數(shù)時(shí),結(jié)果會(huì)是false盐数。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棒拂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玫氢,更是在濱河造成了極大的恐慌帚屉,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾峡,死亡現(xiàn)場(chǎng)離奇詭異攻旦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)生逸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門牢屋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來且预,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)双饥。 經(jīng)常有香客問我,道長(zhǎng)饰剥,這世上最難降的妖魔是什么牌柄? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮歧蕉,結(jié)果婚禮上灾部,老公的妹妹穿的比我還像新娘。我一直安慰自己惯退,他們只是感情好赌髓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著催跪,像睡著了一般锁蠕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懊蒸,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天荣倾,我揣著相機(jī)與錄音,去河邊找鬼骑丸。 笑死舌仍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的通危。 我是一名探鬼主播铸豁,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菊碟!你這毒婦竟也來了节芥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤逆害,失蹤者是張志新(化名)和其女友劉穎藏古,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍燥,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拧晕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梅垄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂捞。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡输玷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靡馁,到底是詐尸還是另有隱情欲鹏,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布臭墨,位于F島的核電站赔嚎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胧弛。R本人自食惡果不足惜尤误,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望结缚。 院中可真熱鬧损晤,春花似錦、人聲如沸红竭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茵宪。三九已至最冰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稀火,已是汗流浹背锌奴。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憾股,地道東北人鹿蜀。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像服球,于是被迫代替她去往敵國(guó)和親茴恰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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