BOM 對(duì)象 & localStorage & cookie & session

window.onload 和 document.onDOMContentLoaded的區(qū)別


window.onloaddocument.onDOMContentLoaded都表示當(dāng)頁面加載元素(包括圖片等信息)完畢后執(zhí)行的操作膘壶,兩者間的主要差別如下:

  1. 當(dāng)window.onload事件需等到頁面上所有的DOM错蝴、樣式表洲愤、腳本、圖片及flash都已經(jīng)加載完成后觸發(fā)顷锰。
  2. 當(dāng)document.onDOMContentLoaded事件在DOM加載完成后就會(huì)觸發(fā)柬赐,而不必等到樣式表、圖片和flash等元素加載完成之后官紫。

獲取真實(shí)寬高


一肛宋、如何獲取圖片的真實(shí)寬高

  • 對(duì)于支持HTML5的瀏覽器可以使用naturalWidth/naturalHeight來直接獲取圖片的真實(shí)寬高:
var naturalWidth = document.getElementById('img').naturalWidth,
 naturalHeight = document.getElementById('img').naturalHeight;
  • IE7/8中可以使用new Image()來獲取:
function getNaturalSize (Domlement) {
 var img = new Image();
 img.src = DomElement.src;
 return {
  width: img.width,
  height: img.height
 };
}
 
// 使用
var natural = getNaturalSize (document.getElementById('img')),
 natureWidth = natural.width,
 natureHeight = natural.height;

二束世、如何獲取元素的真實(shí)寬高

  • 使用jquery
$("#id").height();
  • 使用DOM
document.getElementById("id").style.height (需要這樣設(shè)置才能獲取到高度酝陈,<div id="idName" style="height:300px;">);
document.getElementById("id").offsetHeight;
document.getElementById("id").clientHeight; 
  • 使用window.getComputedStyle()
var width = window.getComputedStyle(document.getElementById("id")).width;
var height = window.getComputedStyle(document.getElementById("id")).height;

URL的編碼/解碼方法


URL通過ASCII字符集利用因特網(wǎng)進(jìn)行發(fā)送,其只能使用英文字母良狈、阿拉伯?dāng)?shù)字和某些標(biāo)點(diǎn)符號(hào)后添,不能使用其他文字和符號(hào)笨枯。這意味著如果URL中存在漢字薪丁,就必須編碼后才能使用

"只有字母和數(shù)字[0-9a-zA-Z]馅精、一些特殊符號(hào)"$-_.+!*'(),"[不包括雙引號(hào)]严嗜、以及某些保留字,才可以不經(jīng)過編碼直接用于URL洲敢。"
JavaScript提供四個(gè)URL的編碼/解碼方法:

  1. decodeURI()
  2. decodeURIComponent()
  3. encodeURI()
  4. encodeURIComponent()

區(qū)別

  • encodeURI()方法不會(huì)對(duì)下列字符編碼:
  1. ASCII字母
  2. 數(shù)字
  3. ~!@#$&*()=:/,;?+'
  • encodeURIComponent()方法不會(huì)對(duì)下列字符編碼
  1. ASCII字母
  2. 數(shù)字
  3. ~!*()'

cookie & session &localStorage


