1淡溯、BOM:瀏覽器對象模型(Browser object model),主要處理瀏覽器窗口和框架获黔,封裝了一系列與瀏覽器交互的方法和接口宾舅;其通過js來訪問、控制炊林、修改瀏覽器(準確的說是瀏覽器窗口);
DOM:封裝系列方法操作html和xml,BOM封裝系列方法來操作瀏覽器姥卢,準確的說是操作瀏覽器窗口,window表示的便是瀏覽器窗口(iframe框架引入的頁面也是窗口)渣聚,所以玩轉(zhuǎn)BOM就是玩轉(zhuǎn)window對象,window對象下有很多屬性和方法独榴;[如果聚焦到屬性,這些屬性也都是對象奕枝,也有自己的屬性和方法]
窗口:瀏覽器網(wǎng)頁窗口以及iframe引入的都稱之為窗口棺榔,iframe框架引入的網(wǎng)頁有完整的文檔結(jié)構(gòu),等同于是新的網(wǎng)頁(html,head,body都有)隘道;而可視區(qū)窗口指的是html文檔內(nèi)容呈現(xiàn)出的部分症歇;
window對象的兩層含義:(1).其表示瀏覽器窗口或框架;(2).window就是全局對象谭梗,window對象的屬性便是全局變量忘晤,例如:window.document? ------>>> document即可(window可省略);
------>>>>>>
2激捏、window對象的屬性和方法:window對象的屬性便是一系列功能的集合设塔,包含:window對象/Navigator/History/Location/Screen等;
(1).document: window對象的屬性包含了document屬性缩幸,因此通過window對象的document屬性就可以訪問壹置、檢索、修改文檔內(nèi)容與結(jié)構(gòu)表谊,document對象又是dom樹的根節(jié)點钞护;
(2).屬性和方法:
[1].window.innerWidth/Height; //?可視區(qū)寬/高:包含滾動條;clientWidth;/clientHeight;//ie9以下的屬性爆办,還有些小區(qū)別难咕,其表示的可視區(qū)寬/高不包含滾動條;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [2].pageXOffset;/pageYOffsset;可設(shè)置但不可操控(滾動條不會到達指定位置)距辆;應(yīng)用場景:圖片的懶加載(大型購物網(wǎng)站為了用戶體驗需要保證響應(yīng)迅速余佃,往往先把首屏內(nèi)容展示給用戶,剩下的內(nèi)容按需加載即可跨算;也許用戶壓根不看首屏直接搜索爆土,避免把所有內(nèi)容都加載好占用帶寬,浪費流量)诸蚕;[3].window.screenX/Y;//chrome,firefox支持步势;window.screenLeft/Top;//ie opera支持氧猬,表示的是窗口左上角在屏幕中的x/y坐標,只讀,得到數(shù)字坏瘩; screenX/Y = screenX/Y || screenLeft/Top;? ? ? ? ? ? ? ? ? ? ? ? ? [4].window.top/length/parent/self;涉及到引入iframe框架后的操作盅抚,父子域,同源策略等(iframe引入的是完整的文檔結(jié)構(gòu)倔矾,有自己的window)妄均;top:嵌套父子頁面中表示最頂層;self是拿到自身哪自;所以平時變量聲明中不要聲明var top/parent/name/self等丰包,避免沖突;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [5].window.name:窗口的名字提陶,可讀/可寫烫沙,其與頁面內(nèi)容無關(guān),只是給窗口取名字而已隙笆;
[6].setInterval();/setTimeout();/clearInterval();/clearTimeout();/scroll();scrollTo();/scrollBy();[7].open();/close();//window.open();//方法返回值為新窗口的window锌蓄;close();//關(guān)閉新打開的窗口,(不同瀏覽器兼容性有差異撑柔,一些瀏覽器可以關(guān)閉任何窗口)
[8].window系列彈窗是原生的UI部分,由于太粗糙瘸爽,日常開發(fā)中都不用原生window的彈窗;
window.alert("hello"+\n+"world");//報錯铅忿;window.alert("hello+\n+world");//hello+?換行 +world;? ? ? ? ? window.alert("hello"+"\n"+"world");//?帶有折行的對話框
------->>>>>window對象有很多屬性剪决,單獨就屬性來探討,其是對象有獨立的屬性和方法檀训;
(3).navigator對象:瀏覽器客戶端的信息(引用的Navigator對象柑潦,其是構(gòu)造函數(shù),系統(tǒng)用來構(gòu)造,不允許自定義) [平時談到的Navigator對象有些不嚴格]
navigator.appVersion;/ navigator.userAgent,第二個更加全面一些峻凫,包含瀏覽器的信息渗鬼;應(yīng)用場景:開發(fā)中為了兼容不同的瀏覽器往往需要開發(fā)多個版本的同一網(wǎng)頁,然后將其部署到服務(wù)器中荧琼,當(dāng)用戶通過瀏覽器發(fā)出網(wǎng)絡(luò)請求的過程中譬胎,實際會將所使用的瀏覽器信息也就是navigator.userAgent上的信息,和http:協(xié)議一起發(fā)送給服務(wù)器(當(dāng)作報文)命锄,然后服務(wù)器根據(jù)瀏覽器的信息返回相應(yīng)的網(wǎng)頁堰乔;上述為后臺應(yīng)用場景,瀏覽器端也有很多應(yīng)用場景脐恩,例如通過其來判斷所處的平臺是瀏覽器端還是移動端镐侯,提取有效數(shù)據(jù);
navigator.cookieEnabled//返回是否啟用cookie的布爾值驶冒;(cookie就是個文件苟翻,里面保存的用戶名/密碼搭伤,后端有相應(yīng)的時間機制,若是幾小時內(nèi)登錄便不需要再次輸入用戶名和密碼)
navigator.onLine//返回系統(tǒng)是否脫機(沒聯(lián)網(wǎng))的布爾值;(應(yīng)用場景:若是沒有脫機袜瞬,則進行網(wǎng)絡(luò)請求最新的網(wǎng)頁內(nèi)容,若是脫機身堡,則返回緩存的網(wǎng)頁內(nèi)容邓尤,其也是離線緩存的依據(jù))
(4).history對象:瀏覽器窗口中訪問過的URL;(html5對其進行了很多補充)
history.length;//訪問過的URL數(shù)量;history.back();//后退贴谎;history.forward();//前一個汞扎;history.go();//參數(shù)為數(shù)字(正負皆可),加載到某個具體的頁面擅这;[back();和go();無參數(shù),目前瀏覽器也支持填入?yún)?shù)加載到某頁面澈魄,前進后退按鈕底層調(diào)用的便是該方法]
(5).location對象:當(dāng)前URL的信息;屬性都是可讀可寫仲翎;
https://www.baidu.com/s?wd=URL&rsv_spt=1&rsv_iqid=0xd61dd2b20002cb56#dd? ? ? ? ? ? ? ? ? ? ? ? ? url:統(tǒng)一資源定位器痹扇;協(xié)議名;域名(www:baidu.com:443),端口號可省略溯香,https:443,http:80;? ? ? ? ? ? ? 主機名:物理地址鲫构; /s:?路徑; ?以及后面的&,=都是參數(shù)(經(jīng)過編碼后的參數(shù));? ?#:錨點玫坛;
location.href;//返回完整的URL结笨;location.hash;//返回從#開始的值;location.host;//返回主機名和當(dāng)前URL的端口號湿镀;location.hostname;//返回主機名炕吸;location.pathname;//URL中的路徑部分;location.port;//返回端口號勉痴;location.protocol;//返回協(xié)議名赫模;location.search;//從?開始的URL部分,查詢蚀腿;
location.assign();//加載新文檔嘴瓤;location.reload();//重新加載文檔,參數(shù)選填莉钙,若是不填或者是填false則取消瀏覽器緩存的文檔廓脆;location.replace();//用新文檔替換當(dāng)前文檔(沒有歷史記錄,很少用到)
補充:操作過程中頁面跳轉(zhuǎn)或刷新磁玉,若只是修改錨點頁面并不會刷新(特性現(xiàn)象)停忿,URL任何部分的修改整個地址欄便產(chǎn)生了變化,由于錨點的特性蚊伞,如今開發(fā)更傾向于用戶體驗感更好的單頁面應(yīng)用(vue框架)席赂,錨點的改變代表著路由的變化吮铭;(錨點最原生的應(yīng)用是:點擊固定的側(cè)邊欄跳轉(zhuǎn)到相應(yīng)的位置,如今單頁面應(yīng)用屬于錨點的高級應(yīng)用)
(6).screen對象:客戶端顯示屏幕的信息颅停;js可以利用這些信息來優(yōu)化它們的輸出谓晌,以達到用戶的顯示要求,一個程序可以根據(jù)顯示器的尺寸來選擇使用大圖像還是使用小圖像癞揉,它還可以根據(jù)顯示器的顏色深度選擇使用16位色還是使用8位色的圖形纸肉;js程序還可以根據(jù)屏幕尺寸的信息將新的瀏覽器窗口定位在屏幕中間;[根據(jù)屏幕信息作出相應(yīng)的改變]
screen.width/height;//返回顯示器屏幕的寬/高喊熟;包含任務(wù)欄柏肪;
screen.availWidth/availHeight;//返回顯示器屏幕的寬/高;(除去window的任務(wù)欄)
【注:使用對象就是小寫的形式芥牌,大寫的即為構(gòu)造函數(shù)的函數(shù)名烦味,要加以區(qū)分,window/Window】