BOM 對象 & localStorage & cookie & session

window.onload 和 document.onDOMContentLoaded 有什么區(qū)別椰苟?

區(qū)別:

//頁面所有資源加載完成
  window.onload = function(){
    console.log('window loaded')
  }

  //DOM 結(jié)構(gòu)解析完成
  document.addEventListener('DOMContentLoaded', function(){
    console.log('DOMContentLoaded ')
  })
  • window.onload:當(dāng)頁面上所有資源全都加載完成才觸發(fā) onload,觸發(fā)時機特別晚梳凛;
  • document.onDOMContentLoaded:DOM 的結(jié)構(gòu)渲染完成就觸發(fā)月培,而不是頁面上的資源加載完成才觸發(fā)。

如何獲取圖片真實的寬高?

<img src="https://upload-images.jianshu.io/upload_images/3624093-96b6fd4aca7fa30e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="">

    <script>
      function $(selector){
        return document.querySelector(selector);
      }

      $('img').onload = function(){
        console.log(getComputedStyle(this).width);
      }
    </script>

如何獲取元素的真實寬高?

<style>
  div{
    height: 100px;
    width: 200px; 
    color: #fff;
    background-color: #000;
  }
</style>
<div>abcabc</div> 
<script>
var div = document.querySelector('div);
console.log(getComputedStyle(div).width); // 200px
console.log(getComputedStyle(div).height); // 100px
</script>

URL 如何編碼解碼凡资?為什么要編碼?

為什么要編碼
在因特網(wǎng)上傳送URL谬运,只能采用ASCII字符集
也就是說URL只能使用英文字母、阿拉伯?dāng)?shù)字和某些標(biāo)點符號垦藏,不能使用其他文字和符號梆暖,即
只有字母和數(shù)字[0-9a-zA-Z]、一些特殊符號$-_.+!*'()[不包括雙引號]掂骏、以及某些保留字(空格轉(zhuǎn)換為+)轰驳,才可以不經(jīng)過編碼直接用于URL
這意味著 如果URL中有漢字,就必須編碼后使用弟灼。 但是麻煩的是 標(biāo)準(zhǔn)的國際組織并沒有規(guī)定具體的編碼方法级解,而是交給應(yīng)用程序(瀏覽器)自己決定。 這導(dǎo)致"URL編碼"成為了一個混亂的領(lǐng)域田绑。
如果包含中文勤哗,其實會自動編碼的。

示例

URL 如何編碼解碼
URL編碼通常也被稱為百分號編碼(percent-encoding)掩驱,是因為它的編碼方式非常簡單:
使用%加上兩位的字符——0123456789ABCDEF——代表一個字節(jié)的十六進制形式芒划。URL編碼要做的冬竟,就是將每一個非安全的ASCII字符都被替換為“%xx”格式,
對于非ASCII字符民逼,RFC文檔建議使用utf-8對其進行編碼得到相應(yīng)的字節(jié)泵殴,然后對每個字節(jié)執(zhí)行百分號編碼。
如"中文"使用UTF-8字符集得到的字節(jié)為0xE4 0xB8 0xAD 0xE6 0x96 0x87拼苍,經(jīng)過Url編碼之后得到"%E4%B8%AD%E6%96%87"

.+ %20
./ %2F
.? %3F
.% %25
.# %23
.& %26

URL的編碼/解碼方法

JavaScript提供四個URL的編碼/解碼方法笑诅。

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

區(qū)別

encodeURI方法不會對下列字符編碼

1\. ASCII字母
2\. 數(shù)字
3\. ~!@#$&*()=:/,;?+'

encodeURIComponent方法不會對下列字符編碼

1\. ASCII字母
2\. 數(shù)字
3\. ~!*()'

所以encodeURIComponent比encodeURI編碼的范圍更大。

實際例子來說疮鲫,encodeURIComponent會把 http:// 編碼成 http%3A%2F%2F 而encodeURI卻不會吆你。