一漫玄、cookie

  1. cookie是存儲(chǔ)在瀏覽器上的一小段數(shù)據(jù),用來記錄某些當(dāng)頁面關(guān)閉或者刷新后仍然需要記錄的信息压彭。在控制臺(tái)用 「document.cookie」查看你當(dāng)前正在瀏覽的網(wǎng)站的cookie睦优。
  2. cookie可以使用 js 在瀏覽器直接設(shè)置(用于記錄不敏感信息,如用戶名), 也可以在服務(wù)端通使用 HTTP 協(xié)議規(guī)定的 set-cookie 來讓瀏覽器種下cookie壮不,這是最常見的做法汗盘。(打開一個(gè)網(wǎng)站,清除全部cookie询一,然后刷新頁面隐孽,在network的Response headers試試找一找set-cookie吧)
  3. 每次網(wǎng)絡(luò)請(qǐng)求 Request headers 中都會(huì)帶上cookie。所以如果 cookie 太多太大對(duì)傳輸效率會(huì)有影響健蕊。
  4. 一般瀏覽器存儲(chǔ)cookie 最大容量為4k菱阵,所以大量數(shù)據(jù)不要存到cookie。
  5. 設(shè)置cookie時(shí)的參數(shù):
    • path:表示 cookie 影響到的路徑缩功,匹配該路徑才發(fā)送這個(gè) cookie晴及。
    • expires 和 maxAge:告訴瀏覽器 cookie 時(shí)候過期,maxAge 是 cookie 多久后過期的相對(duì)時(shí)間嫡锌。不設(shè)置這兩個(gè)選項(xiàng)時(shí)會(huì)產(chǎn)生 session cookie抗俄,session cookie 是 transient 的脆丁,當(dāng)用戶關(guān)閉瀏覽器時(shí),就被清除动雹。一般用來保存 session 的 session_id槽卫。
    • secure:當(dāng) secure 值為 true 時(shí),cookie 在 HTTP 中是無效胰蝠,在 HTTPS 中才有效歼培。
    • httpOnly:瀏覽器不允許腳本操作 document.cookie 去更改 cookie。一般情況下都應(yīng)該設(shè)置這個(gè)為 true茸塞,這樣可以避免被 xss 攻擊拿到cookie躲庄。

二、session

當(dāng)一個(gè)用戶打開淘寶登錄后钾虐,刷新瀏覽器仍然展示登錄狀態(tài)噪窘。服務(wù)器如何分辨這次發(fā)起請(qǐng)求的用戶是剛才登錄過的用戶呢?這里就使用了session保存狀態(tài)效扫。用戶在輸入用戶名密碼提交給服務(wù)端倔监,服務(wù)端驗(yàn)證通過后會(huì)創(chuàng)建一個(gè)session用于記錄用戶的相關(guān)信息,這個(gè) session 可保存在服務(wù)器內(nèi)存中菌仁,也可保存在數(shù)據(jù)庫中浩习。

  • 創(chuàng)建session后,會(huì)把關(guān)聯(lián)的session_id 通過setCookie 添加到http響應(yīng)頭部中济丘。
  • 瀏覽器在加載頁面時(shí)發(fā)現(xiàn)響應(yīng)頭部有 set-cookie字段谱秽,就把這個(gè)cookie 種到瀏覽器指定域名下。
  • 當(dāng)下次刷新頁面時(shí)摹迷,發(fā)送的請(qǐng)求會(huì)帶上這條cookie疟赊, 服務(wù)端在接收到后根據(jù)這個(gè)session_id來識(shí)別用戶。

cookie 是存儲(chǔ)在瀏覽器里的一小段「數(shù)據(jù)」峡碉,而session是一種讓服務(wù)器能識(shí)別某個(gè)用戶的「機(jī)制」近哟,session 在實(shí)現(xiàn)的過程中需要使用cookie。 二者不是同一維度的東西异赫。

三椅挣、localStorage

  1. localStorage HTML5本地存儲(chǔ)web storage特性的API之一,用于將大量數(shù)據(jù)(最大5M)保存在瀏覽器中塔拳,保存后數(shù)據(jù)永遠(yuǎn)存在不會(huì)失效過期鼠证,除非用 js手動(dòng)清除
  2. 不參與網(wǎng)絡(luò)傳輸靠抑。
  3. 一般用于性能優(yōu)化量九,可以保存圖片、js、css荠列、html 模板类浪、大量數(shù)據(jù)。

示例代碼


  • 判斷用戶的瀏覽器類型:
function isAndroid(){
  return /Android/i.test(navigator.userAgent); 
} 
function isIphone(){
  return /iPhone/i.test(navigator.userAgent); 
} 
function isIpad(){
  return /iPad/i.test(navigator.userAgent);
 } 
