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盐数。