【三十一】瀏覽器對象

JavaScript可以獲取瀏覽器提供的很多對象,并進(jìn)行操作七芭。
</br>

window

window對象不但充當(dāng)全局作用域煮纵,而且表示瀏覽器窗口。
window對象有innerWidth和innerHeight屬性爬范,可以獲取瀏覽器窗口的內(nèi)部寬度和高度。內(nèi)部寬高是指出去菜單欄毡熏、工具欄坦敌、邊框等占位元素后侣诵,用于顯示網(wǎng)頁的凈寬高痢法。
兼容性:IE <= 8 不支持。

'use strict' ;
// 可以調(diào)整瀏覽器窗口大小試試:
alert('window inner size: ' + window.innerWidth + ' x ' + window.innerHeight);

對應(yīng)的杜顺,還有一個outerWidth和outerHeight屬性财搁,可以獲取瀏覽器窗口的整個寬高。
</br>

navigator

navigator對象表示瀏覽器的信息躬络,最常用的屬性包括:

  • navigator.appName: 瀏覽器名稱尖奔;
  • navigator.appVersion: 瀏覽器版本;
  • navigator.language: 瀏覽器設(shè)置的語言;
  • navigator.platform: 操作系統(tǒng)類型穷当;
  • navigator.userAgent: 瀏覽器設(shè)定的User-Agent字符串提茁。
'use strict';
alert('appName = ' + navigator.appName + '\n' +
        'appVersion = ' navigator.appVersion + '\n' +
        'language = ' + navigator.language + '\n' +
        'platform = ' + navigator.platform + '\n' +
        'userAgent = ' + navigator.userAgent);

<u>請注意,navigator的信息可以很容易地被用戶修改馁菜,所以JavaScript讀取的值不一定是正確的茴扁。很多初學(xué)者為了針對不同瀏覽器編寫不同的代碼,喜歡用if判斷瀏覽器版本汪疮,例如:</u>

var width;
if (getIEVersion(navigator.userAgent) < 9) {
    width = document.body.clientWidth;
} else {
    width = window.innerWidth;
}

但這樣既可能判斷不準(zhǔn)確峭火,也很難維護(hù)代碼毁习。正確的方法是充分利用JavaScript對不存在屬性返回undefined的特性,直接用短路運(yùn)算符 || 計(jì)算:

var width = window.innerWidth || document.body.clientWidth;

</br>

screen

screen對象表示屏幕的信息卖丸,常用的屬性有:

  • screen.width: 屏幕寬度纺且,以像素為單位;
  • screen.height: 屏幕高度稍浆,以像素為單位载碌;
  • scrren.colorDepth: 返回顏色位數(shù),如8粹湃、16恐仑、24。
'use strict';
alert('Screen size = ' + screen.width + ' x ' + screen.height);

</br>

location

location對象表示當(dāng)前頁面的URL信息为鳄。例如裳仆,一個完整的URL:

http://www.example.com:8080/path/index.html?a=1&b=2#TOP

可以用location.href獲取。要獲得URL各個部分的值孤钦,可以這么寫:

location.protocol:  // 'http'
location.host;  // 'www.example.com'
location.port;  // '8080'
location.pathname;  // '/path/index.html'
location.search; // '?a=1&b=2'
location.hash; // 'TOP'

要加載一個新頁面歧斟,可以調(diào)用location.assign()。如果要重新加載當(dāng)前頁面偏形,調(diào)用location.reload()方法非常方便静袖。

'use strict';
if (confirm('重新加載當(dāng)前頁' + location.href + '?')) {
    location.reload();
} else {
    location.assign('/discuss');  // 設(shè)置一個新的URL地址
}

</br>

document

document對象表示當(dāng)前頁面。由于HTML在瀏覽器中以DOM形式表示為樹形結(jié)構(gòu)俊扭,document對象就是整個DOM樹的根節(jié)點(diǎn)队橙。
document的title屬性是從HTML文檔中的<title>xxx</title>讀取的,但是可以動態(tài)改變:

'use strict';
document.title = '努力學(xué)習(xí)JavaScript!';
//瀏覽器窗口的title會變?yōu)椤芭W(xué)習(xí)JavaScript萨惑!”

請觀察瀏覽器窗口標(biāo)題的變化捐康。
要查找DOM樹的某個節(jié)點(diǎn),需要從document對象開始查找庸蔼。最常用的查找是根據(jù)ID和TagName解总。
我們先準(zhǔn)備HTML數(shù)據(jù):

<dl id="drink-menu" style="border:solid 1px #ccc; padding:6px;">
    <dt>摩卡</dt>
    <dd>熱摩卡咖啡</dd>
    <dt>酸奶</dt>
    <dd>北京老酸奶</dd>
    <dt>果汁</dt>
    <dd>鮮榨蘋果汁</dd>
</dl>

用document對象提供的getElementById() 和 getElementsByTagName()可以按ID獲得一個DOM節(jié)點(diǎn)和按Tag名稱獲得一組DOM節(jié)點(diǎn):

