整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          沒有自主內(nèi)核好不好用?-國產(chǎn)瀏覽器獨(dú)家對(duì)比體驗(yàn)評(píng)測(cè)

          沒有自主內(nèi)核好不好用?-國產(chǎn)瀏覽器獨(dú)家對(duì)比體驗(yàn)評(píng)測(cè)

          擊上方藍(lán)字關(guān)注我們

          保持犀利風(fēng)格,持續(xù)科技新聞報(bào)道及業(yè)界深度剖析

          用戶上網(wǎng)找新聞、看直播、打網(wǎng)頁游戲等都要使用瀏覽器,可以說瀏覽器是互聯(lián)網(wǎng)時(shí)代的入口,是兵家必爭(zhēng)之地,而國產(chǎn)瀏覽器是其中不可忽視的一支重要力量。國產(chǎn)瀏覽器中誰的基本功最扎實(shí)、誰的功能設(shè)計(jì)最貼心呢?不比不知道,下面我們將從多個(gè)角度全方面剖析國產(chǎn)瀏覽器!

          參測(cè)產(chǎn)品

          360安全瀏覽器

          版本:10.0.1383

          360安全瀏覽器是一款“IE內(nèi)核+Chromium內(nèi)核”的雙核瀏覽器,擁有全國最大的惡意網(wǎng)址庫,可自動(dòng)攔截掛馬、欺詐、網(wǎng)銀仿冒等惡意網(wǎng)站。

          QQ瀏覽器

          版本:10.2.1

          QQ瀏覽器前身是騰訊TT瀏覽器,采用“IE內(nèi)核+Chromium內(nèi)核”雙核設(shè)計(jì),支持QQ快捷登錄,登錄瀏覽器后即可自動(dòng)登錄騰訊系網(wǎng)頁。

          百度瀏覽器

          版本: 8.7.5000.4982

          百度瀏覽器是一款“IE內(nèi)核+Chromium內(nèi)核”雙核瀏覽器,整合了游戲、影視、音樂等熱門應(yīng)用,另外配置了百度云加速技術(shù),下載百度云資源有提升效果。

          搜狗高速瀏覽器

          版本: 8.5.0822

          搜狗高速瀏覽器是一款“IE內(nèi)核+Chromium內(nèi)核”雙核瀏覽器,其首創(chuàng)的“網(wǎng)頁關(guān)注”功能可以將內(nèi)容以訂閱的方式提供給用戶瀏覽。

          遨游瀏覽器

          版本: 5.02

          傲游瀏覽器是最早的雙核瀏覽器,采用“IE內(nèi)核+Webkit內(nèi)核”設(shè)計(jì),也是全球首家覆蓋微軟、谷歌、蘋果三大平臺(tái)體系的瀏覽器廠商。

          紅芯企業(yè)瀏覽器

          版本: 3.0.54

          紅芯企業(yè)瀏覽器基于Chromium內(nèi)核,其主攻的是企業(yè)用戶,幫助企業(yè)更好的進(jìn)行用戶認(rèn)證、安全管控、入口統(tǒng)一和保護(hù)數(shù)據(jù)。

          測(cè)試環(huán)境

          CPU:Intel 酷睿i3 4160 3.6GHz

          內(nèi)存:4GB

          顯卡:NVIDIA GeForce GT 630

          硬盤:1TB

          寬帶:100MB

          操作系統(tǒng):Windows 10專業(yè)版(64位)

          備注:為了貼近真實(shí)使用環(huán)境,在測(cè)試電腦中安裝了QQ、Office等必備軟件,關(guān)閉了Windows 10自帶的殺毒軟件。

          測(cè)試方案

          瀏覽器橫測(cè)分為兩個(gè)部分,先進(jìn)行被動(dòng)的專業(yè)性測(cè)試,也就是訪問專業(yè)評(píng)測(cè)網(wǎng)站,網(wǎng)站自動(dòng)給出瀏覽器的得分或者測(cè)試結(jié)果,這部分是數(shù)據(jù)評(píng)測(cè);之后再進(jìn)行主動(dòng)評(píng)測(cè),也就是體驗(yàn)瀏覽器的易用性。

          專業(yè)性測(cè)試部分分為CSS支持測(cè)試、JavaScript性能測(cè)試、Acid3測(cè)試、圖形加速測(cè)試和HTML5兼容性測(cè)試這五項(xiàng),沒有加入測(cè)試瀏覽器打開速度的單頁加載速度測(cè)試,為何不加入呢?主要是因?yàn)楦蓴_因素很多,在工作或生活中不大可能只運(yùn)行一個(gè)程序,如果有QQ、下載軟件、音樂軟件等在運(yùn)行就會(huì)形成較大的干擾,會(huì)出現(xiàn)同一臺(tái)電腦不同時(shí)刻測(cè)試的數(shù)值不同的情況,再加上現(xiàn)在的網(wǎng)速一般很快,多數(shù)網(wǎng)頁是不到1秒就打開了,不同瀏覽器的打開速度快慢主觀是體驗(yàn)不大的——不光網(wǎng)速很快,現(xiàn)在電腦的硬件也不錯(cuò)了,10年前需要進(jìn)行瀏覽器橫測(cè)要進(jìn)行CPU和內(nèi)存的資源占用情況,如今已經(jīng)毫不必要了,這兩項(xiàng)我們也不再進(jìn)行測(cè)試。

          主動(dòng)評(píng)測(cè)部分,體驗(yàn)頁面設(shè)計(jì)是否清爽、有無廣告、有無默認(rèn)首頁、是否推新聞、是否有人性化設(shè)計(jì)、插件是否豐富、有無特色功能等。我們認(rèn)為,一款優(yōu)秀的瀏覽器應(yīng)該有自己的獨(dú)門絕技才可以從同質(zhì)化競(jìng)爭(zhēng)中脫穎而出。

          測(cè)試項(xiàng)目1:CSS支持

          測(cè)試項(xiàng)目2:JavaScript性能

          測(cè)試項(xiàng)目3:Acid3兼容性

          測(cè)試項(xiàng)目4:圖形加速

          測(cè)試項(xiàng)目5:HTML5兼容性

          測(cè)試項(xiàng)目6:人性化體驗(yàn)

          測(cè)試項(xiàng)目7:實(shí)用性體驗(yàn)

          CSS支持:全部合格

          測(cè)試方案:CSS的英文全稱是Cascading Style Sheets,中文意思是層疊樣式表,用來展示網(wǎng)頁的顯示樣式和效果,例如網(wǎng)頁采用何種布局、文字采用何字體和顏色、背景選用何種圖片和顏色,展示何種網(wǎng)頁特效等,因此瀏覽器對(duì)CSS的支持程度決定了能正確顯示的網(wǎng)頁種類。

          本輪測(cè)試我們使用的是專業(yè)測(cè)試網(wǎng)站CSS3 Selectors Test。

          網(wǎng)址http://www.css3.info/selectors-test,它總共有574項(xiàng)測(cè)試,主要涉及盒子模型、列表模塊、超鏈接方式、語言模塊、背景和邊框、文字特效、多欄布局等項(xiàng)目,通過項(xiàng)目越多瀏覽器支持CSS的性能就越好。

          結(jié)果分析:6款參測(cè)瀏覽器全部通過574項(xiàng)測(cè)試都是合格的,CSS標(biāo)準(zhǔn)升級(jí)到CSS 3各大瀏覽器也隨之進(jìn)行了更新,可見有足夠的重視,基本功都很扎實(shí)。在測(cè)試中我們發(fā)現(xiàn)通過的速度不一樣,QQ瀏覽器的響應(yīng)時(shí)間最短,應(yīng)該跟其使用的是最新版Chrome 63的內(nèi)核以及自行進(jìn)行了相關(guān)的優(yōu)化有關(guān)。


          JavaScript性能:QQ瀏覽器稍勝一籌

          測(cè)試方案:JavaScript一種計(jì)算機(jī)腳本語言,是瀏覽器的重要組成部分(JavaScript引擎),也是網(wǎng)頁的重要元素,經(jīng)常用來為網(wǎng)頁增加動(dòng)態(tài)功能,因此一款優(yōu)秀的瀏覽器必須較好地支持JavaScript,如此一來用戶才可以得到更流暢的網(wǎng)頁瀏覽效果。

          本輪測(cè)試我們使用的是專業(yè)測(cè)試網(wǎng)站SunSpider JavaScript Benchmark(1.1版),網(wǎng)址是https://webkit.org/perf/sunspider/sunspider.html。

          它設(shè)計(jì)了大量JavaScript實(shí)際生活中可能碰到的問題,如果瀏覽器可以解決的JavaScript問題越多,得分就會(huì)越低,瀏覽器就越優(yōu)異。

          結(jié)果分析:這項(xiàng)測(cè)試如果使用3年前的瀏覽器版本,所有瀏覽器的分值都要超過200(分值集中在250~300),如今6款參測(cè)瀏覽器的分值都在200以下,可謂進(jìn)步不小。本輪測(cè)試,QQ瀏覽器排名第一,傲游瀏覽器和360安全瀏覽器分列第二第三,紅芯企業(yè)瀏覽器居然不是末位到是令人有點(diǎn)意外。

          JavaScript性能測(cè)試

          Acid3兼容性:全部合格

          測(cè)試方案:Acid3是一個(gè)測(cè)試網(wǎng)頁兼容性的標(biāo)準(zhǔn),它測(cè)試焦點(diǎn)集中在ECMAScript、DOM Level 3、Media Queries等,是目前Web基準(zhǔn)測(cè)試中最嚴(yán)格的。本輪測(cè)試我們使用的是專業(yè)測(cè)試網(wǎng)站Acid3,網(wǎng)址是http://acid3.acidtests.org,測(cè)試總分為100分,如果未通過測(cè)試左上角有紅色字顯示,得分越高瀏覽器的兼容性就越好。

          結(jié)果分析:測(cè)試中出現(xiàn)了意想不到的情況,僅有百度瀏覽器、紅芯企業(yè)瀏覽器獲得100完美通關(guān)瀏覽器兼容性測(cè)試,而搜狗高速瀏覽器得分99,360安全瀏覽器、傲游瀏覽器和QQ瀏覽器得分都是97,難道后四款瀏覽器的兼容性真的這么差?開啟后四款瀏覽器的兼容模式(也就是啟用IE內(nèi)核),全部順利通關(guān)兼容性測(cè)試。按道理雙核瀏覽器會(huì)智能切換內(nèi)核,不過碰到專業(yè)測(cè)試網(wǎng)站Acid3出現(xiàn)了意外,我們從網(wǎng)上下載了10年前的建站程序Discuz特制了10個(gè)過時(shí)網(wǎng)頁逐一測(cè)試搜狗高速瀏覽器、360安全瀏覽器、傲游瀏覽器和QQ瀏覽器,瀏覽器都順利展示了網(wǎng)頁,兼容模式都順利切換了,也就是說在實(shí)際生活中應(yīng)該不受影響。

          圖形加速:360、QQ相對(duì)更優(yōu)異

          測(cè)試方案:玩網(wǎng)頁游戲或者社交平臺(tái)上的小游戲,看網(wǎng)頁中的視頻或直播對(duì)圖形加載都有較高的要求,很是考驗(yàn)瀏覽器處理頁面圖形的能力,如果瀏覽器圖形加速不給力用戶就會(huì)有卡的感覺。本輪測(cè)試我們使用的是專業(yè)測(cè)試網(wǎng)站FishIETank,網(wǎng)址是https://testdrive-archive.azurewebsites.net/performance/fishietank,統(tǒng)一設(shè)置為1000條魚彩色魚在頁面亂竄,等10秒數(shù)據(jù)穩(wěn)定后觀察幀數(shù),幀數(shù)越高說明瀏覽器的圖形加速越快性能來越好。

          結(jié)果分析:6款參測(cè)瀏覽器的幀數(shù)全部達(dá)到60幀,全部通過圖形加速測(cè)試。如果使用3年前的瀏覽器版本,沒有一款瀏覽器的幀數(shù)可以超過40幀,有的瀏覽器甚至?xí)霈F(xiàn)極端卡頓的情況,如今這些狀況都沒有了——雖然幀數(shù)值是一樣的,但從0~60的過程速度卻不一樣,明顯360安全瀏覽器和QQ瀏覽器響應(yīng)速度更快一些。

          這是因?yàn)?60安全瀏覽器和QQ瀏覽器使用的都是Chrome 63版的內(nèi)核,傲游瀏覽器使用的是Chrome 61版的內(nèi)核,搜狗高速瀏覽器使用的是Chrome 58版的內(nèi)核,紅芯企業(yè)瀏覽器使用的是Chrome 49版的內(nèi)核,百度瀏覽器使用的是Chrome 47版的內(nèi)核,如此一來也解釋了百度瀏覽器和紅芯企業(yè)瀏覽器在Acid3兼容性上表現(xiàn)優(yōu)異的原因是因?yàn)槭褂玫氖堑桶姹镜腃hrome 內(nèi)核。

          HTML5兼容性:360安全瀏覽器稍勝一籌

          測(cè)試方案:HTML5是超文本標(biāo)記語言(HTML)的第五次重大修改,是下一代網(wǎng)頁技術(shù)的標(biāo)準(zhǔn),越來越多網(wǎng)站拋棄傳統(tǒng)的Flash技術(shù)轉(zhuǎn)而使用HTML5,因此瀏覽器較好地支持HTML5就顯得尤為重要了。本輪測(cè)試我們使用的是專業(yè)測(cè)試網(wǎng)站Html5test,網(wǎng)址是Html5test.com,訪問該網(wǎng)站等待數(shù)秒鐘就可以得到一個(gè)分?jǐn)?shù),總分是555,得分越高說明瀏覽器支持的HTML5項(xiàng)目越多表現(xiàn)越優(yōu)異。

          結(jié)果分析:6款參測(cè)瀏覽器得分最高的是520分的360安全瀏覽器,其次是518分的傲游瀏覽器、517分的QQ瀏覽器和516分的搜狗高速瀏覽器,516~518分值相差太小。

          因此我們可以說本輪測(cè)試360安全瀏覽器稍勝一籌,傲游瀏覽器、QQ瀏覽器和搜狗高速瀏覽器處于緊隨其后,而百度瀏覽器和紅芯企業(yè)瀏覽器的跟上述四款瀏覽器相差較大,還需進(jìn)一步優(yōu)化對(duì)HTML5的兼容性。

          人性化體驗(yàn):都有改進(jìn)空間

          測(cè)試方案:一款人性化好的瀏覽器應(yīng)該具備如下特征:頁面清爽沒有亂七八糟的推廣內(nèi)容或者廣告、有強(qiáng)力的廣告過濾功能、收藏方便且可以云同步、支持?jǐn)帱c(diǎn)續(xù)傳等。本輪測(cè)試,我們認(rèn)為人性化特征越多瀏覽器就越優(yōu)異。

          結(jié)果分析:6款參測(cè)瀏覽器在人性化設(shè)計(jì)上跟國外瀏覽器比有一定的差距,特別是對(duì)喜歡簡潔風(fēng)的用戶來說很不適應(yīng),當(dāng)然如果就喜歡內(nèi)容豐富那就另當(dāng)別論了。

          360瀏覽器在安裝時(shí)可以選擇自定義安裝,就可以取消默認(rèn)設(shè)置的首頁360導(dǎo)航,打開一個(gè)新標(biāo)簽自動(dòng)展示的是360搜索頁面,可以直接搜索相關(guān)內(nèi)容,會(huì)彈出購物廣告和熱點(diǎn)資訊,熱點(diǎn)資訊會(huì)針對(duì)用戶所在城市進(jìn)行有針對(duì)性的智能推薦,如果不喜歡這些怎么辦,好在360瀏覽器允許用戶進(jìn)入瀏覽器設(shè)置頁面,取消“今日優(yōu)選”“今日直播”“360熱點(diǎn)資訊”“快資訊”“狀態(tài)欄消息”等,如果再取消側(cè)邊欄、狀態(tài)欄、插件欄和顯示頭像登錄框整個(gè)頁面就清爽了。

          QQ瀏覽器的默認(rèn)首頁是2345導(dǎo)航,打開一個(gè)新標(biāo)簽自動(dòng)展示的是搜狗搜索,且會(huì)在收藏夾中自動(dòng)添加騰訊系的網(wǎng)頁標(biāo)簽,便于用戶今后快捷訪問騰訊系網(wǎng)站,雖然這也算是推廣廣告,但嚴(yán)格來說絕大多數(shù)網(wǎng)民在生活中離不開騰訊系網(wǎng)站,實(shí)用性相對(duì)較高;點(diǎn)擊“設(shè)置”,點(diǎn)擊“廣告過濾”,點(diǎn)擊“立即安裝”,就可以安裝強(qiáng)力廣告過濾插件Adblock Plus,點(diǎn)擊側(cè)邊欄的微信圖標(biāo)安裝微信程序,今后就可以在瀏覽器中愉悅地跟微信好友聊天呢,這兩個(gè)步驟是一定要做的;當(dāng)然,我們也可以通過設(shè)置頁面取消亂側(cè)邊欄等讓界面更清爽。

          百度瀏覽器的極光色皮膚是真的炫;默認(rèn)首頁是hao123導(dǎo)航,打開一個(gè)新標(biāo)簽自動(dòng)展示的百度搜索,在收藏夾中自動(dòng)添加購物、視頻等網(wǎng)頁;廣告過濾不需要安裝插件,是標(biāo)配功能,不過默認(rèn)是“輕度攔截”需要手動(dòng)調(diào)整為“強(qiáng)力攔截”。

          搜狗高速瀏覽器的默認(rèn)首頁是搜狗網(wǎng)址導(dǎo)航,打開一個(gè)新標(biāo)簽自動(dòng)展示的是搜狗搜索,也會(huì)在收藏夾中自動(dòng)添加網(wǎng)頁,不過添加的網(wǎng)頁多了一個(gè)種類,那就是網(wǎng)絡(luò)小說;標(biāo)配了廣告過濾功能,也可以安裝第三方廣告過濾效果更好的插件。

          傲游瀏覽器有點(diǎn)特殊,安裝后第一時(shí)間呈現(xiàn)的是賬號(hào)注冊(cè)頁面,需要用手機(jī)號(hào)碼注冊(cè),如果不想注冊(cè)就要在頁面底部點(diǎn)擊“跳過登錄”就可以正常使用了,這個(gè)設(shè)計(jì)太僵硬不會(huì)討用戶喜歡的;默認(rèn)首頁是傲游今日,這是一個(gè)集合“百度搜索+網(wǎng)址導(dǎo)航+廣告推廣”的綜合頁面。

          紅芯企業(yè)瀏覽器基本上沿用Chrome的布局,只不過在頂部多了一個(gè)名稱欄,顧名思義就是一直顯示“紅芯企業(yè)瀏覽器”這個(gè)名稱,是6款瀏覽器中唯一一個(gè)凸顯名稱的瀏覽器,其實(shí)這個(gè)設(shè)計(jì)毫不必要;斷點(diǎn)續(xù)傳不是自動(dòng)支持的,可以手動(dòng)操作,要定位到“恢復(fù)下載功能”,點(diǎn)擊“啟用”,再點(diǎn)擊“立即重新啟動(dòng)”,這沿用的是Chrome的設(shè)定。

          總的來說,國產(chǎn)瀏覽器比較看重流量導(dǎo)入,在人性化方面都有改進(jìn)的空間。

          其默認(rèn)首頁是企業(yè)內(nèi)部登錄入口

          實(shí)用性體驗(yàn):各有側(cè)重點(diǎn)

          測(cè)試方案:一款實(shí)用性好的瀏覽器應(yīng)該具備如下特征:智能攔截釣魚網(wǎng)站阻止用戶掉入入詐騙陷阱,即時(shí)掃描下載文件一旦發(fā)現(xiàn)病毒即可報(bào)警提示,支持屏幕截圖,支持無痕瀏覽、搜索關(guān)鍵詞歷史訪問記錄……本輪測(cè)試,我們認(rèn)為實(shí)用性特征越多瀏覽器就越優(yōu)異。

          結(jié)果分析:6款參測(cè)瀏覽器都自帶有完美防假死功能,一個(gè)頁面崩潰不好會(huì)導(dǎo)致瀏覽器崩潰,另外6款參測(cè)瀏覽器也都支持無痕瀏覽,也就是不記錄上網(wǎng)記錄、不記錄個(gè)人搜索信息、不保存賬號(hào)和密碼、禁止網(wǎng)頁的廣告程序記錄用戶的使用習(xí)慣等,不過設(shè)置操作不一樣,360安全瀏覽器和QQ瀏覽器相對(duì)操作更簡便一些。

          在安全防護(hù)方面,6款參測(cè)瀏覽器的差距就提現(xiàn)出來了,僅360安全瀏覽器和QQ瀏覽器可以提供全方面立體防護(hù),360安全瀏覽器可以配合360安全衛(wèi)士將防護(hù)等級(jí)和范圍做到最大,QQ瀏覽器可以配合騰訊電腦管家將防護(hù)等級(jí)和范圍做到最大,而剩下的4款瀏覽器只能單打獨(dú)斗。

          如果不考慮安全軟件,單論瀏覽器的安全防護(hù),360安全瀏覽器和QQ瀏覽器也是占優(yōu)的,因?yàn)檫@兩款瀏覽器具有多層防護(hù)能力——在URL層,可以依靠龐大的惡意網(wǎng)址庫快速、準(zhǔn)確攔截掛馬網(wǎng)站、釣魚網(wǎng)站、欺詐網(wǎng)站等,且這個(gè)操作是有遠(yuǎn)程服務(wù)器承擔(dān),不會(huì)給用戶電腦帶來任何負(fù)擔(dān)。

          由于360和騰訊的用戶數(shù)量龐大、搜集惡意網(wǎng)站是輕而易舉的事情,因此擁有強(qiáng)者恒強(qiáng)的優(yōu)勢(shì);如果惡意網(wǎng)站突破了URL層,那么第二道防線就是惡意腳本攔截層,瀏覽器機(jī)會(huì)嘗試攔截網(wǎng)頁中的惡意腳本,阻止惡意腳本進(jìn)入用戶的電腦下載盜號(hào)病毒、勒索病毒和挖礦病毒等。

          如果黑客使用了最新的漏洞或者免殺技術(shù)就有可能突破第二道防線,那么在下載時(shí)瀏覽器自動(dòng)識(shí)別下載源是不是來自木馬服務(wù)器、惡意服務(wù)器,如果地址吻合就阻止下載。例如仿冒騰訊QQ郵箱www.rhsox.cn/menber/ceshi01。在截稿時(shí)就QQ瀏覽器和360安全瀏覽器可以攔截。

          攔截仿冒網(wǎng)站

          在屏幕截圖和插件方面,除了紅芯企業(yè)瀏覽器其余瀏覽器的表現(xiàn)都不錯(cuò),截圖很智能可以實(shí)現(xiàn)按截圖時(shí)間自動(dòng)保存,也可以將網(wǎng)頁保存為圖片——傲游瀏覽器截圖功能不在一級(jí)頁面,而是在二級(jí)頁面,需要點(diǎn)擊“自定義快捷工具欄”,選擇“截圖”,另外插件入口也不一樣,點(diǎn)擊左下角的“設(shè)置”,選擇“獲得更多應(yīng)用”才可以看到豐富的插件。紅芯企業(yè)瀏覽器沒有截圖功能,插件入口也沒有,這也可以理解畢竟就算保留了入口也無法直接訪問Chrome應(yīng)用商店。

          在特色功能方面,就各有所長了。360安全瀏覽器細(xì)分的安全防護(hù)項(xiàng)目較多考慮很周到,嵌入互聯(lián)網(wǎng)理財(cái)平臺(tái),方便用戶購買到可靠的互聯(lián)網(wǎng)理財(cái)產(chǎn)品;QQ瀏覽器可以用QQ賬號(hào)登錄,享受騰訊系產(chǎn)品的一切便利和好處,例如騰訊翻譯君功能,劃詞翻譯、手動(dòng)輸入翻譯、網(wǎng)頁自動(dòng)識(shí)別并全文翻譯、文檔翻譯等都可以做到快速準(zhǔn)確。

          百度瀏覽器的積分兌換功能很實(shí)用,每天登錄瀏覽器獲得積分,攢到一定數(shù)量后就去百度瀏覽器積分商城中,兌換愛奇藝黃金會(huì)員、百度文庫VIP、百度云盤VIP、電影抵用券、京東全場(chǎng)滿減券等好東西。

          另外百度瀏覽器可以對(duì)迅雷、快車、旋風(fēng)的專用鏈進(jìn)行自動(dòng)轉(zhuǎn)換,獲取真實(shí)鏈接一鍵搞定下載。

          傲游瀏覽器的資源嗅探功能很不錯(cuò),可以快速找出頁面中全部圖片、內(nèi)嵌視頻音頻文件并一鍵下載,另外傲游筆記功能也不錯(cuò)可以同步各種數(shù)據(jù),新標(biāo)簽頁設(shè)計(jì)的動(dòng)感且符合Chrome的使用習(xí)慣;搜狗高速瀏覽器的片頭雷達(dá)很不錯(cuò),美劇和動(dòng)漫正片開始的位置通常是不固定的,而等待片頭結(jié)束又浪費(fèi)很多時(shí)間,片頭雷達(dá)功能利用大數(shù)據(jù)查找片頭,無論是國產(chǎn)劇、美劇、英劇還是動(dòng)漫,都能為用戶準(zhǔn)確找到片頭位置,跳過片頭節(jié)省時(shí)間,另外打假助手功能也做得不錯(cuò),智能提取網(wǎng)友購物真實(shí)評(píng)價(jià),通過大數(shù)據(jù)展現(xiàn)商品歷史價(jià)格;紅芯企業(yè)瀏覽器支持國密算法加密傳輸以及在企業(yè)端的內(nèi)容監(jiān)控。

          總結(jié)

          明:

          該文章為學(xué)習(xí)使用,嚴(yán)禁用于商業(yè)用途和非法用途,違者后果自負(fù),由此產(chǎn)生的一切后果均與作者無關(guān)

          一、瑞數(shù)簡介

          瑞數(shù)動(dòng)態(tài)安全 Botgate(機(jī)器人防火墻)以“動(dòng)態(tài)安全”技術(shù)為核心,通過動(dòng)態(tài)封裝、動(dòng)態(tài)驗(yàn)證、動(dòng)態(tài)混淆、動(dòng)態(tài)令牌等技術(shù)對(duì)服務(wù)器網(wǎng)頁底層代碼持續(xù)動(dòng)態(tài)變換,增加服務(wù)器行為的“不可預(yù)測(cè)性”,實(shí)現(xiàn)了從用戶端到服務(wù)器端的全方位“主動(dòng)防護(hù)”,為各類 Web、HTML5 提供強(qiáng)大的安全保護(hù)。

          二、瑞數(shù)特點(diǎn)

          1. 會(huì)有多層debugger,可以點(diǎn)擊Never pause here過掉debugger
          2. 會(huì)有多次請(qǐng)求
          • 瑞數(shù)4、瑞數(shù)5有兩次相同的請(qǐng)求,瑞數(shù)4第一個(gè)請(qǐng)求狀態(tài)碼202,瑞數(shù)5第一個(gè)請(qǐng)求狀態(tài)412,第一次請(qǐng)求響應(yīng)的html,會(huì)有個(gè)script標(biāo)簽外鏈js加載$_ts=window['$_ts'],外鏈js代碼可以固定,也可以通過對(duì)外鏈js發(fā)送請(qǐng)求獲取js代碼
          • 瑞數(shù)5.5有兩次相同的請(qǐng)求,第一次請(qǐng)求狀態(tài)碼412,響應(yīng)的html有外鏈js,此外鏈js代碼可以固定,也可以通過對(duì)外鏈js發(fā)送請(qǐng)求獲取js代碼
          • 瑞數(shù)6和瑞數(shù)5.5編譯過程差不多
          1. 第一次響應(yīng)的html,都會(huì)包含動(dòng)態(tài)加載的meta標(biāo)簽包含content、兩個(gè)script標(biāo)簽,
          • 瑞數(shù)4、瑞數(shù)5用第一個(gè)script加載包含_ts=window['$_ts']的js文件,第二個(gè)script加載一段自執(zhí)行的js,用于把之前加載的代碼處理成可用的js代碼,處理后的js字符串,通過call執(zhí)行,并生成cookie
          • 瑞數(shù)5.5用第一個(gè)script加載包含_ts=window['$_ts']代碼,第二個(gè)script加載自執(zhí)行js文件,用于把之前加載的代碼處理成可用的js代碼,處理后的js字符串,通過call執(zhí)行,并生成cookie
          1. 都會(huì)有特有的cookie標(biāo)識(shí)
          • 瑞數(shù)4:FSSBBIl1UgzbN7N80T,生成值的第一個(gè)字符就是代數(shù)
          • 瑞數(shù)5:IdlEqTWW2ERnT,生成值的第一個(gè)字符就是代數(shù)
          • 瑞數(shù)5.5:1EzPGwRUoQaWT,生成值的第一個(gè)字符就是代數(shù)
          1. 瑞數(shù)會(huì)檢測(cè)當(dāng)前執(zhí)行的文件是哪一個(gè),可以使用delete __filename、delete __dirname

          三、瑞數(shù)5特點(diǎn)

          1. 兩層debugger,可以點(diǎn)擊Never pause here過掉debugger
          2. 同一個(gè)請(qǐng)求兩次
          3. 第一次請(qǐng)求失敗,狀態(tài)碼是412
          • 首先會(huì)生成一個(gè)js文件:$_ts=window['$_ts'],代碼可以固定
          • 然后響應(yīng)返回一個(gè)html頁面,里面會(huì)有動(dòng)態(tài)加載的meta標(biāo)簽包含content、一個(gè)script標(biāo)簽加載剛才js文件、一段script標(biāo)簽包含的js代碼
          • 這段js代碼是個(gè)自執(zhí)行方法,會(huì)把之前的js代碼,轉(zhuǎn)換成可用的js代碼,并通過call方法執(zhí)行eval函數(shù)生成vm文件,在vm文件生成cookie,賦值給document.cookie
          • 響應(yīng)的cookie名字是:IdlEqTWW2ERnS
          1. 第一次請(qǐng)求js代碼生成的 cookie的名字是:IdlEqTWW2ERnT,生成值的第一個(gè)字符就是代數(shù)
          2. 第二次請(qǐng)求,會(huì)正確拿到數(shù)據(jù)

          四、找出需要加密的參數(shù)

          1. js運(yùn)行atob('aHR0cHM6Ly93d3cuMTAwMTAuY29tL25ldDUvMDc0Lw==') 拿到網(wǎng)址,F(xiàn)12打開調(diào)試工具(打開F12會(huì)遇到無限debugger,這是個(gè)eval執(zhí)行的debugger,右擊左側(cè)代碼行點(diǎn)擊Never pause here過掉即可),刷新頁面,找到 net5/074/ 請(qǐng)求(狀態(tài)200),鼠標(biāo)右擊請(qǐng)求找到Copy>Copy as cUrl(cmd)

          1. 打開網(wǎng)站:https://spidertools.cn/#/curl2Request,把拷貝好的curl轉(zhuǎn)成python代碼,新建 liantong.py,把代碼復(fù)制到該文件

          1. 多運(yùn)行幾次liantong.py,會(huì)發(fā)現(xiàn)請(qǐng)求失敗,狀態(tài)碼是412,仔細(xì)分析cookie會(huì)發(fā)現(xiàn)IdlEqTWW2ERnS、IdlEqTWW2ERnT,而IdlEqTWW2ERnT值得第一個(gè)字符是5,這是瑞數(shù)特點(diǎn)之一,字符5代表是瑞數(shù)5代

          1. 新建liantong.js,用于放扣下的代碼

          五、瑞數(shù)5 cookie 分析

          1. 使用hook定位IdlEqTWW2ERnT,參數(shù)生成位置,這里我使用的是油猴

          1. 編輯好油猴腳本,啟動(dòng)該腳本,切換到Application,清除瀏覽器的cookie,一定要清除cookie

          1. 清除cookie后,刷新頁面后會(huì)進(jìn)入油猴腳本里的debugger,一直點(diǎn)擊跳過當(dāng)前函數(shù)執(zhí)行,就會(huì)找到IdlEqTWW2ERnT賦值的地方

          1. 分析IdlEqTWW2ERnT賦值的地方,會(huì)發(fā)現(xiàn)是在_$MK函數(shù)中,搜索_$MK會(huì)找到調(diào)用該函數(shù)地方,點(diǎn)擊跳過斷點(diǎn),會(huì)進(jìn)入該斷點(diǎn)。注意這是個(gè)虛擬文件,每次生成的都不一樣,需結(jié)合當(dāng)前代碼分析

          1. 分析右側(cè)的堆棧,找到不屬于該虛擬文件的棧,分別點(diǎn)擊查看會(huì)發(fā)現(xiàn)一個(gè)call方法,該方法就是生成虛擬文件的地方,這個(gè)文件是第一次請(qǐng)求的響應(yīng)結(jié)果

          1. 使用無痕窗口打開網(wǎng)站,F(xiàn)12打開調(diào)試工具,點(diǎn)擊sources,找到事件監(jiān)聽勾選script

          1. 切換到Application,清除瀏覽器的cookie,一定要先清除cookie,清除cookie后,刷新頁面,會(huì)看到一個(gè)js文件,這是第一次請(qǐng)求生成的,把這個(gè)文件代碼全部拷貝到liantong.js

          1. 點(diǎn)擊跳過斷點(diǎn),會(huì)進(jìn)入一個(gè)html文件,這是第一次請(qǐng)求響應(yīng)結(jié)果,分析文件會(huì)發(fā)現(xiàn)一個(gè)meta標(biāo)簽、一個(gè)script標(biāo)簽引入了剛才生成的js、還有一個(gè)script標(biāo)簽里面有很多代碼,代碼用于把之前的js轉(zhuǎn)換成可用的js代碼

          1. 在該文件搜索.call,會(huì)找到一個(gè).call方法執(zhí)行,在該行打上斷點(diǎn)

          1. 點(diǎn)擊跳過斷點(diǎn),鼠標(biāo)懸浮到_$PU上會(huì)發(fā)現(xiàn)很多js字符串,這就是經(jīng)過該自執(zhí)行方法轉(zhuǎn)換后的js

          1. 這里要注意虛擬文件是動(dòng)態(tài)生成的,每次獲取到的都是不一樣的,為了方便調(diào)試,把html文件替換成本地文件,這樣每次生成的虛擬文件就是一樣的,右擊該html文件名稱,點(diǎn)擊Override content,如果替換成功后代碼都在一行,可以在本地找到該文件,用編輯器打開,格式化一下,并在call的位置打上斷點(diǎn)

          1. 把script中的自執(zhí)行方法全部拷貝到liantong.js,運(yùn)行l(wèi)iantong.js,會(huì)發(fā)現(xiàn)報(bào)window的錯(cuò)誤,window是瀏覽器環(huán)境的,node環(huán)境不存在,接下來開始補(bǔ)環(huán)境

          六、補(bǔ)環(huán)境

          1. 首選在代碼頂部補(bǔ)上window環(huán)境,并用代理自動(dòng)把需要補(bǔ)的環(huán)境吐出來,新建jsProxy.js把下面代碼拷貝過去
          // 代理器封裝
          function getEnv(proxy_array) {
              for(var i=0; i<proxy_array.length; i++){
                  handler=`{\n
                      get: function(target, property, receiver) {\n
                             console.log('方法:get','    對(duì)象:${proxy_array[i]}','    屬性:',property,'    屬性類型:',typeof property,'    屬性值類型:',typeof target[property]);
                             return target[property];
                      },
                      set: function(target, property, value, receiver){\n
                              console.log('方法:set','    對(duì)象:${proxy_array[i]}','    屬性:',property,'    屬性類型:',typeof property,'    屬性值類型:',typeof target[property]);
                              return Reflect.set(...arguments);
                      }
                  }`;
                  eval(`
                      try{\n
                          ${proxy_array[i]};\n
                          ${proxy_array[i]}=new Proxy(${proxy_array[i]},${handler});
                      }catch(e){\n
                          ${proxy_array[i]}={};\n
                          ${proxy_array[i]}=new Proxy(${proxy_array[i]},${handler});
                      }   
                  `)
              }
          }
          
          // proxy_array=['window', 'document', 'location', 'navigator', 'history','screen','target' ]
          // getEnv(proxy_array)
          
          module.exports=getEnv

          1. 運(yùn)行l(wèi)iantong.js,會(huì)發(fā)現(xiàn)在獲取window.top時(shí)報(bào)錯(cuò)了,在控制臺(tái)輸出window.top得知 window.top=window,在代碼頂部補(bǔ)上window.top

          1. 運(yùn)行l(wèi)iantong.js,會(huì)發(fā)現(xiàn)在獲取document.createElement時(shí)報(bào)錯(cuò)了,document.createElement是用來創(chuàng)建標(biāo)簽的,在代碼頂部補(bǔ)上document.createElement,之所以return出一個(gè)json,是因?yàn)闃?biāo)簽也是一個(gè)對(duì)象

          1. 運(yùn)行l(wèi)iantong.js,會(huì)發(fā)現(xiàn)在獲取document.createElement時(shí)又報(bào)錯(cuò)了,創(chuàng)建的標(biāo)簽是div,補(bǔ)上div,并找到打印信息最后的位置,會(huì)看到報(bào)錯(cuò)代碼

          1. 在瀏覽器call斷點(diǎn)處,點(diǎn)擊進(jìn)入該方法內(nèi)部會(huì)找到虛擬文件,在虛擬文件內(nèi)搜索$xX[_$rB[157]],會(huì)找到該方法的位置,在該行打上斷點(diǎn),點(diǎn)擊跳過斷點(diǎn),會(huì)進(jìn)入剛才的斷點(diǎn),把代碼信息在控制輸出,會(huì)發(fā)現(xiàn)是獲取div下的i標(biāo)簽,獲取出的結(jié)果是 length:0,在代碼頂部補(bǔ)上該代碼

          1. 運(yùn)行l(wèi)iantong.js,會(huì)發(fā)現(xiàn)在獲取window.attachEvent時(shí)報(bào)錯(cuò)了,找到打印信息最后的位置,會(huì)看到報(bào)錯(cuò)代碼,在虛擬文件內(nèi)搜索g[_$rB[195]],會(huì)找到該方法的位置,在該代碼處有個(gè)判斷,在if和else中都打上斷點(diǎn),點(diǎn)擊跳過斷點(diǎn),if斷點(diǎn),把代碼信息在控制輸出,會(huì)發(fā)現(xiàn)是window.addEventListener,獲取出的結(jié)果是 undefined,在代碼頂部補(bǔ)上該代碼

          1. 運(yùn)行l(wèi)iantong.js,會(huì)發(fā)現(xiàn)在獲取document.getElementsByTagName時(shí)報(bào)錯(cuò)了,找到打印信息最后的位置,會(huì)看到報(bào)錯(cuò)代碼,在虛擬文件內(nèi)搜索f[_$rB[157]],會(huì)找到多個(gè)該方法的位置,在所有的f[_$rB[157]]打上斷點(diǎn),點(diǎn)擊跳過斷點(diǎn),會(huì)進(jìn)入某一個(gè)斷點(diǎn),打印出信息,會(huì)發(fā)現(xiàn)是兩個(gè)meta對(duì)象和length,在代碼頂部補(bǔ)上代碼

          1. 兩個(gè)meta標(biāo)簽需要補(bǔ)什么代碼,就要分析下面的邏輯了,點(diǎn)擊跳過當(dāng)前函數(shù)執(zhí)行,分析代碼,會(huì)發(fā)現(xiàn)需要最后一個(gè)標(biāo)簽上的content,需要最后一個(gè)標(biāo)簽parentNode.removeChild 移除標(biāo)簽,最后會(huì)把content返回,根據(jù)分析補(bǔ)上代碼

          1. 重復(fù)運(yùn)行l(wèi)iantong.js,按照上面的方法補(bǔ)全環(huán)境
          2. 補(bǔ)完環(huán)境,修改liantong.js,再運(yùn)行,會(huì)發(fā)現(xiàn)已經(jīng)拿到IdlEqTWW2ERnT

          七、python代碼驗(yàn)證結(jié)果

          1. 修改liantong.js,因?yàn)閙eta中的content、還有js代碼都是動(dòng)態(tài)生成的,所以要用字符暫時(shí)占位,分別注釋掉之前content的值和js,用meta_content、js_code代替

          1. 修改fdc.py

          1. 點(diǎn)擊運(yùn)行fdc.py,會(huì)發(fā)現(xiàn)第二個(gè)請(qǐng)求報(bào)400,那是因?yàn)槿饠?shù)會(huì)檢測(cè)當(dāng)前執(zhí)行的文件是哪一個(gè)

          1. 修改liantong.js,再運(yùn)行fdc.py,會(huì)發(fā)現(xiàn)數(shù)據(jù)獲取成功

          八、最終代碼

          1. liantong.js,代碼太多只貼補(bǔ)環(huán)境的那塊兒
          delete __dirname
          delete __filename
          
          
          var getEnv=require('./jsProxy')
          
          //補(bǔ)window環(huán)境
          window=global
          window.top=window
          window.addEventListener=function (event) {
              console.log('window中的addEventListener接受的值:', event)
          }
          
          //補(bǔ)document
          div={
              getElementsByTagName: function (res) {
                  console.log('div中的getElementsByTagName接受的值:', res)
                  if (res=='i') {
                      return {length: 0}
                  }
              }
          }
          
          meta={
              0: {},
              1: {
                  // content: '{qqiWR9xjADLqtZr.GKDUqs39vLCd6fuDojxTsXPqq|[MOVUqGS9kDwYAY2MHmG8qqenYagvFTYnqaVRkcNykUE2QpL1UOm3DmV.UaxMHf24DULSwPQ.o1WoFaQ0osgoFcNzHGWFl1x7iueMEnWPYsGUinpbxrEUmkAWiA36crg6r1VwErNIEG9BVaVFkaqEkf9kra7lrS9tYs3eEPaaxSeIEA9HkkfRiYYWHS7gkPZdkrEPtnQwYs3.eahnr50RXqCjtH09dcbnU7yq4AOBU4TRXVkvoMVtL1OLxi7NNT4YAHqEZm5GKFxqZfCPrWTwLGBbkWL54mK.oiLLSmOEEieM2f_8iwg4amB1DX0kaTVQrgEnzs8CJMW67uDuJ.35XOKaH.0ac80{AVhRPOD1oF7LTncUsEzy56uo8iJ7aOK.T3d7d7kbbH.qS7sbNHjwPZbUgFjASBsb.WM9dBo_PH_LpL1cfl4096k162hsQioxBGHtAihVlwBPeCtEe8.qfQg.wHVg9MepzcbGPT1sAl.orvE_e5EwA2MzQ9Wbt9r1r0r4q!x7z,aac,amr,asm,avi,bak,bat,bmp,bin,c,cab,css,csv,com,cpp,dat,dll,doc,dot,docx,exe,eot,fla,flc,fon,fot,font,gdb,gif,gz,gho,hlp,hpp,htc,ico,ini,inf,ins,iso,js,jar,jpg,jpeg,json,java,lib,log,mid,mp4,mpa,m4a,mp3,mpg,mkv,mod,mov,mim,mpp,msi,mpeg,obj,ocx,ogg,olb,ole,otf,py,pyc,pas,pgm,ppm,pps,ppt,pdf,pptx,png,pic,pli,psd,qif,qtx,ra,rm,ram,rmvb,reg,res,rtf,rar,so,sbl,sfx,swa,swf,svg,sys,tar,taz,tif,tiff,torrent,txt,ttf,vsd,vss,vsw,vxd,woff,woff2,wmv,wma,wav,wps,xbm,xpm,xls,xlsx,xsl,xml,z,zip,apk,plist,ipaqqqqqqqqqqqqqqkRxA1WYW8i2ZaYc0IH9V_UAlwSf3|gYBRPSpKnWLGmzpn1RFgTvfn.WMN2nKrBqVWPwqrME6aBAcYAxK7XifNgJ9qoIDrOhYVmscevR1Qa3rJyk2QrpCg4rYlO8OZfH6qvFCY8H209hArJH6q1VnpSrlaPkAxixrTXpaEYh2ZXAfJ4JoABM1TUmKV0p1w6lTaAFbYgEArBRbVr393oFOmsRvqi8DwDEYpOFkzaRuL9ECQFHfAFhcyeEqLuhcQr3al2qpe5oO7YraggcozOmq06MaQaWcW5HOqD3aEPhnL4hrVNECWVlGqJ3C0IMkzUomlrq 0wR7HvJ6IsUC410DntKRngA;QyqA82EGtIB6ePNEeYo9NG;iEm6gdSTTpYiqU10OlvsnG;yMG8gk5okQ97gP4eb.IadA;T8F36FaS9AtR4sXBkRr0iG;RTlM3IYjAzboXbIiNSIFRA;t7_svh3Kc3.VU9jOjAJgdq;.8D9Zx78FrKF.Zn4xbfmIG;IMhCM7gXESIqShs5TNMo9A;pvBPF7OtrK6trS5vZYizwa;9qxqLXuEeDQeAlNfAL_l.A;VNeyFcNDtQZhV2sfCxyHqA;kT4JL2WRSOhvUIEcOjSrva;LpFhLGWYI8eFx_X999MLEq;NqssQaVItFB0TevtNxJrkG;AI3RN3R7lP0BBnYsoCO5KG;xrYRhwM6FYW7zCsPL.iecq;0kOXzZzt1eXLrlPo.QQ4xG;ApKNqLIRoybF5rIxSnabBG;hfgZrtz_KscdFC6a3f1wKA;Ddfe167m26649h_g.S8UKVgXBt1074790432r0YQLJiVGhVajrMQpjFqUZuNqV80Tt89zds6ycR9fGsCNkl3650r0q}!DBEbb61kMgq_GKiDIZLg9oiwINe0CsjYI7qgLVKAwKS03oewpcl4FvNLIO7y1Tff8kgLIo2mtKfXR6JJw6Y_YTwPJKJxRTp2FUNdsvSGFU2gYvm7YUlP16wcwTJjWYNC36rssnfssmwnM0eVKbYnVvZFwTxcov2N1Dx0MKEKUCfl1YLAi0Y_KDyAxfA7VnfnQ9fZKcfIsvwaIDWDEvy5tmVaiUaqqqqqqqqqqqqqq',
                  content:'meta_content',
                  parentNode: {
                      removeChild: function (tag) {
                          console.log('meta中的removeChild接受的值:', tag)
                      }
                  }
              },
              length: 2
          }
          
          script={
              0: {
                  getAttribute: function (attr) {
                      if (attr=='r') {
                          return 'm'
                      } else {
                          console.log('script-0中的getAttribute接受的值:', attr)
                      }
                  },
                  parentElement: {
                      removeChild: function (tag) {
                          console.log('script-0中的removeChild接受的值:', tag)
                      }
                  }
              },
              1: {
                  getAttribute: function (attr) {
                      if (attr=='r') {
                          return 'm'
                      } else {
                          console.log('script-1中的getAttribute接受的值:', attr)
                      }
                  },
                  parentElement: {
                      removeChild: function (tag) {
                          console.log('script-1中的removeChild接受的值:', tag)
                      }
                  }
              },
              length: 2
          }
          
          document={
              createElement: function (tag) {
                  if (tag=='div') {
                      return div
                  } else {
                      console.log('document中的createElement接受的值:', tag)
                      return {}
                  }
              },
              getElementsByTagName: function (tag) {
                  if (tag=='meta') {
                      return meta
                  } else if (tag=='script') {
                      return script
                  } else {
                      console.log('document中的etElementsByTagName接受的值:', tag)
                      return {}
                  }
              },
              addEventListener: function (event) {
                  console.log('addEventListener中的addEventListener接受的值:', event)
              }
          }
          
          //補(bǔ)location
          location={
              "href": "http://www.fangdi.com.cn/index.html",
              "origin": "http://www.fangdi.com.cn",
              "protocol": "http:",
              "host": "www.fangdi.com.cn",
              "hostname": "www.fangdi.com.cn",
              "pathname": "/index.html",
          }
          
          
          proxy_array=['window', 'document', 'location', 'navigator', 'history', 'screen', 'target']
          getEnv(proxy_array)
          
          setTimeout=function () {}
          setInterval=function () {}
          1. liantong.py

          eb前端技術(shù)由html、CSS和JavaScript三大部分構(gòu)成,是一個(gè)龐大而復(fù)雜的技術(shù)體系,其復(fù)雜程度不低于任何一門后端語言。而我們?cè)趯W(xué)習(xí)它的時(shí)候往往是先從某一個(gè)點(diǎn)切入,然后不斷地接觸和學(xué)習(xí)新的知識(shí)點(diǎn),因此對(duì)于初學(xué)者很難理清楚整個(gè)體系的脈絡(luò)結(jié)構(gòu)。本文將對(duì)Web前端知識(shí)體系進(jìn)行簡單的梳理,對(duì)應(yīng)的每個(gè)知識(shí)點(diǎn)點(diǎn)到為止,不作詳細(xì)介紹。目的是幫助大家審查自己的知識(shí)結(jié)構(gòu)是否完善,如有遺漏或不正確的地方,希望共勉。


          JAVASCRIPT 篇

          0、基礎(chǔ)語法

          Javascript基礎(chǔ)語法包括:變量定義、數(shù)據(jù)類型、循環(huán)、選擇、內(nèi)置對(duì)象等。

          數(shù)據(jù)類型有string,number,boolean,null,undefined,object等。其中,string,number和boolean是基礎(chǔ)類型,null和undefined是JS中的兩個(gè)特殊類型,object是引用類型。

          Javascript可以通過typeof來判斷基礎(chǔ)數(shù)據(jù)類型,但不能夠準(zhǔn)確判斷引用類型, 因此需要用到另外一個(gè)方法,那就是Object的toString,關(guān)于數(shù)據(jù)類型及其判斷可以參考以下博客:數(shù)據(jù)類型詳解 和 判斷JS數(shù)據(jù)類型的四種方法

          JS常用的內(nèi)置對(duì)象有Date、Array、JSON,RegExp等。 一般來講,Date和Array用的最頻繁,JSON可以對(duì)對(duì)象和數(shù)組進(jìn)行序列化和反序列化,還有一個(gè)作用就是實(shí)現(xiàn)對(duì)象的深拷貝。

          RegExp即正則表達(dá)式,是處理字符串的利器。 關(guān)于數(shù)據(jù)類型和正則表達(dá)式的介紹可以參考博客:ES5對(duì)數(shù)組增強(qiáng)的9個(gè)API 和 JS正則表達(dá)式精簡

          1、函數(shù)原型鏈

          Javascript雖然沒有繼承概念,但Javascript在函數(shù)Function對(duì)象中建立了原型對(duì)象prototype,并以Function對(duì)象為主線,從上至下,在內(nèi)部構(gòu)建了一條原型鏈。

          簡單來說就是建立了變量查找機(jī)制,當(dāng)訪問一個(gè)對(duì)象的屬性時(shí),先查找對(duì)象本身是否存在,如果不存在就去該對(duì)象所在的原型連上去找,直到Object對(duì)象為止,如果都沒有找到該屬性才會(huì)返回undefined。

          因此我們經(jīng)常會(huì)利用函數(shù)的原型機(jī)制來實(shí)現(xiàn)JS繼承。關(guān)于函數(shù)原型鏈可參考博客:JS原型對(duì)象和原型鏈

          2、函數(shù)作用域

          函數(shù)作用域就是變量在聲明它們的函數(shù)體以及這個(gè)函數(shù)體嵌套的任意函數(shù)體內(nèi)都是有定義的。在JS中沒有會(huì)塊級(jí)作用域,只有函數(shù)作用域,因此JS中還存在著另外一種怪異現(xiàn)象,那就是變量提升。關(guān)于作用域的介紹請(qǐng)參考博客:函數(shù)的作用域和作用域鏈

          3、函數(shù)指針 this

          this 存在于函數(shù)中,它指向的是該函數(shù)在運(yùn)行時(shí)被調(diào)用的那個(gè)對(duì)象。在實(shí)際項(xiàng)目中,遇到this的坑比較多,因此需要對(duì)this作深入的理解。

          Function對(duì)象還提供了call、apply和bind等方法來改變函數(shù)的this指向,其中call和apply主動(dòng)執(zhí)行函數(shù),bind一般在事件回調(diào)中使用,而call和apply的區(qū)別只是參數(shù)的傳

          遞方式不同。關(guān)于call,apply和bind的用戶請(qǐng)參考博客:詳解JS的call,apply和bind

          4、構(gòu)造函數(shù) new

          JS中的函數(shù)即可以是構(gòu)造函數(shù)又可以當(dāng)作普通函數(shù)來調(diào)用,當(dāng)使用new來創(chuàng)建對(duì)象時(shí),對(duì)應(yīng)的函數(shù)就是構(gòu)造函數(shù),通過對(duì)象來調(diào)用時(shí)就是普通函數(shù)。

          普通函數(shù)的創(chuàng)建有:顯式聲明、匿名定義、new Function() 等三種方式。

          當(dāng)通過new來創(chuàng)建一個(gè)新對(duì)象時(shí),JS底層將新對(duì)象的原型鏈指向了構(gòu)造函數(shù)的原型對(duì)象,于是就在新對(duì)象和函數(shù)對(duì)象之間建立了一條原型鏈,通過新對(duì)象可以訪問到函數(shù)對(duì)象原型prototype中的方法和屬性。new的詳細(xì)介紹請(qǐng)參考博客:理解JS中的new運(yùn)算符

          5、閉包

          閉包其實(shí)是一個(gè)主動(dòng)執(zhí)行的代碼塊,這個(gè)代碼塊的特殊之處是可以永久保存局部變量,但又不污染全局變量,可以形成一個(gè)獨(dú)立的執(zhí)行過程,因此我們經(jīng)常用閉包來定義組件。關(guān)于閉包的介紹請(qǐng)參考:干貨分享:讓你分分鐘學(xué)會(huì)JS閉包

          6、單線程和異步隊(duì)列

          setTimeout和setInterval是JS內(nèi)置的兩個(gè)定時(shí)器,使用很簡單,但這兩個(gè)方法背后的原理卻不簡單。

          我們知道,JS是單線程語言,在瀏覽器中,當(dāng)JS代碼被加載時(shí),瀏覽器會(huì)為其分配一個(gè)主線程來執(zhí)行任務(wù)(函數(shù)),主線程會(huì)形成一個(gè)全局執(zhí)行環(huán)境,執(zhí)行環(huán)境采用棧的方式將待執(zhí)行任務(wù)按順序依次來執(zhí)行。

          但在瀏覽器中有一些任務(wù)是非常耗時(shí)的,比如http請(qǐng)求、定時(shí)器、事件回調(diào)等,為了保證其他任務(wù)的執(zhí)行效率不被影響,JS在執(zhí)行環(huán)境中維護(hù)了一個(gè)異步隊(duì)列(也叫工作線程),并將這些任務(wù)放入隊(duì)列中進(jìn)行等待,這些任務(wù)的執(zhí)行時(shí)機(jī)并不確定,只有當(dāng)主線程的任務(wù)執(zhí)行完成以后,才會(huì)去檢查異步隊(duì)列中的任務(wù)是否需要開始執(zhí)行。這就是為什么setTimeout(fn,0) 始終要等到最后執(zhí)行的原因。關(guān)于單線程和異步隊(duì)列問題請(qǐng)參考:setTimeout(0)

          7、異步通訊 Ajax技術(shù)

          Ajax是瀏覽器專門用來和服務(wù)器進(jìn)行交互的異步通訊技術(shù),其核心對(duì)象是XMLHttpRequest,通過該對(duì)象可以創(chuàng)建一個(gè)Ajax請(qǐng)求。為了防止XSS攻擊,瀏覽器對(duì)Ajax做了限制,不允許Ajax跨域請(qǐng)求服務(wù)器,就是只能訪問當(dāng)前域名下的url。

          當(dāng)然,如果確信你的站點(diǎn)不存在跨域的風(fēng)險(xiǎn),可以在服務(wù)端主動(dòng)開啟跨域請(qǐng)求。 也可以直接通過CORS或JSONP來實(shí)現(xiàn)。

          JSONP是利用腳本(script)跨域能力來模擬Ajax請(qǐng)求。

          CORS是一個(gè)W3C標(biāo)準(zhǔn),全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源服務(wù)器,發(fā)出XMLHttpRequest請(qǐng)求,從而克服了AJAX只能同源使用的限制。 關(guān)于CORS的介紹請(qǐng)參考:跨域資源共享 CORS 詳解

          8、DOM對(duì)象 document

          document對(duì)象里保存著整個(gè)web頁面dom結(jié)構(gòu),在頁面上所有的元素最終都會(huì)映射為一個(gè)dom對(duì)象。 document也提供了很多api來查找特定的dom對(duì)象,比如getElementById,querySelector等等。

          9、事件系統(tǒng) Event

          事件是用戶與頁面交互的基礎(chǔ),到目前為止,DOM事件從PC端的 鼠標(biāo)事件(mouse) 發(fā)展到移動(dòng)端的 觸摸事件(touch) 和 手勢(shì)事件(guesture)

          由于DOM結(jié)構(gòu)可能會(huì)多層嵌套,因此也衍生出了兩種事件流:事件捕獲和事件冒泡,后者最常用。利用事件冒泡機(jī)制可以實(shí)現(xiàn)很多功能,比如頁面點(diǎn)擊統(tǒng)計(jì)。關(guān)于兩種事件流的介紹請(qǐng)參考:事件冒泡和捕獲

          除此之外,在頁面初始化、滾動(dòng)、隱藏、返回等操作時(shí)分別內(nèi)置了onload/onDOMContentLoaded、onscroll、onvisibility和onhashchange等事件,如果想要捕獲這些事件,需要通過addEventLisener/attachEvent來進(jìn)行綁定。

          10、全局對(duì)象 window

          在JS中,當(dāng)一段JS代碼在瀏覽器中被加載執(zhí)行,JS引擎會(huì)在內(nèi)存中構(gòu)建一個(gè)全局執(zhí)行環(huán)境,執(zhí)行環(huán)境的作用是保證所有的函數(shù)能按照正確的順序被執(zhí)行,而window對(duì)象則是這個(gè)執(zhí)行環(huán)境中的一個(gè)全局對(duì)象,window對(duì)象中內(nèi)置了很多操作api和對(duì)象,document對(duì)象就是其中一個(gè)。關(guān)于JS執(zhí)行環(huán)境的介紹請(qǐng)參考博客:深入理解JS執(zhí)行細(xì)節(jié)

          CSS 篇

          css是用來對(duì)html進(jìn)行修飾的一門語言。

          1、選擇器

          css的選擇器有很多種,常用的有類選擇器、標(biāo)簽選擇器、ID選擇器、后代選擇器、群組選擇器、偽類選擇器(before/after)、兄弟選擇器(+~)、屬性選擇器等等。

          2、定位 position

          定位一般有相對(duì)定位(relative)、絕對(duì)定位(absolute)、固定定位(fixed),relative和absolute在移動(dòng)端用的最多,fixed 在移動(dòng)端有兼容性問題,因此不推薦使用,在移動(dòng)端替代fixed的方案是 absolute+內(nèi)部滾動(dòng)。

          3、浮動(dòng) float

          設(shè)置float為left或right,就能使該元素脫離文檔流,向左或向右浮動(dòng)。一般在做宮格模式布局時(shí)會(huì)用到,如果子元素全部設(shè)置為浮動(dòng),則父元素是塌陷的,這時(shí)就需要清除浮動(dòng),清除浮動(dòng)的方法也很多,常用的方法是在元素末尾加空元素設(shè)置clear:both, 更高級(jí)一點(diǎn)的就給父容器設(shè)置before/after來模擬一個(gè)空元素,還可以直接設(shè)置overflow:auto/hidden。除過浮動(dòng)可以實(shí)現(xiàn)宮格模式,行內(nèi)盒子(inline-block)和table也可以。

          4、盒子模型 Box

          盒子模型是css最重要的一個(gè)概念,也是css布局的基石。 常見的盒子模型有塊級(jí)盒子(block)和行內(nèi)盒子(inline-block),盒子最關(guān)鍵的幾個(gè)屬性包括margin、border、padding和content,這幾個(gè)元素可以設(shè)置盒子和盒子之間的關(guān)系以及盒子和內(nèi)容之間的關(guān)系。還有一個(gè)問題是計(jì)算盒子的大小,需要注意的是,box-sizing屬性的設(shè)置會(huì)影響盒子的width和height。只有普通文檔流中塊框的垂直外邊距才會(huì)發(fā)生外邊距合并。行內(nèi)框、浮動(dòng)框或絕對(duì)定位之間的外邊距不會(huì)合并。

          5、彈性布局 Flex

          Flex布局的容器是一個(gè)伸縮容器,首先容器本身會(huì)更具容器中的元素動(dòng)態(tài)設(shè)置自身大小;然后當(dāng)Flex容器被應(yīng)用一個(gè)大小時(shí)(width和height),將會(huì)自動(dòng)調(diào)整容器中的元素適應(yīng)新大小。Flex容器也可以設(shè)置伸縮比例和固定寬度,還可以設(shè)置容器中元素的排列方向(橫向和縱向)和是否支持元素的自動(dòng)換行。有了這個(gè)神器,做頁面布局的可以方便很多了。注意,設(shè)為Flex布局以后,子元素的float、clear和vertical-align屬性將失效。

          6、過渡 Transition 、旋轉(zhuǎn) Transform

          應(yīng)用transform可以對(duì)元素進(jìn)行平移(translate)、旋轉(zhuǎn)(rotate)、放大縮小(scale)、傾斜(skew)等處理,而transition使css屬性值(包括transform)在一段時(shí)間內(nèi)平滑的過渡。使用transition和transform就可以實(shí)現(xiàn)頁面的滑動(dòng)切換效果。

          7、動(dòng)畫 Animation

          Animation首先需要設(shè)置一個(gè)動(dòng)畫函數(shù),然后以這個(gè)動(dòng)畫的方式來改變?cè)氐腸ss屬性之的變化,動(dòng)畫可以被設(shè)置為永久循環(huán)演示。 和transition相比,animation設(shè)置動(dòng)畫效果更靈活更豐富,二者還有一個(gè)區(qū)別是:transition只能通過主動(dòng)改變?cè)氐腸ss值才能觸發(fā)動(dòng)畫效果,而animation一旦被應(yīng)用,就開始執(zhí)行動(dòng)畫。

          8、雪碧圖 sprite

          對(duì)于大型站點(diǎn),為了減少http請(qǐng)求的次數(shù),一般會(huì)將常用的小圖標(biāo)排到一個(gè)大圖中,頁面加載時(shí)只需請(qǐng)求一次網(wǎng)絡(luò), 然后在css中通過設(shè)置background-position來控制顯示所需要的小圖標(biāo)。

          9、字體圖標(biāo) iconfont

          所謂字體圖標(biāo)就是將常用的圖標(biāo)轉(zhuǎn)化為字體資源存在文件中,通過在CSS中引用該字體文件,然后可以直接通過控制字體的css屬性來設(shè)置圖標(biāo)的樣式,字體圖標(biāo)的好處是其不受屏幕分辨率的影響,并且可以任意修改圖標(biāo)的顏色。

          HTML 篇

          1、Web語義化 和 SEO

          html 常規(guī)標(biāo)簽有html,head,body,div,span,table,ul,ol,dl,p,b,h1~h6,strong,form,input,img,em,i 等等,另外html5 還新增了很多語義化的標(biāo)簽,比如

          header,acticle,aside,section,footer,audio,radio 等等。

          Web語義化是指使用語義恰當(dāng)?shù)臉?biāo)簽,使頁面有良好的結(jié)構(gòu),頁面元素有含義,能夠讓人和搜索引擎都容易理解。

          SEO是指在了解搜索引擎自然排名機(jī)制的基礎(chǔ)之上,對(duì)網(wǎng)站進(jìn)行內(nèi)部及外部的調(diào)整優(yōu)化,改進(jìn)網(wǎng)站在搜索引擎中關(guān)鍵詞的自然排名,獲得更多的展現(xiàn)量,吸引更多目標(biāo)客戶點(diǎn)擊訪問網(wǎng)站,從而達(dá)到互聯(lián)網(wǎng)營銷及品牌建設(shè)的目標(biāo)。

          搜索引擎通過爬蟲技術(shù)獲取的頁面就是由一堆html標(biāo)簽組成的代碼,,人可以通過可視化的方式來判斷頁面上哪些內(nèi)容是重點(diǎn),而機(jī)器做不到。 但搜索引擎會(huì)根據(jù)標(biāo)簽的含義來判斷內(nèi)容的權(quán)重,因此,在合適的位置使用恰當(dāng)?shù)臉?biāo)簽,使整個(gè)頁面的語義明確,結(jié)構(gòu)清晰,搜索引擎才能正確識(shí)別頁面中的重要內(nèi)容,并予以較高的權(quán)值。比如h1~h6這幾個(gè)標(biāo)簽在SEO中的權(quán)值非常高,用它們作頁面的標(biāo)題就是一個(gè)簡單的SEO優(yōu)化。

          2、頁面渲染機(jī)制

          頁面渲染就是瀏覽器的渲染引擎將html代碼根據(jù)CSS定義的規(guī)則顯示在瀏覽器窗口中的過程。大致工作原理如下:

          • 用戶輸入網(wǎng)址,瀏覽器向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器返回html文件;
          • 渲染引擎開始載入html代碼,并將HTML中的標(biāo)簽轉(zhuǎn)化為DOM節(jié)點(diǎn),生成DOM樹;
          • 如果<head>中引用了外部css文件,則發(fā)出css文件請(qǐng)求,服務(wù)器返回該文件;
          • 如果<head>中引用了外部js文件,則發(fā)出js文件請(qǐng)求,服務(wù)器返回該文件后開始運(yùn)行;
          • 渲染引擎繼續(xù)載入html中的<body>部分的代碼,并開始解析前面返回的css文件,然后根據(jù)css選擇器計(jì)算出節(jié)點(diǎn)的樣式,創(chuàng)建渲染樹;
          • 從根節(jié)點(diǎn)遞歸調(diào)用,計(jì)算每一個(gè)元素的大小、位置等,給每個(gè)節(jié)點(diǎn)所應(yīng)該出現(xiàn)在屏幕上的精確坐標(biāo);
          • 如果body中的<img>引用了圖片資源,則立即向服務(wù)器發(fā)出請(qǐng)求,此時(shí)渲染引擎不會(huì)等待圖片下載完畢,而是繼續(xù)渲染后面的代碼;
          • 服務(wù)器返回圖片文件,由于圖片占用了一定面積,影響了后面段落的排版,因此引擎需要回過頭來重新渲染這部分代碼;
          • 如果此時(shí)js腳本中運(yùn)行了style.display="none", 布局被改變,引擎也需要重新渲染這部分代碼;
          • 直到</html>為止,頁面渲染完畢。


          3、重繪和回流

          當(dāng)渲染樹中的一部分(或全部)因?yàn)樵氐囊?guī)模尺寸,布局,隱藏等改變而需要重新構(gòu)建。這就稱為回流。比如上面的img文件加載完成后就會(huì)引起回流,每個(gè)頁面至少需要一次回流,就是在頁面第一次加載的時(shí)候。

          當(dāng)渲染樹中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會(huì)影響布局的,比如background-color。則就叫稱為重繪。

          從上面可以看出,回流必將引起重繪,而重繪不一定會(huì)引起回流。

          會(huì)引起重繪和回流的操作

          • 添加、刪除元素(回流+重繪)
          • 隱藏元素,display:none(回流+重繪),visibility:hidden(只重繪,不回流)
          • 移動(dòng)元素,比如改變top,left,transform的值,或者移動(dòng)元素到另外一個(gè)父元素中。(重繪+回流)
          • 對(duì)style的操作(對(duì)不同的屬性操作,影響不一樣)
          • 還有一種是用戶的操作,比如改變?yōu)g覽器大小,改變?yōu)g覽器的字體大小等(回流+重繪)


          4、本地存儲(chǔ)

          本地存儲(chǔ)最原始的方式就是 cookie,cookie 是存放在本地瀏覽器的一段文本,數(shù)據(jù)以鍵值對(duì)的形式保存,可以設(shè)置過期時(shí)間。 但是 cookie 不適合大量數(shù)據(jù)的存儲(chǔ),因?yàn)槊空?qǐng)求一次頁面,cookie 都會(huì)發(fā)送給服務(wù)器,這使得 cookie 速度很慢而且效率也不高。因此cookie的大小被限制為4k左右(不同瀏覽器可能不同,分HOST),如下所示:

          • Firefox和Safari允許cookie多達(dá)4097個(gè)字節(jié),包括名(name)、值(value)和等號(hào)。
          • Opera允許cookie多達(dá)4096個(gè)字節(jié),包括:名(name)、值(value)和等號(hào)。
          • Internet Explorer允許cookie多達(dá)4095個(gè)字節(jié),包括:名(name)、值(value)和等號(hào)。


          在所有瀏覽器中,任何cookie大小超過限制都被忽略,且永遠(yuǎn)不會(huì)被設(shè)置。

          html5提供了兩種在客戶端存儲(chǔ)數(shù)據(jù)的新方法:localStorage 和 sessionStorage, 它們都是以key/value 的形式來存儲(chǔ)數(shù)據(jù),前者是永久存儲(chǔ),后者的存儲(chǔ)期限僅限于瀏覽器會(huì)話(session),即當(dāng)瀏覽器窗口關(guān)閉后,sessionStorage中的數(shù)據(jù)被清除。

          localStorage的存儲(chǔ)空間大約5M左右(不同瀏覽器可能不同,分 HOST),這個(gè)相當(dāng)于一個(gè)5M大小的前端頁面的數(shù)據(jù)庫,相比于cookie可以節(jié)約帶寬,但localStorage在瀏覽器隱私模式下是不可讀取的,當(dāng)存儲(chǔ)數(shù)據(jù)超過了localStorage的存儲(chǔ)空間后會(huì)拋出異常。

          此外,H5還提供了逆天的websql和indexedDB,允許前端以關(guān)系型數(shù)據(jù)庫的方式來存儲(chǔ)本地?cái)?shù)據(jù),相對(duì)來說,這個(gè)功能目前應(yīng)用的場(chǎng)景比較少,此處不作介紹。

          5、瀏覽器緩存機(jī)制

          瀏覽器緩存機(jī)制是指通過 HTTP 協(xié)議頭里的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段來控制文件緩存的機(jī)制。

          Cache-Control 用于控制文件在本地緩存有效時(shí)長。最常見的,比如服務(wù)器回包:Cache-Control:max-age=600 表示文件在本地應(yīng)該緩存,且有效時(shí)長是600秒(從發(fā)出請(qǐng)求算起)。在接下來600秒內(nèi),如果有請(qǐng)求這個(gè)資源,瀏覽器不會(huì)發(fā)出 HTTP 請(qǐng)求,而是直接使用本地緩存的文件。

          Last-Modified 是標(biāo)識(shí)文件在服務(wù)器上的最新更新時(shí)間。下次請(qǐng)求時(shí),如果文件緩存過期,瀏覽器通過 If-Modified-Since 字段帶上這個(gè)時(shí)間,發(fā)送給服務(wù)器,由服務(wù)器比較時(shí)間戳來判斷文件是否有修改。如果沒有修改,服務(wù)器返回304告訴瀏覽器繼續(xù)使用緩存;如果有修改,則返回200,同時(shí)返回最新的文件。

          Cache-Control 通常與 Last-Modified 一起使用。一個(gè)用于控制緩存有效時(shí)間,一個(gè)在緩存失效后,向服務(wù)查詢是否有更新。

          Cache-Control 還有一個(gè)同功能的字段:Expires。Expires 的值一個(gè)絕對(duì)的時(shí)間點(diǎn),如:Expires: Thu, 10 Nov 2015 08:45:11 GMT,表示在這個(gè)時(shí)間點(diǎn)之前,緩存都是有效的。

          Expires 是 HTTP1.0 標(biāo)準(zhǔn)中的字段,Cache-Control 是 HTTP1.1 標(biāo)準(zhǔn)中新加的字段,功能一樣,都是控制緩存的有效時(shí)間。當(dāng)這兩個(gè)字段同時(shí)出現(xiàn)時(shí),Cache-Control 是高優(yōu)化級(jí)的。

          Etag 也是和 Last-Modified 一樣,對(duì)文件進(jìn)行標(biāo)識(shí)的字段。不同的是,Etag 的取值是一個(gè)對(duì)文件進(jìn)行標(biāo)識(shí)的特征字串。在向服務(wù)器查詢文件是否有更新時(shí),瀏覽器通過 If-None-Match 字段把特征字串發(fā)送給服務(wù)器,由服務(wù)器和文件最新特征字串進(jìn)行匹配,來判斷文件是否有更新。沒有更新回包304,有更新回包200。Etag 和 Last-Modified 可根據(jù)需求使用一個(gè)或兩個(gè)同時(shí)使用。兩個(gè)同時(shí)使用時(shí),只要滿足基中一個(gè)條件,就認(rèn)為文件沒有更新。

          另外有兩種特殊的情況:

          • 手動(dòng)刷新頁面(F5),瀏覽器會(huì)直接認(rèn)為緩存已經(jīng)過期(可能緩存還沒有過期),在請(qǐng)求中加上字段:Cache-Control:max-age=0,發(fā)包向服務(wù)器查詢是否有文件是否有更新。
          • 強(qiáng)制刷新頁面(Ctrl+F5),瀏覽器會(huì)直接忽略本地的緩存(有緩存也會(huì)認(rèn)為本地沒有緩存),在請(qǐng)求中加上字段:Cache-Control:no-cache(或 Pragma:no-cache),發(fā)包向服務(wù)重新拉取文件。


          6、History操作

          用戶訪問網(wǎng)頁的歷史記錄通常會(huì)被保存在一個(gè)類似于棧的對(duì)象中,即history對(duì)象,點(diǎn)擊返回就出棧,跳下一頁就入棧。 它提供了以下方法來操作頁面的前進(jìn)和后退:

          • window.history.back() 返回到上一個(gè)頁面
          • window.history.forward() 進(jìn)入到下一個(gè)頁面
          • window.history.go([delta]) 跳轉(zhuǎn)到指定頁面


          HTML5 對(duì)History Api 進(jìn)行了增強(qiáng),新增了兩個(gè)Api和一個(gè)事件,分別是pushState、replaceState 和 onpopstate

          pushState是往history對(duì)象里添加一個(gè)新的歷史記錄,即壓棧。

          replaceState 是替換history對(duì)象中的當(dāng)前歷史記錄。

          當(dāng)點(diǎn)擊瀏覽器后退按鈕或 js調(diào)用history.back都會(huì)觸發(fā)onpopstate事件。

          與其類似的還有一個(gè)事件: onhashchange,onhashchange是老API, 瀏覽器支持度高, 本來是用來監(jiān)聽hash變化的, 但可以被利用來做客戶端前進(jìn)和后退事件的監(jiān)聽,而onpopstate是專門用來監(jiān)聽瀏覽器前進(jìn)后退的, 不僅可以支持hash, 非hash的同源url也支持。

          7、HTML5離線緩存

          HTML5離線緩存又叫Application Cache,是從瀏覽器的緩存中分出來的一塊緩存區(qū),如果要在這個(gè)緩存中保存數(shù)據(jù),可以使用一個(gè)描述文件(manifest file),列出要下載和緩存的資源。

          manifest 文件是簡單的文本文件,它告知瀏覽器被緩存的內(nèi)容(以及不緩存的內(nèi)容)。manifest 文件可分為三個(gè)部分:

          - CACHE MANIFEST - 在此標(biāo)題下列出的文件將在首次下載后進(jìn)行緩存

          - NETWORK - 在此標(biāo)題下列出的文件需要與服務(wù)器的連接,且不會(huì)被緩存

          - FALLBACK - 在此標(biāo)題下列出的文件規(guī)定當(dāng)頁面無法訪問時(shí)的回退頁面(比如 404 頁面)

          離線緩存為應(yīng)用帶來三個(gè)優(yōu)勢(shì):

          離線瀏覽 - 用戶可在應(yīng)用離線時(shí)使用它們

          速度 - 已緩存資源加載得更快

          減少服務(wù)器負(fù)載 - 瀏覽器將只從服務(wù)器下載更新過或更改過的資源。

          8、Canvas 和 SVG

          Canvas 通過Javascript 來繪制 2D 圖形。Canvas 是逐像素進(jìn)行渲染的。在 Canvas 中,一旦圖形被繪制完成,它就不會(huì)繼續(xù)得到瀏覽器的關(guān)注。如果其位置發(fā)生變化,那么整個(gè)場(chǎng)景也需要重新繪制,包括任何或許已被圖形覆蓋的對(duì)象。

          SVG 是一種使用 XML 描述 2D 圖形的語言。SVG 基于 XML,這意味著 SVG DOM 中的每個(gè)元素都是可用的。你可以為某個(gè)元素附加 JavaScript 事件處理器。在 SVG 中,每個(gè)被繪制的圖形均被視為對(duì)象。如果 SVG 對(duì)象的屬性發(fā)生變化,那么瀏覽器能夠自動(dòng)重現(xiàn)圖形。

          Canvas和SVG相比,canvas更依賴于分辨率,不支持事件處理器,文本渲染能力弱,比較適合密集型游戲,其中的許多對(duì)象會(huì)被頻繁繪制,而svg則比較適用于類似谷歌地圖帶有大型渲染區(qū)域的應(yīng)用程序。


          主站蜘蛛池模板: 亚洲一区二区三区91| 一区二区三区视频免费观看| 亚洲一区二区久久| 久久精品免费一区二区三区| 日本一区二区在线| 亚洲一区二区三区无码中文字幕| 国产精品一区二区在线观看| 国产福利精品一区二区| 国产美女视频一区| 免费观看一区二区三区| 在线精品国产一区二区三区 | 无码精品久久一区二区三区| 无码人妻精品一区二区在线视频| 天堂Aⅴ无码一区二区三区| 亚洲无码一区二区三区| 国产乱码精品一区二区三区中| 久久精品国产第一区二区三区| 亚洲视频一区二区三区四区| 日韩电影一区二区三区| 中文字幕无码一区二区三区本日| 精品国产区一区二区三区在线观看| 波多野结衣电影区一区二区三区 | 日本内射精品一区二区视频| 国产精品无码一区二区在线观一 | 视频精品一区二区三区| 中文无码AV一区二区三区| 国产在线一区二区综合免费视频| 日本一区二区三区在线视频| 午夜视频一区二区三区| 亚洲综合av一区二区三区| 国产精品一区二区久久精品| 国产福利微拍精品一区二区| 97精品一区二区视频在线观看| 老熟女高潮一区二区三区| 亚洲国产精品一区| 国产精品第一区揄拍| 海角国精产品一区一区三区糖心 | 国产成人精品一区二三区在线观看 | 亚洲一区二区三区在线| 无码人妻精品一区二区在线视频| 免费无码VA一区二区三区|