BOM
NO.1 window對(duì)象
BOM的核心對(duì)象是window,它表示瀏覽器的一個(gè)實(shí)例丈积。在瀏覽器中,window對(duì)象有雙重角色江滨,它既是通過(guò)JavaScript訪問(wèn)瀏覽器窗口的一個(gè)接口,又是JS規(guī)定的Global對(duì)象唬滑。
全局變量會(huì)變成window對(duì)象的屬性棺弊。
另外晶密,全局變量不能通過(guò)delete刪除模她,但是在window上定義的屬性可以,在window上定義的屬性還有一個(gè)好處就是當(dāng)變量未聲明的時(shí)候侈净,訪問(wèn)的時(shí)候不會(huì)報(bào)錯(cuò)僧凤。
var newValue = oldValue; //報(bào)錯(cuò)
var newValue = window.oldValue //不報(bào)錯(cuò)
NO.2 窗口關(guān)系及框架
如果頁(yè)面中包含框架,那么每個(gè)框架都有自己的window對(duì)象躯保,保存在frames集合中。
要訪問(wèn)上面的框架摇展,可以使用
window.frames[0]
window.frames["topFrame"]
top.frames[0]
top.frames["topFrame"]
frames[0]
frames["topFrame"]
最好使用top.frames[0]來(lái)引用
和top相對(duì)的另一個(gè)window對(duì)象是parent對(duì)象溺忧,parent對(duì)象始終執(zhí)行當(dāng)前框架的直接上層咏连。
窗口位置:
使用如下代碼可以取得窗口左邊和上邊的位置鲁森。
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
首先確定screenLeft和screenTop是否存在(在Safari、Opera和Choreme中)則取這兩個(gè)屬性的值歌溉,如果不存在(在Firefox中),則取得screenX和screenY的值
窗口大型炊狻:
四個(gè)瀏覽器都提供了四個(gè)屬性: innerWidth,innerHeight,outerWidth,outerHeight
當(dāng)pageWidth不是一個(gè)數(shù)值的時(shí)候,就是用window.innerWidth取不到的時(shí)候漫谷,然后判斷頁(yè)面是否處于標(biāo)準(zhǔn)模式,如果是標(biāo)準(zhǔn)模式舔示,用上圖那種方式取得瀏覽器寬度,如果不是惕稻,用另外一種。
用reszieTo()和resizeBy()方法可以調(diào)整瀏覽器窗口的大小俺祠。其中resizeTo()接收瀏覽器的新寬度和新高度。resizeBy()方法接收高度差锻煌。
導(dǎo)航和打開(kāi)新窗口:
使用window.open()方法可以導(dǎo)航到一個(gè)特定的URL,也可以打開(kāi)一個(gè)新的瀏覽器的窗口宋梧。
這個(gè)方法可以接受四個(gè)參數(shù):要加載的URL狰挡,窗口目標(biāo)捂龄,一個(gè)特性字符串以及一個(gè)布爾值(表示新頁(yè)面是否取代瀏覽器歷史記錄中當(dāng)前加載頁(yè)面)
close()方法可以關(guān)閉新打開(kāi)的窗口。
大多數(shù)瀏覽器都有屏蔽彈出窗口程序倦沧,如果窗口被內(nèi)置的屏蔽程序阻止了。你們window.open()會(huì)返回null展融。此時(shí),只要檢測(cè)這個(gè)值就可以確定彈出的窗口是否被屏蔽告希。
如果是內(nèi)置屏蔽程序(window.open ==null
):
var wroxWin = window.open("http://young.club", "_blank");
if (wroxWin == null){
alert("彈出窗口被瀏覽器內(nèi)置屏蔽程序阻止");
}
如果是瀏覽器擴(kuò)展或者其他程序阻止(window.open報(bào)錯(cuò)
):
var blocked = false;
try{
var wroxWin = window.open("http://youngi.club","_blank")
if(wroxWin==null){
blocked == true;
}
} catch (ex){
blocked == true;
}
if (blocked){
alert("窗口被攔截");
}
間歇調(diào)用和超時(shí)調(diào)用:
javascript是單線程語(yǔ)言,它允許設(shè)置超時(shí)值和間歇時(shí)間來(lái)調(diào)度代碼在特定時(shí)刻執(zhí)行喝噪。
超時(shí)調(diào)用需要使用window對(duì)象的setTimeout()方法,它接受兩個(gè)參數(shù)酝惧,要執(zhí)行的代碼以及毫秒。
不建議的方式(原因晚唇,傳遞字符可能導(dǎo)致性能損失):
setTimeout("alert('hello world')", 1000);
建議的方式:
setTimeout(function(){
alert("hello world!");
},1000);
調(diào)用setTimeout后,該方法會(huì)返回一個(gè)數(shù)值ID哩陕,表示超時(shí)調(diào)用,這個(gè)ID是計(jì)劃執(zhí)行代碼的唯一標(biāo)示符萌踱,可以用來(lái)取消超時(shí)調(diào)用
var timeoutId = setTimeout(function(){
alert("hello world!");
},1000);
ClearTimeout(timeoutId);
類似号阿,間隙調(diào)用:
var setInterval = setTimeout(function(){
alert("hello world!");
},1000);
ClearInterval(setInterval);
系統(tǒng)對(duì)話框:
alert()和confirm(),prompt()可以調(diào)用系統(tǒng)對(duì)話框向用戶顯示消息并鸵,系統(tǒng)對(duì)話框的外觀由瀏覽器設(shè)置或者操作系統(tǒng)決定扔涧。
NO.3 location對(duì)象
location是最有用的BOM對(duì)象之一。它提供了與當(dāng)前窗口加載的文檔有關(guān)的信息枯夜,他還提供了一些導(dǎo)航功能。它既是window對(duì)象的屬性湖雹,也是document對(duì)象的屬性。
location可以將URL解析為獨(dú)立的片段摔吏,讓開(kāi)發(fā)人員通過(guò)不同的屬性訪問(wèn)這些片段纵装。
location.search可以訪問(wèn)從問(wèn)號(hào)到URL末尾的所有內(nèi)容。
location.assign("http://youngi.club")可以立即打開(kāi)新的URL
location.assign("http://youngi.club")
window.location = "http://youngi.club"
location.
這三條語(yǔ)句等價(jià)
location屬性還可以對(duì)URL進(jìn)行一系列操作橡娄,如下:
這個(gè)時(shí)候如果用戶點(diǎn)擊后退按鈕癣籽,還是能回到前一個(gè)頁(yè)面挽唉,如果想要禁止這種行為筷狼,可以用replace()方法。
setTimout(function(){
location.replace("http://youngi.club")
},1000)
reload()方法桑逝,重載當(dāng)前頁(yè)面俏让,當(dāng)沒(méi)有參數(shù)的時(shí)候楞遏,會(huì)自動(dòng)從緩存中重新加載首昔,如果需要從服務(wù)器加載,需要傳遞參數(shù)true,reload()方法最好放在最后一行勒奇,因?yàn)樗鼤?huì)導(dǎo)致它之后的代碼不執(zhí)行
location.reload(); //從緩存加載
location.reload(true); //從服務(wù)器加載
NO.4 navigator對(duì)象
navigator對(duì)象包含的屬性描述了正在使用的瀏覽器
navigator.plugins[]表示瀏覽器所用的插件的集合
NO.5 screen對(duì)象
screen對(duì)象基本上只是用來(lái)表明客戶端的能力,包含瀏覽器窗口外部顯示器的信息赊颠,如像素高寬
NO.5 history對(duì)象
history對(duì)象保存中用戶上網(wǎng)的歷史記錄,處于安全考慮竣蹦,開(kāi)發(fā)人員無(wú)法得知用戶瀏覽過(guò)的URL。使用go方法可以在用戶的歷史記錄中任意跳轉(zhuǎn):
history.go(-1); //后退一頁(yè)
history.go(3); //前進(jìn)三頁(yè)
history.go("youngi.club"); //跳到最近的youngi.club頁(yè)面
history還有一個(gè)length屬性痘括,保存歷史記錄的數(shù)量
if(history.length == 0){
//是用戶打開(kāi)窗口的第一個(gè)頁(yè)面
}
NO.6 客戶端檢測(cè)
因?yàn)闉g覽器多樣性,所以需要客戶端檢測(cè)方法纲菌,來(lái)突破或者規(guī)避種種局限性。
舉個(gè)例子翰舌,在IE5.0之前的版本不支持document.getElementById()這個(gè)DOM方法,所以要使用document.all這個(gè)非標(biāo)準(zhǔn)的屬性實(shí)現(xiàn)相同目的椅贱。
能力檢測(cè)代碼:
function getElement(id){
if (document.getElementById){
return document.getElementById(id);
} else if(document.all){
return document.all[id];
} else{
throw new Error {"沒(méi)辦法獲取到元素"}
}
}
NO.7 客戶端完整代碼
見(jiàn)Javascript高級(jí)程序設(shè)計(jì)(第三版)242頁(yè)~245