1.自我介紹:除了基本我的信息之外,面試官更想聽的是你不同凡響的地方和你的優點。 2.項目介紹 3.如何看待前端開發? 4.平時是如何學習前端開發的? 5.將來三到五年的規劃是怎樣的?
absolute
:生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。javascript
fixed
(老IE不支持)生成絕對定位的元素,一般相對於瀏覽器窗口或 frame 進行定位。php
relative
生成相對定位的元素,相對於其在普通流中的位置進行定位。css
static
默認值。沒有定位,元素出如今正常的流中html
sticky
生成粘性定位的元素,容器的位置根據正常文檔流計算得出前端
JSONP:html5
原理是:動態插入script
標籤,經過script
標籤引入一個js
文件,這個js文件載入成功後會執行咱們在url參數中指定的函數,而且會把咱們須要的json
數據做爲參數傳入。java
因爲同源策略的限制,XmlHttpRequest
只容許請求當前源(域名、協議、端口)的資源,爲了實現跨域請求,能夠經過script
標籤實現跨域請求,而後在服務端輸出JSON數據並執行回調函數,從而解決了跨域的數據請求。node
優勢是兼容性好,簡單易用,支持瀏覽器與服務器雙向通訊。缺點是隻支持GET請求。mysql
JSONP
:json+padding
(內填充),顧名思義,就是把JSON填充到一個盒子裏jquery
CORS
服務器端對於CORS
的支持,主要就是經過設置Access-Control-Allow-Origin
來進行的。若是瀏覽器檢測到相應的設置,就能夠容許Ajax
進行跨域的訪問。
經過修改document.domain來跨子域
將子域和主域的document.domain
設爲同一個主域.前提條件:這兩個域名必須屬於同一個基礎域名!並且所用的協議,端口都要一致,不然沒法利用document.domain
進行跨域
主域相同的使用document.domain
使用window.name來進行跨域
window
對象有個name
屬性,該屬性有個特徵:即在一個窗口(window)的生命週期內,窗口載入的全部的頁面都是共享一個window.name
的,每一個頁面對window.name
都有讀寫的權限,window.name
是持久存在一個窗口載入過的全部頁面中的
使用HTML5中新引進的
window.postMessage
方法來跨域傳送數據
還有flash、在服務器上設置代理頁面等跨域方式。我的認爲window.name
的方法既不復雜,也能兼容到幾乎全部瀏覽器,這真是極好的一種跨域方法。
XML
和JSON
的區別? WebPack
是一個模塊打包工具,你能夠使用WebPack
管理你的模塊依賴,並編繹輸出模塊們所需的靜態文件。它可以很好地管理、打包Web開發中所用到的HTML、JavaScript、CSS
以及各類靜態文件(圖片、字體等),讓開發過程更加高效。對於不一樣類型的資源,webpack
有對應的模塊加載器。webpack
模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合併後的靜態資源。
webpack
的兩大特點:
1.code splitting(能夠自動完成) 2.loader 能夠處理各類類型的靜態文件,而且支持串聯操做
webpack
是以commonJS
的形式來書寫腳本滴,但對 AMD/CMD
的支持也很全面,方便舊項目進行代碼遷移。
webpack
具備requireJs
和browserify
的功能,但仍有不少本身的新特性:
爲了準確無誤地把數據送達目標處,TCP
協議採用了三次握手策略。用TCP協議把數據包送出去後,TCP
不會對傳送 後的狀況置之不理,它必定會向對方確認是否成功送達。握手過程當中使用了TCP的標誌:SYN
和ACK
。
發送端首先發送一個帶SYN
標誌的數據包給對方。接收端收到後,回傳一個帶有SYN/ACK
標誌的數據包以示傳達確認信息。
最後,發送端再回傳一個帶ACK
標誌的數據包,表明「握手」結束。
若在握手過程當中某個階段莫名中斷,TCP
協議會再次以相同的順序發送相同的數據包。
斷開一個TCP鏈接則須要「四次握手」:
第一次揮手:主動關閉方發送一個FIN
,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不 會再給你發數據了(固然,在fin包以前發送出去的數據,若是沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),可是,此時主動關閉方還可 以接受數據。
第二次揮手:被動關閉方收到FIN
包後,發送一個ACK
給對方,確認序號爲收到序號+1
(與SYN
相同,一個FIN
佔用一個序號)。
第三次揮手:被動關閉方發送一個FIN
,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,個人數據也發送完了,不會再給你發數據了。
第四次揮手:主動關閉方收到FIN
後,發送一個ACK
給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。
TCP
(Transmission Control Protocol,傳輸控制協議)是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個TCP
鏈接必需要通過三次「對話」才能創建起來
UDP
(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去!
UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境。
做用域鏈的做用是保證執行環境裏有權訪問的變量和函數是有序的,做用域鏈的變量只能向上訪問,變量訪問到window
對象即被終止,做用域鏈向下訪問變量是不被容許的。
漸進加強 :針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 :一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
sql注入原理
就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
總的來講有如下幾點:
XSS原理及防範
Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面裏插入惡意 html
標籤或者javascript
代碼。好比:攻擊者在論壇中放一個
看似安全的連接,騙取用戶點擊後,竊取cookie
中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,
當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶本來覺得的信任站點。
XSS防範方法
首先代碼裏對用戶輸入的地方和變量都須要仔細檢查長度和對」<」,」>」,」;」,」’」
等字符作過濾;其次任何內容寫到頁面以前都必須加以encode
,避免不當心把html tag
弄出來。這一個層面作好,至少能夠堵住超過一半的XSS
攻擊。
首先,避免直接在cookie
中泄露用戶隱私,例如email、密碼等等。
其次,經過使cookie
和系統ip
綁定來下降cookie
泄露後的危險。這樣攻擊者獲得的cookie
沒有實際價值,不可能拿來重放。
若是網站不須要再瀏覽器端對cookie
進行操做,能夠在Set-Cookie
末尾加上HttpOnly
來防止javascript
代碼直接獲取cookie
。
儘可能採用POST
而非GET
提交表單
XSS與CSRF有什麼區別嗎?
XSS
是獲取信息,不須要提早知道其餘用戶頁面的代碼和數據包。CSRF
是代替用戶完成指定的動做,須要知道其餘用戶頁面的代碼和數據包。
要完成一次CSRF
攻擊,受害者必須依次完成兩個步驟:
CSRF的防護
服務端的CSRF
方式方法不少樣,但總的思想都是一致的,就是在客戶端頁面增長僞隨機數。
經過驗證碼的方法
worker主線程:
WebSocket
是Web
應用程序的傳輸協議,它提供了雙向的,按序到達的數據流。他是一個Html5
協議,WebSocket
的鏈接是持久的,他經過在客戶端和服務器之間保持雙工鏈接,服務器的更新能夠被及時推送給客戶端,而不須要客戶端以必定時間間隔去輪詢。
HTTP
協議一般承載於TCP協議之上,在HTTP
和TCP
之間添加一個安全協議層(SSL
或TSL
),這個時候,就成了咱們常說的HTTPS。
默認HTTP的端口號爲80,HTTPS
的端口號爲443。
HTTPS
安全 由於網絡請求須要中間有不少的服務器路由器的轉發。中間的節點均可能篡改信息,而若是使用HTTPS
,密鑰在你和終點站纔有。https
之因此比http
安全,是由於他利用ssl/tls
協議傳輸。它包含證書,卸載,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等。保障了傳輸過程的安全性
AMD 是
RequireJS
在推廣過程當中對模塊定義的規範化產出。CMD 是
SeaJS
在推廣過程當中對模塊定義的規範化產出。
AMD
是提早執行,CMD
是延遲執行。
AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的屬性賦值來達到暴露模塊對象的目的。
CMD模塊方式
標記清除(mark and sweep)
這是JavaScript最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將其標記爲「進入環境」,當變量離開環境的時候(函數執行結束)將其標記爲「離開環境」。
垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,而後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成以後仍存在標記的就是要刪除的變量了
引用計數(reference counting)
在低版本IE中常常會出現內存泄露,不少時候就是由於其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每一個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,若是該變量的值變成了另一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值無法被訪問了,所以能夠將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。
在IE中雖然JavaScript
對象經過標記清除的方式進行垃圾回收,但BOM與DOM對象倒是經過引用計數回收垃圾的,
也就是說只要涉及BOM
及DOM就會出現循環引用問題。
爲簡化用戶使用提供技術支持(交互部分) 爲多個瀏覽器兼容性提供支持 爲提升用戶瀏覽速度(瀏覽器性能)提供支持 爲跨平臺或者其餘基於webkit或其餘渲染引擎的應用提供支持 爲展現數據提供支持(數據接口)
代碼層面:避免使用css表達式,避免使用高級選擇器,通配選擇器。
緩存利用:緩存Ajax,使用CDN,使用外部js和css文件以便緩存,添加Expires頭,服務端配置Etag,減小DNS查找等
請求數量:合併樣式和腳本,使用css圖片精靈,初始首屏以外的圖片資源按需加載,靜態資源延遲加載。
請求帶寬:壓縮文件,開啓GZIP,
代碼層面的優化
用hash-table
來優化查找
少用全局變量
用innerHTML
代替DOM
操做,減小DOM
操做次數,優化javascript
性能
用setTimeout
來避免頁面失去響應
緩存DOM節點查找的結果
避免使用CSS Expression
避免全局查詢
避免使用with(with會建立本身的做用域,會增長做用域鏈長度)
多個變量聲明合併
避免圖片和iFrame等的空Src。空Src會從新加載當前頁面,影響速度和效率
touch
事件代替click
事件。css3
漸變陰影效果。transform: translateZ(0)
來開啓硬件加速。相關閱讀:如何作到一秒渲染一個移動頁面
當發送一個服務器請求時,瀏覽器首先會進行緩存過時判斷。瀏覽器根據緩存過時時間判斷緩存文件是否過時。
情景一:若沒有過時,則不向服務器發送請求,直接使用緩存中的結果,此時咱們在瀏覽器控制檯中能夠看到 200 OK
(from cache) ,此時的狀況就是徹底使用緩存,瀏覽器和服務器沒有任何交互的。
情景二:若已過時,則向服務器發送請求,此時請求中會帶上①中設置的文件修改時間,和Etag
而後,進行資源更新判斷。服務器根據瀏覽器傳過來的文件修改時間,判斷自瀏覽器上一次請求以後,文件是否是沒有被修改過;根據Etag
,判斷文件內容自上一次請求以後,有沒有發生變化
情形一:若兩種判斷的結論都是文件沒有被修改過,則服務器就不給瀏覽器發index.html
的內容了,直接告訴它,文件沒有被修改過,你用你那邊的緩存吧—— 304 Not Modified
,此時瀏覽器就會從本地緩存中獲取index.html
的內容。此時的狀況叫協議緩存,瀏覽器和服務器之間有一次請求交互。
情形二:若修改時間和文件內容判斷有任意一個沒有經過,則服務器會受理這次請求,以後的操做同①
① 只有get請求會被緩存,post請求不會
Expires
要求客戶端和服務端的時鐘嚴格同步。HTTP1.1
引入Cache-Control
來克服Expires頭的限制。若是max-age和Expires同時出現,則max-age有更高的優先級。
Etag
由服務器端生成,客戶端經過If-Match
或者說If-None-Match
這個條件判斷請求來驗證資源是否修改。常見的是使用If-None-Match
。請求一個文件的流程可能以下:
====第一次請求===
1.客戶端發起 HTTP GET 請求一個文件; 2.服務器處理請求,返回文件內容和一堆Header,固然包括Etag(例如"2e681a-6-5d044840")(假設服務器支持Etag生成和已經開啓了Etag).狀態碼200
====第二次請求===
客戶端發起 HTTP GET 請求一個文件,注意這個時候客戶端同時發送一個If-None-Match頭,這個頭的內容就是第一次請求時服務器返回的Etag:2e681a-6-5d0448402.服務器判斷髮送過來的Etag和計算出來的Etag匹配,所以If-None-Match爲False,不返回200,返回304,客戶端繼續使用本地緩存;流程很簡單,問題是,若是服務器又設置了Cache-Control:max-age和Expires呢,怎麼辦
答案是同時使用,也就是說在徹底匹配If-Modified-Since
和If-None-Match
即檢查完修改時間和Etag
以後,
服務器才能返回304.(不要陷入到底使用誰的問題怪圈)
爲何使用Etag請求頭?
Etag 主要爲了解決 Last-Modified
沒法解決的一些問題。
棧的插入和刪除操做都是在一端進行的,而隊列的操做倒是在兩端進行的。 隊列先進先出,棧先進後出。 棧只容許在表尾一端進行插入和刪除,而隊列只容許在表尾一端進行插入,在表頭一端進行刪除
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。 堆區(heap) — 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。 堆(數據結構):堆能夠被當作是一棵樹,如:堆排序; 棧(數據結構):一種先進後出的數據結構。
「快速排序」的思想很簡單,整個排序過程只須要三步:
(1)在數據集之中,找一個基準點
(2)創建兩個數組,分別存儲左邊和右邊的數組
(3)利用遞歸進行下次比較
(答案僅供參考)
jQuery
源碼封裝在一個匿名函數的自執行環境中,有助於防止變量的全局污染,而後經過傳入window對象參數,能夠使window對象做爲局部變量使用,好處是當jquery
中訪問window對象的時候,就不用將做用域鏈退回到頂層做用域了,從而能夠更快的訪問window
對象。一樣,傳入undefined
參數,能夠縮短查找undefined時的做用域鏈。
jquery將一些原型屬性和方法封裝在了jquery.prototype
中,爲了縮短名稱,又賦值給了jquery.fn
,這是很形象的寫法。
有一些數組或對象的方法常常能使用到,jQuery將其保存爲局部變量以提升訪問速度。
jquery
實現的鏈式調用能夠節約代碼,所返回的都是同一個對象,能夠提升代碼效率。
新增模板字符串(爲JavaScript提供了簡單的字符串插值功能)、箭頭函數(操做符左邊爲輸入的參數,而右邊則是進行的操做以及返回的值Inputs=>outputs
。)、for-of
(用來遍歷數據—例如數組中的值。)arguments
對象可被不定參數和默認參數完美代替。ES6
將promise
對象歸入規範,提供了原生的Promise
對象。增長了let
和const
命令,用來聲明變量。增長了塊級做用域。let命令實際上就增長了塊級做用域。ES6規定,var
命令和function
命令聲明的全局變量,屬於全局對象的屬性;let
命令、const
命令、class
命令聲明的全局變量,不屬於全局對象的屬性。。還有就是引入module
模塊的概念
原型鏈繼承的缺點
一是字面量重寫原型會中斷關係,使用引用類型的原型,而且子類型還沒法給超類型傳遞參數。
借用構造函數(類式繼承)
借用構造函數雖然解決了剛纔兩種問題,但沒有原型,則複用無從談起。因此咱們須要原型鏈+借用構造函數的模式,這種模式稱爲組合繼承
組合式繼承
組合式繼承是比較經常使用的一種繼承方法,其背後的思路是 使用原型鏈實現對原型屬性和方法的繼承,而經過借用構造函數來實現對實例屬性的繼承。這樣,既經過在原型上定義方法實現了函數複用,又保證每一個實例都有它本身的屬性。
HTTP/2
引入了「服務端推(server push)」的概念,它容許服務端在客戶端須要數據以前就主動地將數據發送到客戶端緩存中,從而提升性能。
HTTP/2
提供更多的加密支持
HTTP/2
使用多路技術,容許多個消息在一個鏈接上同時交差。
它增長了頭壓縮(header compression),所以即便很是小的請求,其請求和響應的header
都只會佔用很小比例的帶寬。
defer並行加載js文件,會按照頁面上script標籤的順序執行
async並行加載js文件,下載完成當即執行,不會按照頁面上script標籤的順序執行
浮動的框能夠向左或向右移動,直到他的外邊緣碰到包含框或另外一個浮動框的邊框爲止。因爲浮動框不在文檔的普通流中,因此文檔的普通流的塊框表現得就像浮動框不存在同樣。浮動的塊框會漂浮在文檔普通流的塊框上。
backbone
具備依賴性,依賴underscore.js
。Backbone + Underscore + jQuery(or Zepto)
就比一個AngularJS
多出了2 次HTTP請求.
Backbone
的Model
沒有與UI視圖數據綁定,而是須要在View中自行操做DOM來更新或讀取UI數據。AngularJS
與此相反,Model直接與UI視圖綁定,Model
與UI視圖的關係,經過directive
封裝,AngularJS
內置的通用directive
,就能實現大部分操做了,也就是說,基本沒必要關心Model
與UI視圖的關係,直接操做Model就好了,UI視圖自動更新。
AngularJS
的directive
,你輸入特定數據,他就能輸出相應UI視圖。是一個比較完善的前端MVW框架,包含模板,數據雙向綁定,路由,模塊化,服務,依賴注入等全部功能,模板功能強大豐富,而且是聲明式的,自帶了豐富的 Angular 指令。
工廠模式:
主要好處就是能夠消除對象間的耦合,經過使用工程方法而不是new關鍵字。將全部實例化的代碼集中在一個位置防止代碼重複。 工廠模式解決了重複實例化的問題 ,但還有一個問題,那就是識別問題,由於根本沒法 搞清楚他們究竟是哪一個對象的實例。 function createObject(name,age,profession){//集中實例化的函數var obj = new Object(); obj.name = name; obj.age = age; obj.profession = profession; obj.move = function () { return this.name + ' at ' + this.age + ' engaged in ' + this.profession; }; return obj; } var test1 = createObject('trigkit4',22,'programmer');//第一個實例var test2 = createObject('mike',25,'engineer');//第二個實例
構造函數模式
使用構造函數的方法 ,即解決了重複實例化的問題 ,又解決了對象識別的問題,該模式與工廠模式的不一樣之處在於:
1.構造函數方法沒有顯示的建立對象 (new Object()); 2.直接將屬性和方法賦值給 this 對象; 3.沒有 renturn 語句。
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。在js中,函數即閉包,只有函數纔會產生做用域的概念
閉包有三個特性:
1.函數嵌套函數
2.函數內部能夠引用外部的參數和變量
3.參數和變量不會被垃圾回收機制回收
cookie
雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但仍是有不少侷限性的。
第一:每一個特定的域名下最多生成20個cookie
1.IE6或更低版本最多20個cookie 2.IE7和以後的版本最後能夠有50個cookie。 3.Firefox最多50個cookie 4.chrome和Safari沒有作硬性限制
IE
和Opera
會清理近期最少使用的cookie
,Firefox
會隨機清理cookie
。
cookie
的最大大約爲4096
字節,爲了兼容性,通常不能超過4095
字節。
IE 提供了一種存儲能夠持久化用戶數據,叫作userdata
,從IE5.0
就開始支持。每一個數據最多128K,每一個域名下最多1M。這個持久化數據放在緩存中,若是緩存沒有清理,那麼會一直存在。
優勢:極高的擴展性和可用性
1.經過良好的編程,控制保存在cookie中的session對象的大小。 2.經過加密和安全傳輸技術(SSL),減小cookie被破解的可能性。 3.只在cookie中存放不敏感數據,即便被盜也不會有重大損失。 4.控制cookie的生命期,使之不會永遠有效。偷盜者極可能拿到一個過時的cookie。
缺點:
1.`Cookie`數量和長度的限制。每一個domain最多隻能有20條cookie,每一個cookie長度不能超過4KB,不然會被截掉. 2.安全性問題。若是cookie被人攔截了,那人就能夠取得全部的session信息。即便加密也與事無補,由於攔截者並不須要知道cookie的意義,他只要原樣轉發cookie就能夠達到目的了。 3.有些狀態不可能保存在客戶端。例如,爲了防止重複提交表單,咱們須要在服務器端保存一個計數器。若是咱們把這個計數器保存在客戶端,那麼它起不到任何做用。
在較高版本的瀏覽器中,js
提供了sessionStorage
和globalStorage
。在HTML5
中提供了localStorage
來取代globalStorage
。
html5
中的Web Storage
包括了兩種存儲方式:sessionStorage
和localStorage
。
sessionStorage
用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以sessionStorage
不是一種持久化的本地存儲,僅僅是會話級別的存儲。
而localStorage
用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。
Web Storage
的概念和cookie
類似,區別是它是爲了更大容量存儲設計的。Cookie
的大小是受限的,而且每次你請求一個新的頁面的時候Cookie
都會被髮送過去,這樣無形中浪費了帶寬,另外cookie
還須要指定做用域,不能夠跨域調用。
除此以外,Web Storage
擁有setItem,getItem,removeItem,clear
等方法,不像cookie
須要前端開發者本身封裝setCookie,getCookie
。
可是cookie
也是不能夠或缺的:cookie
的做用是與服務器進行交互,做爲HTTP
規範的一部分而存在 ,而Web Storage
僅僅是爲了在本地「存儲」數據而生
瀏覽器的支持除了IE7
及如下不支持外,其餘標準瀏覽器都徹底支持(ie及FF需在web服務器裏運行),值得一提的是IE老是辦好事,例如IE七、IE6中的userData
其實就是javascript
本地存儲的解決方案。經過簡單的代碼封裝能夠統一到全部的瀏覽器都支持web storage
。
localStorage
和sessionStorage
都具備相同的操做方法,例如setItem、getItem
和removeItem
等
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。 二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。 三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。 四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。 五、因此我的建議: 將登錄信息等重要信息存放爲SESSION 其餘信息若是須要保留,能夠放在COOKIE中
display:none
和visibility:hidden
的區別?
display:none 隱藏對應的元素,在文檔佈局中再也不給它分配空間,它各邊的元素會合攏,就當他歷來不存在。 visibility:hidden 隱藏對應的元素,可是在文檔佈局中仍保留原來的空間。
CSS中
link
和@import
的區別是?
(1) link屬於HTML標籤,而@import是CSS提供的; (2) 頁面被加載的時,link會同時被加載,而@import被引用的CSS會等到引用它的CSS文件被加載完再加載; (3) import只在IE5以上才能識別,而link是HTML標籤,無兼容問題; (4) link方式的樣式的權重 高於@import的權重.
position:absolute
和float
屬性的異同
共同點:對內聯元素設置float
和absolute
屬性,可讓元素脫離文檔流,而且能夠設置其寬高。
不一樣點:float
仍會佔據位置,absolute
會覆蓋文檔流中的其餘元素。
介紹一下box-sizing屬性?
box-sizing
屬性主要用來控制元素的盒模型的解析模式。默認值是content-box
。
content-box
:讓元素維持W3C的標準盒模型。元素的寬度/高度由border + padding + content
的寬度/高度決定,設置width/height
屬性指的是content
部分的寬/高
border-box
:讓元素維持IE傳統盒模型(IE6如下版本和IE6~7的怪異模式)。設置width/height
屬性指的是border + padding + content
標準瀏覽器下,按照W3C規範對盒模型解析,一旦修改了元素的邊框或內距,就會影響元素的盒子尺寸,就不得不從新計算元素的盒子尺寸,從而影響整個頁面的佈局。
優先級爲:
!important > id > class > tag
important
比 內聯優先級高,但內聯比 id
要高
CSS3新增僞類舉例:
CSS3有哪些新特性?
CSS3實現圓角(border-radius),陰影(box-shadow), 對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform) transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋轉,縮放,定位,傾斜 增長了更多的CSS選擇器 多背景 rgba 在CSS3中惟一引入的僞元素是::selection. 媒體查詢,多欄佈局 border-image
CSS3中新增了一種盒模型計算方式:box-sizing
。盒模型默認的值是content-box
, 新增的值是padding-box
和border-box
,幾種盒模型計算元素寬高的區別以下:
content-box(默認)
佈局所佔寬度Width:
佈局所佔高度Height:
padding-box
佈局所佔寬度Width:
佈局所佔高度Height:
border-box
佈局所佔寬度Width:
佈局所佔高度Height:
對BFC規範的理解?
BFC,塊級格式化上下文,一個建立了新的BFC的盒子是獨立佈局的,盒子裏面的子元素的樣式不會影響到外面的元素。在同一個BFC中的兩個毗鄰的塊級盒在垂直方向(和佈局方向有關係)的margin會發生摺疊。 (W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行佈局,以及與其餘元素的關係和相互做用。
1,去掉或者丟失樣式的時候可以讓頁面呈現出清晰的結構 2,有利於SEO:和搜索引擎創建良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來肯定上下文和各個關鍵字的權重; 3,方便其餘設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁; 4,便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標準的團隊都遵循這個標準,能夠減小差別化。
1)、<!DOCTYPE>
聲明位於文檔中的最前面,處於 <html>
標籤以前。告知瀏覽器以何種模式來渲染文檔。
2)、嚴格模式的排版和 JS
運做模式是 以該瀏覽器支持的最高標準運行。
3)、在混雜模式中,頁面以寬鬆的向後兼容的方式顯示。模擬老式瀏覽器的行爲以防止站點沒法工做。
4)、DOCTYPE
不存在或格式不正確會致使文檔以混雜模式呈現。
Doctype
文檔類型?該標籤可聲明三種 DTD 類型,分別表示嚴格版本、過渡版本以及基於框架的 HTML 文檔。 HTML 4.01 規定了三種文檔類型:Strict、Transitional 以及 Frameset。 XHTML 1.0 規定了三種 XML 文檔類型:Strict、Transitional 以及 Frameset。 Standards (標準)模式(也就是嚴格呈現模式)用於呈現遵循最新標準的網頁,而 Quirks (包容)模式(也就是鬆散呈現模式或者兼容模式)用於呈現爲傳統瀏覽器而設計的網頁。
區別: 1.全部的標記都必需要有一個相應的結束標記 2.全部標籤的元素和屬性的名字都必須使用小寫 3.全部的XML標記都必須合理嵌套 4.全部的屬性必須用引號""括起來 5.把全部<和&特殊符號用編碼表示 6.給全部屬性賦一個值 7.不要在註釋內容中使「--」 8.圖片必須有說明文字
png24位的圖片在iE6瀏覽器上出現背景,解決方案是作成PNG8.也能夠引用一段腳本處理. 瀏覽器默認的margin和padding不一樣。解決方案是加一個全局的*{margin:0;padding:0;}來統一。 IE6雙邊距bug:塊屬性標籤float後,又有橫行的margin狀況下,在ie6顯示margin比設置的大。 浮動ie產生的雙倍距離(IE6雙邊距問題:在IE6下,若是對元素設置了浮動,同時又設置了margin-left或margin-right,margin值會加倍。) #box{ float:left; width:10px; margin:0 0 0 100px;} 這種狀況之下IE會產生20px的距離,解決方案是在float的標籤樣式控制中加入 _display:inline;將其轉化爲行內屬性。(_這個符號只有ie6會識別) 漸進識別的方式,從整體中逐漸排除局部。 首先,巧妙的使用「\9」這一標記,將IE遊覽器從全部狀況中分離出來。 接着,再次使用「+」將IE8和IE七、IE6分離開來,這樣IE8已經獨立識別。 css .bb{ background-color:#f1ee18;/*全部識別*/ .background-color:#00deff\9; /*IE六、七、8識別*/ +background-color:#a200ff;/*IE六、7識別*/ _background-color:#1e0bd1;/*IE6識別*/ } 怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發 怪異模式。爲避免怪異模式給咱們帶來沒必要要的麻煩,最好養成書寫DTD聲明的好習慣。如今 能夠使用[html5](http://www.w3.org/TR/html5/single-page.html)推薦的寫法:`<doctype html>`
上下margin重合問題
ie和ff都存在,相鄰的兩個div的margin-left和margin-right不會重合,可是margin-top和margin-bottom卻會發生重合。 解決方法,養成良好的代碼編寫習慣,同時採用margin-top或者同時採用margin-bottom。
浮動元素脫離文檔流,不佔據空間。浮動元素碰到包含它的邊框或者浮動元素的邊框停留。 1.使用空標籤清除浮動。 這種方法是在全部浮動標籤後面添加一個空標籤 定義css clear:both. 弊端就是增長了無心義標籤。 2.使用overflow。 給包含浮動元素的父標籤添加css屬性 overflow:auto; zoom:1; zoom:1用於兼容IE6。 3.使用after僞對象清除浮動。 該方法只適用於非IE瀏覽器。具體寫法可參照如下示例。使用中需注意如下幾點。1、該方法中必須爲須要清除浮動元素的僞對象中設置 height:0,不然該元素會比實際高出若干像素;
浮動元素引發的問題: (1)父元素的高度沒法被撐開,影響與父元素同級的元素 (2)與浮動元素同級的非浮動元素(內聯元素)會跟隨其後 (3)若非第一個元素浮動,則該元素以前的元素也須要浮動,不然會影響頁面顯示的結構
解決方法:
使用CSS
中的clear:both
;屬性來清除元素的浮動可解決二、3問題,對於問題1,添加以下樣式,給父元素添加clearfix
樣式:
清除浮動的幾種方法:
1)建立新節點
createDocumentFragment() //建立一個DOM片斷 createElement() //建立一個具體的元素 createTextNode() //建立一個文本節點
2)添加、移除、替換、插入
appendChild() removeChild() replaceChild() insertBefore() //並無insertAfter()
3)查找
getElementsByTagName() //經過標籤名稱 getElementsByName() //經過元素的Name屬性的值(IE容錯能力較強, 會獲得一個數組,其中包括id等於name值的) getElementById() //經過元素Id,惟一性
HTML5 如今已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增長。 拖拽釋放(Drag and drop) API 語義化更好的內容標籤(header,nav,footer,aside,article,section) 音頻、視頻API(audio,video) 畫布(Canvas) API 地理(Geolocation) API 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失; sessionStorage 的數據在瀏覽器關閉後自動刪除 表單控件,calendar、date、time、email、url、search 新的技術webworker, websocket, Geolocation
移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u; 對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
null
是一個表示」無」的對象,轉爲數值時爲0;undefined
是一個表示」無」的原始值,轉爲數值時爲NaN
。
當聲明的變量還未被初始化時,變量的默認值爲undefined
。
null
用來表示還沒有存在的對象,經常使用來表示函數企圖返回一個不存在的對象。
undefined
表示」缺乏值」,就是此處應該有一個值,可是尚未定義。典型用法是:
(1)變量被聲明瞭,但沒有賦值時,就等於undefined。 (2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。 (3)對象沒有賦值的屬性,該屬性的值爲undefined。 (4)函數沒有返回值時,默認返回undefined。
null
表示」沒有對象」,即該處不該該有值。典型用法是:
(1) 做爲函數的參數,表示該函數的參數不是對象。 (2) 做爲對象原型鏈的終點。
一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。 二、屬性和方法被加入到 this 引用的對象中。 三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。 var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
defer和async、動態建立DOM方式(建立script,插入到DOM中,加載完畢後callBack)、按需異步載入js
call()
和 apply()
的區別和做用?做用:動態改變某個類的某個方法的運行環境(執行上下文)。
區別參見:[JavaScript學習總結(四)function函數部分][3]
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。 垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。 setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。 閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
詳見:[詳解js變量、做用域及內存][4]
IE支持currentStyle
,FIrefox使用getComputStyle
IE 使用innerText
,Firefox使用textContent
濾鏡方面:IE:filter:alpha(opacity= num)
;Firefox:-moz-opacity:num
事件方面:IE:attachEvent
:火狐是addEventListener
鼠標位置:IE是event.clientX
;火狐是event.pageX
IE使用event.srcElement
;Firefox使用event.target
IE中消除list的原點僅需margin:0便可達到最終效果;FIrefox須要設置margin:0;padding:0以及list-style:none
CSS圓角:ie7如下不支持圓角
Javascript數據推送
Commet
:基於HTTP長鏈接的服務器推送技術
基於WebSocket
的推送方案
SSE
(Server-Send Event):服務器推送數據新方式
前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近。 一、實現界面交互 二、提高用戶體驗 三、有了Node.js,前端能夠實現服務端的一些事情 前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好, 參與項目,快速高質量完成實現效果圖,精確到1px; 與團隊成員,UI設計,產品經理的溝通; 作好的頁面結構,頁面重構和用戶體驗; 處理hack,兼容、寫出優美的代碼格式; 針對服務器的優化、擁抱最新前端技術。
分爲4個步驟: (1),當發送一個URL請求時,無論這個URL是Web頁面的URL仍是Web頁面上每一個資源的URL,瀏覽器都會開啓一個線程來處理這個請求,同時在遠程DNS服務器上啓動一個DNS查詢。這能使瀏覽器得到請求對應的IP地址。 (2), 瀏覽器與遠程`Web`服務器經過`TCP`三次握手協商來創建一個`TCP/IP`鏈接。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這三個報文在 瀏覽器和服務器之間傳遞。該握手首先由客戶端嘗試創建起通訊,然後服務器應答並接受客戶端的請求,最後由客戶端發出該請求已經被接受的報文。 (3),一旦`TCP/IP`鏈接創建,瀏覽器會經過該鏈接向遠程服務器發送`HTTP`的`GET`請求。遠程服務器找到資源並使用HTTP響應返回該資源,值爲200的HTTP響應狀態表示一個正確的響應。 (4),此時,`Web`服務器提供資源服務,客戶端開始下載資源。 請求返回後,便進入了咱們關注的前端模塊 簡單來講,瀏覽器會解析`HTML`生成`DOM Tree`,其次會根據CSS生成CSS Rule Tree,而`javascript`又能夠根據`DOM API`操做`DOM`
詳情:[從輸入 URL 到瀏覽器接收的過程當中發生了什麼事情?][8]
1,工廠模式 2,構造函數模式 3,原型模式 4,混合構造函數和原型模式 5,動態原型模式 6,寄生構造函數模式 7,穩妥構造函數模式
1,原型鏈繼承 2,借用構造函數繼承 3,組合繼承(原型+借用構造) 4,原型式繼承 5,寄生式繼承 6,寄生組合式繼承
詳情:[JavaScript繼承方式詳解][9]
詳情:[JavaScript學習總結(七)Ajax和Http狀態字][10]
1.異步加載的方案: 動態插入script標籤 2.經過ajax去獲取js代碼,而後經過eval執行 3.script標籤上添加defer或者async屬性 4.建立並插入iframe,讓它異步執行js 5.延遲加載:有些 js 代碼並非頁面初始化的時候就馬上須要的,而稍後的某些狀況才須要的。
IE6 兩個併發,iE7升級以後的6個併發,以後版本也是6個 Firefox,chrome也是6個
Flash
、Ajax
各自的優缺點,在使用中如何取捨?Flash
適合處理多媒體、矢量圖形、訪問機器;對CSS
、處理文本上不足,不容易被搜索。 -Ajax
對CSS
、文本支持很好,支持搜索;多媒體、矢量圖形、機器訪問不足。
概念:同源策略是客戶端腳本(尤爲是Javascript
)的重要的安全度量標準。它最先出自Netscape Navigator2.0
,其目的是防止某個文檔或腳本從多個不一樣源裝載。
這裏的同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議。
指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
咱們舉例說明:好比一個黑客程序,他利用Iframe
把真正的銀行登陸頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登陸時,他的頁面就能夠經過Javascript
讀取到你的表單中input
中的內容,這樣用戶名,密碼就輕鬆到手了。
缺點:
如今網站的JS
都會進行壓縮,一些文件用了嚴格模式,而另外一些沒有。這時這些原本是嚴格模式的文件,被 merge
後,這個串就到了文件的中間,不只沒有指示嚴格模式,反而在壓縮後浪費了字節。
GET:通常用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,通常在2000個字符 POST:通常用於修改服務器上的資源,對所發送的信息沒有限制。 GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值, 也就是說Get是經過地址欄來傳值,而Post是經過提交表單來傳值。 然而,在如下狀況中,請使用 POST 請求: 沒法使用緩存文件(更新服務器上的文件或數據庫) 向服務器發送大量數據(POST 沒有數據量限制) 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。 2. 事件處理機制:IE是事件冒泡、firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件。; 3. `ev.stopPropagation()`;注意舊ie的方法 `ev.cancelBubble = true`;
詳情請見:[JavaScript學習總結(七)Ajax和Http狀態字][14]
ajax的缺點
一、ajax不支持瀏覽器back按鈕。 二、安全問題 AJAX暴露了與服務器交互的細節。 三、對搜索引擎的支持比較弱。 四、破壞了程序的異常機制。 五、不容易調試。
IE緩存問題
在IE瀏覽器下,若是請求的方法是GET
,而且請求的URL
不變,那麼這個請求的結果就會被緩存。解決這個問題的辦法能夠經過實時改變請求的URL
,只要URL改變,就不會被緩存,能夠經過在URL末尾添加上隨機的時間戳參數('t'= + new Date().getTime()
)
或者:
Ajax請求的頁面歷史記錄狀態問題
能夠經過錨點來記錄狀態,location.hash
。讓瀏覽器記錄Ajax請求時頁面狀態的變化。
還能夠經過HTML5
的history.pushState
,來實現瀏覽器地址欄的無刷新改變
網站重構:在不改變外部行爲的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行爲。也就是說是在不改變UI的狀況下,對網站進行優化,
在擴展的同時保持一致的UI。
對於傳統的網站來講重構一般是: 表格(table)佈局改成DIV+CSS 使網站前端兼容於現代瀏覽器(針對於不合規範的CSS、如對IE6有效的) 對於移動平臺的優化 針對於SEO進行優化 深層次的網站重構應該考慮的方面 減小代碼間的耦合 讓代碼保持彈性 嚴格按規範編寫代碼 設計可擴展的API 代替舊有的框架、語言(如VB) 加強用戶體驗 一般來講對於速度的優化也包含在重構中 壓縮JS、CSS、image等前端資源(一般是由服務器來解決) 程序的性能優化(如數據讀寫) 採用CDN來加速資源加載 對於JS DOM的優化 HTTP服務器的文件緩存
依照 Promise/A+
的定義,Promise
有四種狀態:
pending: 初始狀態, 非 fulfilled 或 rejected. fulfilled: 成功的操做. rejected: 失敗的操做. settled: Promise已被fulfilled或rejected,且不是pending
另外, fulfilled
與 rejected
一塊兒合稱 settled
。
Promise
對象用來進行延遲(deferred) 和異步(asynchronous ) 計算。
Promise 的構造函數
構造一個 Promise
,最基本的用法以下:
Promise
實例擁有 then
方法(具備 then
方法的對象,一般被稱爲 thenable
)。它的使用方法以下:
接收兩個函數做爲參數,一個在 fulfilled
的時候被調用,一個在 rejected
的時候被調用,接收參數就是 future,onFulfilled
對應 resolve
, onRejected
對應 reject
。
負責前端團隊的管理及與其餘團隊的協調工做,提高團隊成員能力和總體效率;
帶領團隊完成研發工具及平臺前端部分的設計、研發和維護;
帶領團隊進行前端領域前沿技術研究及新技術調研,保證團隊的技術領先
負責前端開發規範制定、功能模塊化設計、公共組件搭建等工做,並組織培訓。
嚴格模式主要有如下限制:
變量必須聲明後再使用 函數的參數不能有同名屬性,不然報錯 不能使用with語句 不能對只讀屬性賦值,不然報錯 不能使用前綴0表示八進制數,不然報錯 不能刪除不可刪除的屬性,不然報錯 不能刪除變量delete prop,會報錯,只能刪除屬性delete global[prop] eval不會在它的外層做用域引入變量 eval和arguments不能被從新賦值 arguments不會自動反映函數參數的變化 不能使用arguments.callee 不能使用arguments.caller 禁止this指向全局對象 不能使用fn.caller和fn.arguments獲取函數調用的堆棧 增長了保留字(好比protected、static和interface)
設立」嚴格模式」的目的,主要有如下幾個:
消除Javascript
語法的一些不合理、不嚴謹之處,減小一些怪異行爲;
消除代碼運行的一些不安全之處,保證代碼運行的安全;
提升編譯器效率,增長運行速度;
爲將來新版本的Javascript
作好鋪墊。
注:通過測試IE6,7,8,9
均不支持嚴格模式。
1.將時間設爲當前時間往前一點。
setDate()
方法用於設置一個月的某一天。
2.expires的設置
<strong>
,<em>
和<b>
,<i>
標籤 CommonJS
是服務器端模塊的規範,Node.js採用了這個規範。CommonJS
規範加載模塊是同步的,也就是說,只有加載完成,才能執行後面的操做。AMD規範則是非同步加載模塊,容許指定回調函數。
AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的屬性賦值來達到暴露模塊對象的目的。
document.write()
方法能夠用在兩個方面:頁面載入過程當中用實時腳本建立頁面內容,以及用延時腳本建立本窗口或新窗口的內容。
document.write
只能重繪整個頁面。innerHTML
能夠重繪頁面的一部分
假設:一個英文字符佔用一個字節,一箇中文字符佔用兩個字節
MVC
View 傳送指令到 Controller Controller 完成業務邏輯後,要求 Model 改變狀態 Model 將新的數據發送到 View,用戶獲得反饋
全部通訊都是單向的。
Angular
它採用雙向綁定(data-binding):View
的變更,自動反映在 ViewModel
,反之亦然。
組成部分Model、View、ViewModel View:UI界面 ViewModel:它是View的抽象,負責View與Model之間信息轉換,將View的Command傳送到Model; Model:數據訪問層
事件代理(Event Delegation),又稱之爲事件委託。是 JavaScript
中經常使用綁定事件的經常使用技巧。顧名思義,「事件代理」便是把本來須要綁定的事件委託給父元素,讓父元素擔當事件監聽的職務。事件代理的原理是DOM
元素的事件冒泡。使用事件代理的好處是能夠提升性能。
attribute
是dom
元素在文檔中做爲html
標籤擁有的屬性;
property
就是dom
元素在js
中做爲對象擁有的屬性。
因此:
對於html
的標準屬性來講,attribute
和property
是同步的,是會自動更新的,
可是對於自定義的屬性來講,他們是不一樣步的,
應用層:應用層、表示層、會話層(從上往下)(HTTP、FTP、SMTP、DNS
)
傳輸層(TCP
和UDP
)
網絡層(IP
)
物理和數據鏈路層(以太網)
每一層的做用以下:
各類協議
ICMP協議
: 因特網控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。
TFTP協議
: 是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。
HTTP協議
: 超文本傳輸協議,是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。
DHCP協議
: 動態主機配置協議,是一種讓系統得以鏈接到網絡上,並獲取所須要的配置參數手段。
MySQL
是傳統的關係型數據庫,MongoDB
則是非關係型數據庫
mongodb
以BSON
結構(二進制)進行存儲,對海量數據存儲有着很明顯的優點。
對比傳統關係型數據庫,NoSQL有着很是顯著的性能和擴展性優點,與關係型數據庫相比,MongoDB的優勢有:
①弱一致性(最終一致),更能保證用戶的訪問速度:
②文檔結構的存儲方式,可以更便捷的獲取數據。
服務器首先產生ETag
,服務器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端經過將該記號傳回服務器要求服務器驗證其(客戶端)緩存。
304是HTTP狀態碼,服務器用來標識這個文件沒修改,不返回內容,瀏覽器在接收到個狀態碼後,會使用瀏覽器已緩存的文件
客戶端請求一個頁面(A)。 服務器返回頁面A,並在給A
加上一個ETag
。 客戶端展示該頁面,並將頁面連同ETag
一塊兒緩存。 客戶再次請求頁面A
,並將上次請求時服務器返回的ETag
一塊兒傳遞給服務器。 服務器檢查該ETag
,並判斷出該頁面自上次客戶端請求以後還未被修改,直接返回響應304
(未修改——Not Modified
)和一個空的響應體。
高複用低耦合,這樣文件小,好維護,並且好擴展。