JavaScript 瀏覽器對(duì)象模型BOM使用介紹
BOM也叫做瀏覽器對(duì)象模型,它提供了很多對(duì)象,用于訪問瀏覽器的功能;這些功能與任何網(wǎng)頁內(nèi)容無關(guān);
BOM缺少規(guī)范,每個(gè)瀏覽器提供商都按照自己的想法去擴(kuò)展它,那么瀏覽器共有對(duì)象就成了事實(shí)的標(biāo)準(zhǔn);
一 window對(duì)象
// BOM的核心對(duì)象是window,它表示瀏覽器的一個(gè)實(shí)例; // window對(duì)象處于JavaScript結(jié)構(gòu)的最頂層; // 對(duì)于每個(gè)打開的窗口,系統(tǒng)都會(huì)自動(dòng)為其定義window對(duì)象; // window對(duì)象同時(shí)扮演著ECMAScript中Global對(duì)象的角色,因此所有在全局作用域中聲明的變量/函數(shù)都會(huì)變成window對(duì)象的屬性和方法; // PS:嘗試訪問未聲明的變量會(huì)拋出錯(cuò)誤,但是通過查詢window對(duì)象,可以知道某個(gè)可能未聲明的對(duì)象是否存在; var newValue = oldValue; // =>ReferenceError:oldValue is not defined; var newValue = window.oldValue; // =>undefined;
1.window對(duì)象的屬性和方法
window對(duì)象有一系列的屬性,這些屬性本身也是對(duì)象;
(1).屬性
屬性 含義
closed 當(dāng)窗口關(guān)閉時(shí)為真;
defaultStatus 窗口底部狀態(tài)欄顯示的默認(rèn)狀態(tài)信息;
document 窗口中當(dāng)前顯示的文檔對(duì)象;
frames 窗口中的框架對(duì)象數(shù)組;
history 保存有窗口最近加載的URL;
length 窗口中的框架數(shù);
location 當(dāng)前窗口中的URL;
name 窗口名;
offscreenBuffering 用于繪制新窗口內(nèi)容并在完成后復(fù)制已存在的內(nèi)容,控制屏幕更新;
opener 打開當(dāng)前窗口的窗口;
parent 指向包含另一個(gè)窗口的窗口(由框架使用);
screen 顯示屏幕相關(guān)信息,如高度/寬度(以像素為單位;)
self 指示當(dāng)前窗口;
status 描述由用戶交互導(dǎo)致的狀態(tài)欄的臨時(shí)信息;
top 包含特定窗口的最頂層窗口(由框架使用);
window 指示當(dāng)前窗口,與self等效;
(2).方法
alert(text) 創(chuàng)建一個(gè)警告對(duì)話框,顯示一條信息;
blur() 將焦點(diǎn)從窗口移除;
clearInterval(interval) 清除之前設(shè)置的定時(shí)器間隔;
clearTimeOut(timer) 清除之前設(shè)置的超時(shí);
close() 關(guān)閉窗口;
confirm() 創(chuàng)建一個(gè)需要用于確認(rèn)的對(duì)話框;
focus() 將焦點(diǎn)移至窗口;
open(url,name,[options]) 打開一個(gè)新窗口并返回新window對(duì)象;
prompt(text,defaultInput) 創(chuàng)建一個(gè)對(duì)話框要求用戶輸入信息;
scroll(x,y) 在窗口中滾動(dòng)到一個(gè)像素點(diǎn)的位置;
setInterval(expression,milliseconds) 經(jīng)過指定時(shí)間間隔計(jì)算一個(gè)表達(dá)式;
setInterval(function,millisenconds,[arguments]) 經(jīng)過指定時(shí)間間隔后調(diào)用一個(gè)函數(shù);
setTimeout(expression,milliseconds) 在定時(shí)器超過后計(jì)算一個(gè)表達(dá)式;
steTimeout(function,milliseconds,[arguments]) 在定時(shí)器超過后調(diào)用一個(gè)函數(shù);
print() 調(diào)出打印對(duì)話框;
find() 調(diào)出查找對(duì)話框;
// window下的屬性和方法,可以使用window.屬性、window.方法()或者直接屬性、方法()的調(diào)用;
// window.alert(text)=alert(text);
2.系統(tǒng)對(duì)話框
瀏覽器通過alert()/confirm()和prompt()方法調(diào)用系統(tǒng)對(duì)話框向用戶顯示信息;
系統(tǒng)對(duì)話框與瀏覽器中顯示的網(wǎng)頁沒有關(guān)系,也不包含HTML;
它們的外觀由操作系統(tǒng)及(或)瀏覽器設(shè)置決定,而不是由CSS決定;
這幾個(gè)方法打開的對(duì)話框都是同步和模態(tài)的;也就是說,顯示這些對(duì)話框的時(shí)候代碼會(huì)停止運(yùn)行,而關(guān)掉這些對(duì)話框后代碼又會(huì)恢復(fù)執(zhí)行;
// 彈出警告 alert('警告'); // 確認(rèn)和取消 if(confirm('請(qǐng)確定或取消'){ // confirm()本身有返回值; alert('您選擇了確定'); // 按確定,返回true值; })else{ alert('您選擇了取消'); // 按取消,返回false值; } // 輸入提示框 var num = prompt('請(qǐng)輸入一個(gè)數(shù)字',0); // 第一個(gè)參數(shù)是文字提示;第二個(gè)參數(shù)是輸入框模式填充值;并返回輸入框中的值; alert(num); // 將prompt()方法返回的值賦給變量num;并彈出; // 調(diào)用打印及查找對(duì)話框 print(); // 打印; 彈出瀏覽器打印窗口; find(); // =>boolean;頁面有匹配的查找內(nèi)容返回true;相對(duì)于Ctrl+F; // 狀態(tài)欄 defaultStatus = '狀態(tài)欄默認(rèn)文本'; // 瀏覽器底部狀態(tài)欄初始默認(rèn)值; status = '狀態(tài)欄文本'; // 瀏覽器底部狀態(tài)欄設(shè)置值;
3.新建窗口(open())
// 使用window.open()方法可以導(dǎo)航到一個(gè)特定的URL,也可以打開一個(gè)新的瀏覽器窗口;
// 它接收四個(gè)參數(shù):
// (1).要加載的URL;
// (2).窗口的名稱或窗口目標(biāo);
// (3).一個(gè)特定字符串;
// (4).一個(gè)表示新頁面是否取代瀏覽器記錄中當(dāng)前加載頁面的布爾值;
open('www.baidu.com'); // chrome-search://local-ntp/www.baidu.com;打開失敗;需要添加http://;
open('http://www.baidu.com'); // 新建頁面并跳轉(zhuǎn)到百度;
open('http://www.baidu.com','搜索引擎'); // 新建頁面 打開百度頁面 并命名窗口;并不會(huì)自動(dòng)跳轉(zhuǎn);并且再次調(diào)用時(shí)只是刷新那個(gè)頁面;
open('http://www.baidu.com','_parent'); // 在本頁面打開百度;'_blank'是指定新頁面打開;
// 第三個(gè)字符串參數(shù)
設(shè)置 值 說明
width 數(shù)值 新窗口的寬度,不小于100px;
height 數(shù)值 新窗口的高度,不小于100px;
top 數(shù)值 新窗口的Y坐標(biāo),不能是負(fù)值;
left 數(shù)值 新窗口的X坐標(biāo),不能是負(fù)值;
location boolean 是否在瀏覽器窗口中顯示地址欄;不同瀏覽器默認(rèn)值不同;
menubar boolean 是否在瀏覽器窗口顯示菜單欄,默認(rèn)為no;
resizable boolean 是否通過拖動(dòng)瀏覽器窗口邊框來改變大小;默認(rèn)no;
scrollbars boolean 如果頁面內(nèi)容顯示不下,是否顯示滾動(dòng)條;默認(rèn)no;
status boolean 是否在瀏覽器窗口中顯示狀態(tài)欄,默認(rèn)no;
toolbar boolean 是否在瀏覽器中顯示工具欄;默認(rèn)no;
fullscreen boolean 瀏覽器窗口是否最大化;僅IE支持;
open('http://www.baidu.com','baidu','width=400,height=400,top=200,left=200,toolbar=yes');
// open()本身返回window對(duì)象
var box = open(); // 返回了一個(gè)window對(duì)象,打開了一個(gè)新空白頁面;
box.alert(''); // 然后指定在open()返回的對(duì)象打開的新頁面彈窗;
// 字窗口操作父窗口
document.onclick = function(){ // 在新的窗口中點(diǎn)擊docuement對(duì)象;
opener.document.write('子窗口讓我輸出的!');// 此時(shí)在產(chǎn)生它的父窗口會(huì)生成文字內(nèi)容;
}
4.窗口的位置和大小
(1).窗口的位置 // 用來確定和修改window對(duì)象(瀏覽器窗口)相對(duì)于屏幕的位置: // IE+Safari+Opera+Chrome都提供了screenLeft和screenTop屬性, // Firefox提供了screenX和screeY屬性; // 他們分別表示窗口看相對(duì)于屏幕左邊和上邊的位置; // 確定窗口的位置=>IE alert(screenLeft); // 瀏覽器左側(cè)離屏幕的距離; // 確定窗口的位置=>Firefox alert(screenX); // 瀏覽器左側(cè)離屏幕的距離; // 跨瀏覽器的方法 var leftX = (typeof screenLeft == 'number') ? screenLeft : screenX; // 判斷檢測(cè)的screenLeft是否是數(shù)值,若是則使用screenLeft的值,否則使用screenX的值;
(2).窗口的大小 // 檢測(cè)瀏覽器窗口本身及邊框的尺寸:outerWidth和outerHeight; alert(outerWidth); alert(outerHeight); // 檢測(cè)頁面大小屬性:innerWidth和innerHeight; alert(innerWidth); alert(innerHeight); // PS:IE沒有提供當(dāng)前瀏覽器窗口尺寸的屬性; 在DOM中有提供相關(guān)的方法; // 在IE及其他瀏覽器中,提供了:document.documentElement.clientWidth和document.documentElement.clientHeight;來保存頁面窗口的信息; // PS:在IE6中,上述屬性在標(biāo)準(zhǔn)模式下才有效;如果是怪異模式,就必須通過document.body.clientWidth和document.body.clientHeight; // 如果是Firefox等瀏覽器,直接使用innerWidth和innerHeight; var width = window.innerWidth; // 這里要加window,因?yàn)镮E會(huì)無效; var height = window.innerHeight; if(typeof width != 'number'){ // IE6瀏覽器 if(document.compatMode == 'CSS1Compat'){ // 判斷是IE6標(biāo)準(zhǔn)模式;使用documentElement; width = document.documentElement.clientWidth; height = document.documentElement.clientHeight; }else{ // 否則是IE6非標(biāo)準(zhǔn)模式;使用body; width = document.body.clientWidth; height = document.body.clientHeight; } } // PS:以上方法可以通過不同瀏覽器取得各自的瀏覽器窗口可視部分的大小; // document.compatMode可以確定頁面是否處于標(biāo)準(zhǔn)模式;
// 調(diào)整瀏覽器位置; moveTo(0,0); // 移動(dòng)到(0,0)坐標(biāo);IE有效; moveBy(10,10); // 向下和向右分別移動(dòng)10px;IE有效; // 調(diào)整瀏覽器大小 resizeTo(200,200); // 調(diào)整大小; resizeBy(200,200); // 擴(kuò)展收縮大小;
5.間歇調(diào)用和超時(shí)調(diào)用
1 // JavaScript是單線程語言,但它允許通過設(shè)置超時(shí)值和間歇時(shí)間值來調(diào)度代碼在特定的時(shí)刻執(zhí)行;
2 // 超時(shí)值:在指定的時(shí)間過后執(zhí)行代碼;
3 // 間隔值:每隔指定的時(shí)間就執(zhí)行一次代碼;
// 超時(shí)調(diào)用使用window對(duì)象的setTimeout()方法; // 它接受兩個(gè)參數(shù):要執(zhí)行的代碼和毫秒數(shù); setTimeout(function(){ // 直接使用函數(shù)傳入的方法,擴(kuò)展性好,性能更加; alert('警告!'); },1000); // 調(diào)用setTimeout()之后,該方法會(huì)返回一個(gè)數(shù)值ID,表示超時(shí)調(diào)用; // 這個(gè)超時(shí)調(diào)用的ID是計(jì)劃執(zhí)行代碼的唯一標(biāo)識(shí)符,可以通過它來取消超時(shí)調(diào)用; // 要取消尚未執(zhí)行的超時(shí)調(diào)用計(jì)劃,可以調(diào)用clearTimeout()方法并將相應(yīng)的超時(shí)調(diào)用ID作為參數(shù)傳遞給它; var box = setTimeout(function(){ // 將超時(shí)調(diào)用的ID賦值給變量box; alert('超時(shí)調(diào)用'); },1000); clearTimeout(box); // 將ID傳入取消調(diào)用方法;
// 間歇調(diào)用使用window對(duì)象的setInterval()方法; // 它會(huì)按照指定的時(shí)間間隔重復(fù)執(zhí)行代碼,直至間歇調(diào)用被取消或頁面被卸載; // 它接收的參數(shù)與setTimeout()相同; var pox = setInterval(function(){ alert('間隔調(diào)用'); },1000); clearInterval(pox); // 取消間歇調(diào)用; // 利用setInterval()設(shè)置一個(gè)5秒的定時(shí)器; var num = 0; // 設(shè)置起始秒; var max = 5; // 設(shè)置終止秒; setInterval(function(){ num++; // 遞增num; if(num == max){ clearInterval(this); // 取消間隔調(diào)用,this表示方法本身;一直跟蹤間隔調(diào)用的ID; alert('5秒后彈窗'); } },1000);
// 一般使用超時(shí)調(diào)用來模擬間隔調(diào)用是一種最佳模式; // 因?yàn)槭褂瞄g隔調(diào)用需要根據(jù)情況來取消ID,并且可能造成同步的一些問題;后一個(gè)間歇調(diào)用可能會(huì)在前一個(gè)間歇調(diào)用結(jié)束之前啟動(dòng); var num = 0; var max = 5; function box(){ num++; if(num == max){ alert('5秒后彈窗'); }else{ setTimeout(box,1000); // 隔1秒之后再次執(zhí)行一個(gè)超時(shí)調(diào)用; } }; setTimeout(box,1000); // 執(zhí)行定時(shí)器; // PS:在使用超時(shí)調(diào)用時(shí),沒必要跟蹤超時(shí)調(diào)用ID,因?yàn)槊看螆?zhí)行之后,如果不再設(shè)置另一個(gè)超時(shí)調(diào)用,調(diào)用就會(huì)自動(dòng)停止;
二 location對(duì)象
location是BOM對(duì)象之一,它提供了與當(dāng)前窗口中加載的文檔有關(guān)的信息,還提供了一些導(dǎo)航功能;
事實(shí)上,location對(duì)象是window對(duì)象的屬性,也是document對(duì)象的屬性;
alert(location); // 獲取當(dāng)前的URL
(1).location對(duì)象的屬性
屬性 描述的URL內(nèi)容
hash 如果該部分存在,表示錨點(diǎn)部分;
host 主機(jī)名:端口號(hào);
hostname 主機(jī)名;
href 整個(gè)URL;
pathname 路徑名;
port 端口號(hào);
protocol 協(xié)議部分;
search 返回URL的查詢字符串('?gws_rd=ssl#safe=strict&q=ab'),這個(gè)字符串以問號(hào)開頭;
(2).location對(duì)象的方法
assign() 跳轉(zhuǎn)到指定頁面,與href等效;
reload() 重載當(dāng)前URL;
replace() 用新的URL替換當(dāng)前頁面;
location.hash = '#1'; // 設(shè)置#后的字符串,并跳轉(zhuǎn);
location.hostname = 'Jack'; // 設(shè)置主機(jī)名;
location.search = '?id=5'; // 設(shè)置?后的字符串;
// 在Web開發(fā)中,我們經(jīng)常需要獲取諸如?id=5&search=ok這種類型的URL的鍵值對(duì); // 通過location,我們可以寫一個(gè)函數(shù),來一一獲取; function getArgs(){ // 創(chuàng)建一個(gè)存放鍵值對(duì)的數(shù)組; var args = []; // 去除?號(hào); var qs = location.search.length>0?location.search.substring(1):''; // 按&字符串拆分?jǐn)?shù)組; var items = qs.split('&'); var item = null, name = null, value = null; //遍歷 for(var i = 0; i<items.length; i++){ item = items[i].split('='); name = decodeURIComponent(item[0]); // 因?yàn)椴樵冏址粸g覽器編碼過; value = decodeURIComponent(item[1]);// 每個(gè)查詢字符串參數(shù)都變成了args對(duì)象的屬性; // 把鍵值對(duì)存放到數(shù)組中; args[name] = value; } return args; } var args = getArgs(); alert(args['id']); // 獲取URL中id對(duì)應(yīng)的值;
location.assign('http://www.baidu.com'); // 跳轉(zhuǎn)到指定的URL;2
location.reload(); // 最有效的重新加載,有可能從緩存加載;
location.reload(true); // 強(qiáng)制加載,從服務(wù)器源頭重新加載;5
locatioin.replace('http://www.baidu.com'); // 在本頁跳轉(zhuǎn)到百度頁面,并且可以避免產(chǎn)生跳轉(zhuǎn)的歷史記錄;
三 history對(duì)象
history對(duì)象是window對(duì)象的屬性,它保存著用戶上網(wǎng)的記錄,從窗口被打開的那一刻算起;
(1).history對(duì)象的屬性
length history對(duì)象中的記錄數(shù);
(2).history對(duì)象的方法
back() 前往瀏覽器歷史條目前一個(gè)URL,類似后退;
forward() 前往瀏覽器歷史條目下一個(gè)URL,類似前進(jìn);
go(num) 瀏覽器在history對(duì)象中向前或向后;
function back(){
history.back();
}
function forward(){
history.forward();
}
function go(num){
history.go(num);
}
// PS:可以通過判斷history.length == 0,得到是否有歷史記錄;
四 小結(jié)
瀏覽器對(duì)象模型(BOM)以window對(duì)象為依托,表示瀏覽器窗口以及頁面可見區(qū)域;
同時(shí)window對(duì)象還是ECMAScript中的Global對(duì)象,因而所有全局變量和函數(shù)都是它的屬性,且所有原生的構(gòu)造函數(shù)及其他函數(shù)也都存在于它的命名空間下;
(1).使用location對(duì)象可以通過編程方式來訪問瀏覽器的導(dǎo)航系統(tǒng);設(shè)置相應(yīng)的屬性,可以逐段或整體性地修改瀏覽器的URL;
(2).調(diào)用replace()方法可以導(dǎo)航到一個(gè)新的URL,同時(shí)該URL會(huì)替換瀏覽器歷史記錄中當(dāng)前顯示的頁面;
(3).screen對(duì)象:保存著與客戶端顯示器有關(guān)的信息,這些信息一般只用于站點(diǎn)分析;
(4).history對(duì)象:為訪問瀏覽器的歷史記錄開了一個(gè)小縫隙,開發(fā)人員可以據(jù)此判斷歷史記錄的數(shù)量,也可以在歷史記錄中向后或向前導(dǎo)航到任意頁面;
相關(guān)文章
Javascript標(biāo)準(zhǔn)DOM Range操作全集
Javascript標(biāo)準(zhǔn)DOM Range操作全集...2007-01-01WEB頁子窗口(showModalDialog和showModelessDialog)使用說明
WEB頁子窗口(showModalDialog和showModelessDialog)使用說明,大家可以看下。2009-10-10JavaScript onkeydown事件入門實(shí)例(鍵盤某個(gè)按鍵被按下)
這篇文章主要介紹了JavaScript onkeydown事件入門實(shí)例,onkeydown事件捕捉鍵盤上某個(gè)按鍵被按下的情況,需要的朋友可以參考下2014-10-10JavaScript window.document的屬性、方法和事件小結(jié)
document屬性作為window對(duì)象的一個(gè)子對(duì)象被創(chuàng)建,是用于訪問頁面中所有元素的對(duì)象,這里簡單整理下,方便學(xué)習(xí)js的朋友2012-10-10javascript 學(xué)習(xí)筆記(六)瀏覽器類型及版本信息檢測(cè)代碼
由于各瀏覽器對(duì)css以及js支持的差異性,我們?cè)谧銮岸碎_發(fā)時(shí),經(jīng)常需要先檢測(cè)瀏覽器的類型及版本,然后會(huì)對(duì)各自的差異性來寫代碼!2011-04-04