function isIOS(){ 
  return /iPad|iPhone|iMac/i.test(navigator.userAgent); }
  • 使用 localStorage封裝一個(gè) Storage 對(duì)象肌似,達(dá)到如下效果
Storage.set('name', '饑人谷') 
Storage.set('age', 2, 30) ;  //設(shè)置 name 字段存儲(chǔ)的值為'饑人谷'
Storage.set('teachers', ['ruoyu', 'fangfang', 'tom'],  60)

Storage.get('name')   // ‘饑人谷’
Storage.get('age')     //  如果不超過30秒费就,返回?cái)?shù)字類型的2;如果超過30秒川队,返回 undefined力细,并且 localStorage 里清除 age 字段
Storage.get('teachers')  //如果不超過60秒,返回?cái)?shù)組固额; 如果超過60秒眠蚂,返

解答:

var Storage = (function(){
  return {
    set: function(key, value, expireSeconds){
      localStorage[key] = JSON.stringify({
        value: value, 
        expired: expireSeconds===undefined?undefined:Date.now() + 1000*expireSeconds
      })
    },
    get: function(key){
      if(localStorage[key] === undefined){
        return
      }
      var o = JSON.parse(localStorage[key])
      if(o.expired === undefined || Date.now() < o.expired){
        return o.value
      }else{
        delete localStorage[key]
      }
    }
 }
})()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斗躏,隨后出現(xiàn)的幾起案子逝慧,更是在濱河造成了極大的恐慌,老刑警劉巖啄糙,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笛臣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡迈套,警方通過查閱死者的電腦和手機(jī)捐祠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門碱鳞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桑李,“玉大人,你說我怎么就攤上這事窿给」蟀祝” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵崩泡,是天一觀的道長(zhǎng)禁荒。 經(jīng)常有香客問我,道長(zhǎng)角撞,這世上最難降的妖魔是什么呛伴? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮谒所,結(jié)果婚禮上热康,老公的妹妹穿的比我還像新娘。我一直安慰自己劣领,他們只是感情好姐军,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般奕锌。 火紅的嫁衣襯著肌膚如雪著觉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天惊暴,我揣著相機(jī)與錄音饼丘,去河邊找鬼。 笑死辽话,一個(gè)胖子當(dāng)著我的面吹牛葬毫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屡穗,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼贴捡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了村砂?” 一聲冷哼從身側(cè)響起烂斋,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎础废,沒想到半個(gè)月后汛骂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡评腺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年帘瞭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒿讥。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝶念,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芋绸,到底是詐尸還是另有隱情媒殉,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布摔敛,位于F島的核電站廷蓉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏马昙。R本人自食惡果不足惜桃犬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望行楞。 院中可真熱鬧攒暇,春花似錦、人聲如沸敢伸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尾序,卻和暖如春钓丰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背每币。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工携丁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兰怠。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓梦鉴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親揭保。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肥橙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • window.onload 和 document.onDOMContentLoaded 有什么區(qū)別? 兩者的區(qū)別主...
    荷爾蒙榨汁機(jī)閱讀 413評(píng)論 0 0
  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù)秸侣,用來跟蹤用戶的整個(gè)會(huì)話存筏。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,627評(píng)論 1 49
  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,959評(píng)論 7 186
  • 文/韋劍 七夕椭坚,你來了 在翩翩的半空中,飛揚(yáng) 在絢麗的煙花下搏色,盛放 七夕善茎,你那么美 因?yàn)槟悖?鵲橋上“金風(fēng)玉露一相...
    韋劍閱讀 120評(píng)論 0 6
  • 文 | 2067趨勢(shì)分析 當(dāng)今的互聯(lián)網(wǎng)技術(shù)發(fā)展速度越來越迅猛,以比特幣為代表的區(qū)塊鏈技術(shù)也高速發(fā)展频轿。 比特幣在芝加...
    話每個(gè)周末閱讀 57評(píng)論 0 0