如果你需要編碼整個URL,然后需要使用這個URL棚点,那么用encodeURI早处。

 encodeURI("[http://blog.jirengu.com/?cat=11&a=饑人谷](http://blog.jirengu.com/?cat=11&a=%E9%A5%A5%E4%BA%BA%E8%B0%B7)");
 //"[http://blog.jirengu.com/?cat=11&a=%25E9%25A5%25A5%25E4%25BA%25BA%25E8%25B0%25B7](http://blog.jirengu.com/?cat=11&a=%25E9%25A5%25A5%25E4%25BA%25BA%25E8%25B0%25B7)";

其中,漢字被編碼瘫析。但是如果你用了encodeURIComponent砌梆,那么結(jié)果變?yōu)?/p>

"http%3A%2F%2Fblog.jirengu.com%2F%3Fcat%3D11%26a%3D%25E9%25A5%25A5%25E4%25BA%25BA%25E8%25B0%25B7"

補全如下函數(shù),判斷用戶的瀏覽器類型贬循。

function isAndroid(){
}
function isIphone(){
}
function isIpad(){
}
function isIOS(){
}
function isAndroid(){
  return /Android/.test(navigator.userAgent);
}
function isIphone(){
  return /Iphone/.test(navigator.userAgent);
}
function isIpad(){
   return /Ipad/.test(navigator.userAgent);
}
function isIOS(){
   return /(Iphone)|(Ipad)/i.test(navigator.userAgent);
}

通過userAgent屬性識別瀏覽器咸包,不是一個好辦法。因為必須考慮所有的情況(不同的瀏覽器杖虾,不同的版本)烂瘫,非常麻煩,而且無法保證未來的適用性奇适,更何況各種上網(wǎng)設(shè)備層出不窮坟比,難以窮盡。所以嚷往,現(xiàn)在一般不再識別瀏覽器了葛账,而是使用“功能識別”方法,即逐一測試當(dāng)前瀏覽器是否支持要用到的JavaScript功能皮仁。


cookie & session &localStorage 分別是什么籍琳?

一、cookie

  1. cookie是存儲在瀏覽器上的一小段數(shù)據(jù)贷祈,用來記錄某些當(dāng)頁面關(guān)閉或者刷新后仍然需要記錄的信息趋急。在控制臺用 「document.cookie」查看你當(dāng)前正在瀏覽的網(wǎng)站的cookie。
  2. cookie可以使用 js 在瀏覽器直接設(shè)置(用于記錄不敏感信息势誊,如用戶名), 也可以在服務(wù)端通使用 HTTP 協(xié)議規(guī)定的 set-cookie 來讓瀏覽器種下cookie呜达,這是最常見的做法。(打開一個網(wǎng)站粟耻,清除全部cookie闻丑,然后刷新頁面漩怎,在network的Response headers試試找一找set-cookie吧)
  3. 每次網(wǎng)絡(luò)請求 Request headers 中都會帶上cookie。所以如果 cookie 太多太大對傳輸效率會有影響嗦嗡。
  4. 一般瀏覽器存儲cookie 最大容量為4k勋锤,所以大量數(shù)據(jù)不要存到cookie。
  5. 設(shè)置cookie時的參數(shù):
    • path:表示 cookie 影響到的路徑侥祭,匹配該路徑才發(fā)送這個 cookie叁执。expires 和 maxAge:告訴瀏覽器 cookie 時候過期,maxAge 是 cookie 多久后過期的相對時間矮冬。不設(shè)置這兩個選項時會產(chǎn)生 session cookie谈宛,session cookie 是 transient 的,當(dāng)用戶關(guān)閉瀏覽器時胎署,就被清除吆录。一般用來保存 session 的 session_id。
    • secure:當(dāng) secure 值為 true 時琼牧,cookie 在 HTTP 中是無效恢筝,在 HTTPS 中才有效
    • httpOnly:瀏覽器不允許腳本操作 document.cookie 去更改 cookie。一般情況下都應(yīng)該設(shè)置這個為 true巨坊,這樣可以避免被 xss 攻擊拿到cookie撬槽。[cookie 參數(shù)][簡述 Cookie 是什么]

