javascript高級(jí)程序設(shè)計(jì)讀書(shū)筆記(八)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唉韭,一起剝皮案震驚了整個(gè)濱河市犯犁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酸役,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣澡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡入桂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)抗愁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜘腌,你說(shuō)我怎么就攤上這事〈橹椋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵勺届,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我免姿,道長(zhǎng),這世上最難降的妖魔是什么养泡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮澜掩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肩榕。我一直安慰自己,他們只是感情好株汉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著乔妈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪路召。 梳的紋絲不亂的頭發(fā)上勃刨,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天股淡,我揣著相機(jī)與錄音,去河邊找鬼唯灵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埠帕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搞监,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼镰矿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了秤标?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苍姜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后衙猪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垫释,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了显蝌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曼尊,死狀恐怖酬诀,靈堂內(nèi)的尸體忽然破棺而出骆撇,到底是詐尸還是另有隱情瞒御,我是刑警寧澤神郊,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站屿岂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爷怀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一运授、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吁朦,春花似錦、人聲如沸逗宜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至熬甚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乡括,已是汗流浹背肃廓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诲泌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人档礁。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親递礼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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