'use strict';
var menu = document.getElementById('drink-menu');
var drinks = document.getElementsByTagName('dt');
var i, s, menu, drinks;

menu = document.getElementById('drink-menu');
menu.tagName;  // 'DL'

drinks = document.getElementsByTagName('dt');
s = '提供的飲料有:';
for (i=0; i<drinks.length; i++) {
    s = s + drinks[i].innerHTML + ',';
}
alert(s);

document對象還有一個cookie屬性姐仅,可以獲取當(dāng)前頁面的Cookie花枫。
Cookie是由服務(wù)器發(fā)送的key-value標(biāo)示符。因?yàn)镠TTP協(xié)議是無狀態(tài)的掏膏,但是服務(wù)器要區(qū)分到底是哪個用戶發(fā)過來的請求劳翰,就可以用Cookie來區(qū)分。當(dāng)一個用戶成功登錄后馒疹,服務(wù)器發(fā)送一個Cookie給瀏覽器佳簸,例如user=ABC123XYZ(加密的字符串)...,此后,瀏覽器訪問該網(wǎng)站時行冰,會在請求頭附上這個Cookie溺蕉,服務(wù)器根據(jù)Cookie即可區(qū)分出用戶伶丐。
Cookie還可以存儲網(wǎng)站的一些設(shè)置,例如疯特,頁面顯示的語言等等哗魂。
JavaScript可以通過document.cookie讀取到當(dāng)前頁面的Cookie;

document.cookie;  // 'v=123; remember=true; prefer=zh'

由于JavaScript能讀取到頁面的Cookie漓雅,而用戶的登錄信息通常也存在Cookie中录别,這就造成了巨大的安全隱患,這是因?yàn)樵贖TML頁面中引入第三方的JavaScript代碼是允許的:

<!-- 當(dāng)前頁面在wwwexample.com -->
<html>
    <head>
        <script src='http://www.foo.com/jquery.js'></script>
    </head>
  ...
</html>

如果引入的第三方的JavaScript中存在惡意代碼邻吞,則www.foo.com網(wǎng)站將直接獲取到www.example.com網(wǎng)站的用戶登錄信息组题。
為了解決這個問題,服務(wù)器在設(shè)置Cookie時可以使用httpOnly,設(shè)定了httpOnly的Cookie將不能被JavaScript讀取抱冷。這個行為由瀏覽器實(shí)現(xiàn)崔列,主流瀏覽器均支持httpOnly選項(xiàng),IE從IE6 SP1開始支持旺遮。
為了確保安全赵讯,服務(wù)器端在設(shè)置Cookie時,應(yīng)該始終堅(jiān)持使用httpOnly耿眉。
</br>

history

history對象保存了瀏覽器的歷史記錄边翼,JavaScript可以調(diào)用history對象的back()或forward(),相當(dāng)于用戶點(diǎn)擊了瀏覽器的“后退”或“前進(jìn)”按鈕鸣剪。
這個對象屬于歷史遺留對象组底,對于現(xiàn)代Web頁面來說,由于大量使用AJAX和頁面交互筐骇,簡單粗暴地調(diào)用history.back()可能會讓用戶感到非常憤怒债鸡。
新手開始設(shè)計(jì)Web頁面時喜歡在登錄頁登陸成功時調(diào)用history.back(),試圖回到登錄前的頁面。這是一種錯誤的方法拥褂。
任何情況娘锁,你都不應(yīng)該使用history這個對象了牙寞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饺鹃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子间雀,更是在濱河造成了極大的恐慌悔详,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惹挟,死亡現(xiàn)場離奇詭異茄螃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)连锯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門归苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來用狱,“玉大人,你說我怎么就攤上這事拼弃∠囊粒” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵吻氧,是天一觀的道長溺忧。 經(jīng)常有香客問我,道長盯孙,這世上最難降的妖魔是什么鲁森? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮振惰,結(jié)果婚禮上歌溉,老公的妹妹穿的比我還像新娘。我一直安慰自己骑晶,他們只是感情好研底,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著透罢,像睡著了一般榜晦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羽圃,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天乾胶,我揣著相機(jī)與錄音,去河邊找鬼朽寞。 笑死识窿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脑融。 我是一名探鬼主播喻频,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肘迎!你這毒婦竟也來了甥温?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤妓布,失蹤者是張志新(化名)和其女友劉穎姻蚓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匣沼,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狰挡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片加叁。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倦沧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出它匕,到底是詐尸還是另有隱情刀脏,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布超凳,位于F島的核電站愈污,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轮傍。R本人自食惡果不足惜暂雹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望创夜。 院中可真熱鬧杭跪,春花似錦、人聲如沸驰吓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檬贰。三九已至姑廉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁涤,已是汗流浹背桥言。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葵礼,地道東北人号阿。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像鸳粉,于是被迫代替她去往敵國和親扔涧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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