二、session
當(dāng)一個用戶打開淘寶登錄后趾撵,刷新瀏覽器仍然展示登錄狀態(tài)侄柔。服務(wù)器如何分辨這次發(fā)起請求的用戶是剛才登錄過的用戶呢?這里就使用了session保存狀態(tài)占调。用戶在輸入用戶名密碼提交給服務(wù)端暂题,服務(wù)端驗證通過后會創(chuàng)建一個session用于記錄用戶的相關(guān)信息,這個 session 可保存在服務(wù)器內(nèi)存中究珊,也可保存在數(shù)據(jù)庫中薪者。

創(chuàng)建session后,會把關(guān)聯(lián)的session_id 通過setCookie 添加到http響應(yīng)頭部中苦银。
瀏覽器在加載頁面時發(fā)現(xiàn)響應(yīng)頭部有 set-cookie字段,就把這個cookie 種到瀏覽器指定域名下赶站。
當(dāng)下次刷新頁面時幔虏,發(fā)送的請求會帶上這條cookie, 服務(wù)端在接收到后根據(jù)這個session_id來識別用戶贝椿。
cookie 是存儲在瀏覽器里的一小段「數(shù)據(jù)」想括,而session是一種讓服務(wù)器能識別某個用戶的「機制」,session 在實現(xiàn)的過程中需要使用cookie烙博。 二者不是同一維度的東西瑟蜈。

三烟逊、localStorage
localStorage HTML5本地存儲web storage特性的API之一,用于將大量數(shù)據(jù)(最大5M)保存在瀏覽器中铺根,保存后數(shù)據(jù)永遠(yuǎn)存在不會失效過期宪躯,除非用 js手動清除。
不參與網(wǎng)絡(luò)傳輸位迂。
一般用于性能優(yōu)化访雪,可以保存圖片、js掂林、css臣缀、html 模板、大量數(shù)據(jù)泻帮。


使用 localStorage封裝一個 Storage 對象精置,達(dá)到如下效果:

Storage.set('name', '饑人谷') 
Storage.set('age', 2, 30) ;  //設(shè)置 name 字段存儲的值為'饑人谷'
Storage.set('teachers', ['ruoyu', 'fangfang', 'tom'],  60)

Storage.get('name')   // ‘饑人谷’
Storage.get('age')     //  如果不超過30秒,返回數(shù)字類型的2锣杂;如果超過30秒脂倦,返回 undefined,并且 localStorage 里清除 age 字段
Storage.get('teachers')  //如果不超過60秒蹲堂,返回數(shù)組狼讨; 如果超過60秒,返回undefined
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)容合作請聯(lián)系作者
  • 序言:七十年代末柒竞,一起剝皮案震驚了整個濱河市政供,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朽基,老刑警劉巖布隔,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稼虎,居然都是意外死亡衅檀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門霎俩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哀军,“玉大人,你說我怎么就攤上這事打却∩际剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵柳击,是天一觀的道長猿推。 經(jīng)常有香客問我,道長捌肴,這世上最難降的妖魔是什么蹬叭? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任藕咏,我火速辦了婚禮,結(jié)果婚禮上秽五,老公的妹妹穿的比我還像新娘孽查。我一直安慰自己,他們只是感情好筝蚕,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布卦碾。 她就那樣靜靜地躺著,像睡著了一般起宽。 火紅的嫁衣襯著肌膚如雪洲胖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天坯沪,我揣著相機與錄音绿映,去河邊找鬼。 笑死腐晾,一個胖子當(dāng)著我的面吹牛叉弦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藻糖,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼淹冰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巨柒?” 一聲冷哼從身側(cè)響起樱拴,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洋满,沒想到半個月后晶乔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡牺勾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年正罢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驻民。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡翻具,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回还,到底是詐尸還是另有隱情裆泳,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布懦趋,位于F島的核電站晾虑,受9級特大地震影響疹味,放射性物質(zhì)發(fā)生泄漏仅叫。R本人自食惡果不足惜帜篇,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诫咱。 院中可真熱鬧笙隙,春花似錦、人聲如沸坎缭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掏呼。三九已至坏快,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憎夷,已是汗流浹背莽鸿。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拾给,地道東北人祥得。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像蒋得,于是被迫代替她去往敵國和親级及。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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