本文旨在加深對前端知識點的理解,資料來源於網絡,博客:http://segmentfault.com/u/trigkit4。javascript
HTML&CSS: 對Web標準的理解、瀏覽器內核差別、兼容性、hack、CSS基本功:佈局、盒子模型、選擇器優先級及使用、HTML五、CSS三、移動端適應。 JavaScript: 數據類型、面向對象、繼承、閉包、插件、做用域、跨域、原型鏈、模塊化、自定義事件、內存泄漏、事件機制、異步裝載回調、模板引擎、Nodejs、JSON、ajax等。 其餘: HTTP、安全、正則、優化、重構、響應式、移動端、團隊協做、可維護、SEO、UED、架構、職業生涯
cookie
雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但仍是有不少侷限性的。
第一:每一個特定的域名下最多生成20個cookie
css
1.IE6或更低版本最多20個cookie 2.IE7和以後的版本最後能夠有50個cookie。 3.Firefox最多50個cookie 4.chrome和Safari沒有作硬性限制
IE
和Opera
會清理近期最少使用的cookie
,Firefox
會隨機清理cookie
。html
cookie
的最大大約爲4096
字節,爲了兼容性,通常不能超過4095
字節。前端
IE 提供了一種存儲能夠持久化用戶數據,叫作userData
,從IE5.0
就開始支持。每一個數據最多128K,每一個域名下最多1M。這個持久化數據放在緩存中,若是緩存沒有清理,那麼會一直存在。html5
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
。java
html5
中的Web Storage
包括了兩種存儲方式:sessionStorage
和localStorage
。node
sessionStorage
用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以sessionStorage
不是一種持久化的本地存儲,僅僅是會話級別的存儲。nginx
而localStorage
用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。git
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
等
display:none 隱藏對應的元素,在文檔佈局中再也不給它分配空間,它各邊的元素會合攏, 就當他歷來不存在。 visibility:hidden 隱藏對應的元素,可是在文檔佈局中仍保留原來的空間。
A:(1) link屬於HTML標籤,而@import是CSS提供的; (2) 頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載;(3) import只在IE5以上才能識別,而link是HTML標籤,無兼容問題; (4) link方式的樣式的權重 高於@import的權重.
A:共同點: 1.改變行內元素的呈現方式,display被置爲block;2.讓元素脫離普通流,不佔據空間;3.默認會覆蓋到非定位元素上 B不一樣點: absolute的」根元素「是能夠設置的,而fixed的」根元素「固定爲瀏覽器窗口。當你滾動網頁,fixed元素與瀏覽器窗口之間的距離是不變的。
1)有兩種, IE 盒子模型、標準 W3C 盒子模型;IE的content部分包含了 border 和 pading; 2)盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border).
* 1.id選擇器( # myid) 2.類選擇器(.myclassname) 3.標籤選擇器(div, h1, p) 4.相鄰選擇器(h1 + p) 5.子選擇器(ul < li) 6.後代選擇器(li a) 7.通配符選擇器( * ) 8.屬性選擇器(a[rel = "external"]) 9.僞類選擇器(a: hover, li: nth - child) * 可繼承的樣式: font-size font-family color, UL LI DL DD DT; * 不可繼承的樣式:border padding margin width height ; * 優先級就近原則,同權重狀況下樣式定義最近者爲準; * 載入樣式以最後載入的定位爲準; 優先級爲: !important > id > class > tag important 比 內聯優先級高 CSS3新增僞類舉例: p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每一個 <p> 元素。 p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每一個 <p> 元素。 p:only-of-type 選擇屬於其父元素惟一的 <p> 元素的每一個 <p> 元素。 p:only-child 選擇屬於其父元素的惟一子元素的每一個 <p> 元素。 p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p> 元素。 :enabled :disabled 控制表單控件的禁用狀態。 :checked 單選框或複選框被選中。
如下是權重的規則:標籤的權重爲1,class的權重爲10,id的權重爲100,如下例子是演示各類定義的權重值: /*權重爲1*/ div{ } /*權重爲10*/ .class1{ } /*權重爲100*/ #id1{ } /*權重爲100+1=101*/ #id1 div{ } /*權重爲10+1=11*/ .class1 div{ } /*權重爲10+10+1=21*/ .class1 .class2 div{ } 若是權重相同,則最後定義的樣式會起做用,可是應該避免這種狀況出現
1. block 象塊類型元素同樣顯示。 inline 缺省值。象行內元素類型同樣顯示。 inline-block 象行內元素同樣顯示,但其內容象塊類型元素同樣顯示。 list-item 象塊類型元素同樣顯示,並添加樣式列表標記。 2. *absolute 生成絕對定位的元素,相對於 static 定位之外的第一個父元素進行定位。 *fixed (老IE不支持) 生成絕對定位的元素,相對於瀏覽器窗口進行定位。 *relative 生成相對定位的元素,相對於其正常位置進行定位。 * static 默認值。沒有定位,元素出如今正常的流中 *(忽略 top, bottom, left, right z-index 聲明)。 * inherit 規定從父元素繼承 position 屬性的值。
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
由於瀏覽器的兼容問題,不一樣瀏覽器對有些標籤的默認值是不一樣的,若是沒對CSS初始化每每會出現瀏覽器之間的頁面顯示差別。 固然,初始化樣式會對SEO有必定的影響,但魚和熊掌不可兼得,但力求影響最小的狀況下初始化。 *最簡單的初始化方法就是: * {padding: 0; margin: 0;} (不建議) 淘寶的樣式初始化:
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; } body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; } h1, h2, h3, h4, h5, h6{ font-size:100%; } address, cite, dfn, em, var { font-style:normal; } code, kbd, pre, samp { font-family:couriernew, courier, monospace; } small{ font-size:12px; } ul, ol { list-style:none; } a { text-decoration:none; } a:hover { text-decoration:underline; } sup { vertical-align:text-top; } sub{ vertical-align:text-bottom; } legend { color:#000; } fieldset, img { border:0; } button, input, select, textarea { font-size:100%; } table { border-collapse:collapse; border-spacing:0; }
BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。 (W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行定位,以及與其餘元素的關 系和相互做用。)
CSS Sprites其實就是把網頁中一些背景圖片整合到一張圖片文件中,再利用CSS的「background-image」,「background- repeat」,「background-position」的組合進行背景定位,background-position能夠用數字能精確的定位出背景圖片的位置。
1,去掉或者丟失樣式的時候可以讓頁面呈現出清晰的結構 2,有利於SEO:和搜索引擎創建良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來肯定上下文和各個關鍵字的權重; 3,方便其餘設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁; 4,便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標準的團隊都遵循這個標準,能夠減小差別化。
(1)、<!DOCTYPE> 聲明位於文檔中的最前面,處於 <html> 標籤以前。告知瀏覽器的解析器,用什麼文檔類型 規範來解析這個文檔。 (2)、嚴格模式的排版和 JS 運做模式是 以該瀏覽器支持的最高標準運行。 (3)、在混雜模式中,頁面以寬鬆的向後兼容的方式顯示。模擬老式瀏覽器的行爲以防止站點沒法工做。 (4)、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識別*/ } * IE下,可使用獲取常規屬性的方法來獲取自定義屬性, 也可使用getAttribute()獲取自定義屬性; Firefox下,只能使用getAttribute()獲取自定義屬性. 解決方法:統一經過getAttribute()獲取自定義屬性. * IE下,event對象有x,y屬性,可是沒有pageX,pageY屬性; Firefox下,event對象有pageX,pageY屬性,可是沒有x,y屬性. * 解決方法:(條件註釋)缺點是在IE瀏覽器下可能會增長額外的HTTP請求數。 * Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示, 可經過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決. * 超連接訪問事後hover樣式就不出現了 被點擊訪問過的超連接樣式不在具備hover和active瞭解決方法是改變CSS屬性的排列順序: L-V-H-A : a:link {} a:visited {} a:hover {} a:active {} * 怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發怪異模式。爲避免怪異模式給咱們帶來沒必要要的麻煩,最好養成書寫DTD聲明的好習慣。 * 上下margin重合問題 ie和ff都存在,相鄰的兩個div的margin-left和margin-right不會重合,可是margin-top和margin-bottom卻會發生重合。 解決方法,養成良好的代碼編寫習慣,同時採用margin-top或者同時採用margin-bottom。 * ie6對png圖片格式支持很差(引用一段腳本處理)
浮動元素脫離文檔流,不佔據空間。浮動元素碰到包含它的邊框或者浮動元素的邊框停留。 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
樣式:
.clearfix:after{content: ".";display: block;height: 0;clear: both;visibility: hidden;} .clearfix{display: inline-block;} /* for IE/Mac */
清除浮動的幾種方法:
1,額外標籤法,<div style="clear:both;"></div>(缺點:不過這個辦法會增長額外的標籤使HTML結構看起來不夠簡潔。) 2,使用after僞類 #parent:after{ content:"."; height:0; visibility:hidden; display:block; clear:both; } 3,浮動外部元素 4,設置`overflow`爲`hidden`或者auto
IE8如下瀏覽器的盒模型中定義的元素的寬高不包括內邊距和邊框
(1)建立新節點 createDocumentFragment() //建立一個DOM片斷 createElement() //建立一個具體的元素 createTextNode() //建立一個文本節點 (2)添加、移除、替換、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子節點前插入一個新的子節點 (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新標籤: * IE8/IE7/IE6支持經過document.createElement方法產生的標籤, 能夠利用這一特性讓這些瀏覽器支持HTML5新標籤, 瀏覽器支持新標籤後,還須要添加標籤默認的樣式: * 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 <!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]--> 如何區分: DOCTYPE聲明\新增的結構元素\功能元素
1.<iframe>優勢: 解決加載緩慢的第三方內容如圖標和廣告等的加載問題 Security sandbox 並行加載腳本 2.<iframe>的缺點: *iframe會阻塞主頁面的Onload事件; *即時內容爲空,加載也須要時間 *沒有語意
調用localstorge、cookies等本地存儲方式
Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基於 multipart 編碼發送 XHR 、 基於長輪詢的 XHR
一個程序至少有一個進程,一個進程至少有一個線程. 線程的劃分尺度小於進程,使得多線程程序的併發性高。 另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。 線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
期待的解決方案包括: 文件合併 文件最小化/文件壓縮 使用 CDN 託管 緩存的使用(多個域名來提供緩存) 其餘
1.優化圖片 2.圖像格式的選擇(GIF:提供的顏色較少,可用在一些對顏色要求不高的地方) 3.優化CSS(壓縮合並css,如margin-top,margin-left...) 4.網址後加斜槓(如www.campr.com/目錄,會判斷這個「目錄是什麼文件類型,或者是目錄。) 5.標明高度和寬度(若是瀏覽器沒有找到這兩個參數,它須要一邊下載圖片一邊計算大小,若是圖片不少,瀏覽器須要不斷地調整頁面。這不但影響速度,也影響瀏覽體驗。 當瀏覽器知道了高度和寬度參數後,即便圖片暫時沒法顯示,頁面上也會騰出圖片的空位,而後繼續加載後面的內容。從而加載時間快了,瀏覽體驗也更好了。) 6.減小http請求(合併文件,合併圖片)。
Profiler, JSPerf(http://jsperf.com/nexttick-vs-setzerotimeout-vs-settimeout), Dromaeo
FOUC - Flash Of Unstyled Content 文檔樣式閃爍 <style type="text/css" media="all">@import "../fouc.css";</style> 而引用CSS文件的@import就是形成這個問題的罪魁禍首。IE會先加載整個HTML文檔的DOM,而後再去導入外部的CSS文件,所以,在頁面DOM加載完成到CSS導入完成中間會有一段時間頁面上的內容是沒有樣式的,這段時間的長短跟網速,電腦速度都有關係。 解決方法簡單的出奇,只要在<head>之間加入一個<link>或者<script>元素就能夠了。
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);
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小 {'age':'12', 'name':'back'}
defer和async、動態建立DOM方式(建立script,插入到DOM中,加載完畢後callBack)、按需異步載入js
jsonp、 document.domain+iframe、window.name、window.postMessage、服務器上設置代理頁面 jsonp的原理是動態插入script標籤
具體參見:詳解js跨域問題
document.write只能重繪整個頁面 innerHTML能夠重繪頁面的一部分
做用:動態改變某個類的某個方法的運行環境。
區別參見:JavaScript學習總結(四)function函數部分
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。 垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。 setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。 閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
經過判斷Global對象是否爲window,若是不爲window,當前腳本沒有運行在瀏覽器中
* 網站重構:應用web標準進行設計(第2版)
優雅降級:Web站點在全部新式瀏覽器中都能正常工做,若是用戶使用的是老式瀏覽器,則代碼會檢查以確認它們是否能正常工做。因爲IE獨特的盒模型佈局問題,針對不一樣版本的IE的hack實踐過優雅降級了,爲那些沒法支持功能的瀏覽器增長候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於徹底失效. 漸進加強:從被全部瀏覽器支持的基本功能開始,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面增長無害於基礎瀏覽器的額外樣式和功能的。當瀏覽器支持時,它們會自動地呈現出來併發揮做用。
詳見:css學習概括總結(一)
*(優勢)由於Node是基於事件驅動和無阻塞的,因此很是適合處理併發請求, 所以構建在Node上的代理服務器相比其餘技術實現(如Ruby)的服務器表現要好得多。 此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的, 所以客戶端和服務器端都用同一種語言編寫,這是很是美妙的事情。 *(缺點)Node是一個相對新的開源項目,因此不太穩定,它老是一直在變, 並且缺乏足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。
前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近。 一、實現界面交互 二、提高用戶體驗 三、有了Node.js,前端能夠實現服務端的一些事情 前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好, 參與項目,快速高質量完成實現效果圖,精確到1px; 與團隊成員,UI設計,產品經理的溝通; 作好的頁面結構,頁面重構和用戶體驗; 處理hack,兼容、寫出優美的代碼格式; 針對服務器的優化、擁抱最新前端技術。
(1) 減小http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN託管,data緩存 ,圖片服務器。 (2) 前端模板 JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數 (3) 用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能。 (4) 當須要設置的樣式不少時設置className而不是直接操做style。 (5) 少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。 (6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。 (7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。
100-199 用於指定客戶端應相應的某些動做。 200-299 用於表示請求成功。 300-399 用於已經移動的文件而且常被包含在定位頭信息中指定新的地址信息。 400-499 用於指出客戶端的錯誤。400 一、語義有誤,當前請求沒法被服務器理解。401 當前請求須要用戶驗證 403 服務器已經理解請求,可是拒絕執行它。 500-599 用於支持服務器錯誤。 503 – 服務不可用
詳情:http://segmentfault.com/blog/trigkit4/1190000000691919
分爲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服務器提供資源服務,客戶端開始下載資源。
詳情:從輸入 URL 到瀏覽器接收的過程當中發生了什麼事情?
先期團隊必須肯定好全局樣式(globe.css),編碼模式(utf-8) 等; 編寫習慣必須一致(例如都是採用繼承式的寫法,單樣式都寫成一行); 標註樣式編寫人,各模塊都及時標註(標註關鍵樣式調用的地方); 頁面進行標註(例如 頁面 模塊 開始和結束); CSS跟HTML 分文件夾並行存放,命名都得統一(例如style.css); JS 分文件夾存放 命名以該JS功能爲準的英文翻譯。 圖片採用整合的 images.png png8 格式文件使用 儘可能整合在一塊兒使用方便未來的管理
Node.js、Mongodb、npm、MVVM、MEAN、three.js,React 。 網站:w3cfuns,sf,hacknews,CSDN,慕課,博客園,InfoQ,w3cplus等
1,工廠模式 2,構造函數模式 3,原型模式 4,混合構造函數和原型模式 5,動態原型模式 6,寄生構造函數模式 7,穩妥構造函數模式
1,原型鏈繼承 2,借用構造函數繼承 3,組合繼承(原型+借用構造) 4,原型式繼承 5,寄生式繼承 6,寄生組合式繼承
(1)建立XMLHttpRequest對象,也就是建立一個異步調用對象. (2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息. (3)設置響應HTTP請求狀態變化的函數. (4)發送HTTP請求. (5)獲取異步調用返回的數據. (6)使用JavaScript和DOM實現局部刷新.
詳情:JavaScript學習總結(七)Ajax和Http狀態字
1.異步加載的方案: 動態插入script標籤 2.經過ajax去獲取js代碼,而後經過eval執行 3.script標籤上添加defer或者async屬性 4.建立並插入iframe,讓它異步執行js 5.延遲加載:有些 js 代碼並非頁面初始化的時候就馬上須要的,而稍後的某些狀況才須要的。
(XSS,sql注入,CSRF) CSRF:是跨站請求僞造,很明顯根據剛剛的解釋,他的核心也就是請求僞造,經過僞造身份提交POST和GET請求來進行跨域的攻擊。 **完成CSRF須要兩個步驟:** 1.登錄受信任的網站A,在本地生成COOKIE 2.在不登出A的狀況下,或者本地COOKIE沒有過時的狀況下,訪問危險網站B。
IE6 兩個併發,iE7升級以後的6個併發,以後版本也是6個 Firefox,chrome也是6個
用構造函數和原型鏈的混合模式去實現繼承,避免對象共享能夠參考經典的extend()函數,不少前端框架都有封裝的,就是用一個空函數當作中間變量
YUI Compressor 是一個用來壓縮 JS 和 CSS 文件的工具,採用Java開發。 使用方法: //壓縮JS java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -v src.js > packed.js //壓縮CSS java -jar yuicompressor-2.4.2.jar --type css --charset utf-8 -v src.css > packed.css
詳情請見:你須要掌握的前端代碼性能優化工具
一、Flash ajax對比 Flash適合處理多媒體、矢量圖形、訪問機器;對CSS、處理文本上不足,不容易被搜索。 Ajax對CSS、文本支持很好,支持搜索;多媒體、矢量圖形、機器訪問不足。 共同點:與服務器的無刷新傳遞消息、用戶離線和在線狀態、操做DOM
概念:同源策略是客戶端腳本(尤爲是Javascript
)的重要的安全度量標準。它最先出自Netscape Navigator2.0
,其目的是防止某個文檔或腳本從多個不一樣源裝載。
這裏的同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議。
指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
咱們舉例說明:好比一個黑客程序,他利用Iframe
把真正的銀行登陸頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登陸時,他的頁面就能夠經過Javascript
讀取到你的表單中input
中的內容,這樣用戶名,密碼就輕鬆到手了。
ECMAscript 5
添加了第二種運行模式:"嚴格模式"(strict mode)。顧名思義,這種模式使得Javascript
在更嚴格的條件下運行。
設立"嚴格模式"的目的,主要有如下幾個:
- 消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲; - 消除代碼運行的一些不安全之處,保證代碼運行的安全; - 提升編譯器效率,增長運行速度; - 爲將來新版本的Javascript作好鋪墊。
注:通過測試IE6,7,8,9
均不支持嚴格模式。
缺點:
如今網站的JS
都會進行壓縮,一些文件用了嚴格模式,而另外一些沒有。這時這些原本是嚴格模式的文件,被 merge
後,這個串就到了文件的中間,不只沒有指示嚴格模式,反而在壓縮後浪費了字節。
GET:通常用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,通常在2000個字符 POST:通常用於修改服務器上的資源,對所發送的信息沒有限制。 GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值, 也就是說Get是經過地址欄來傳值,而Post是經過提交表單來傳值。 然而,在如下狀況中,請使用 POST 請求: 沒法使用緩存文件(更新服務器上的文件或數據庫) 向服務器發送大量數據(POST 沒有數據量限制) 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
js的阻塞特性:全部瀏覽器在下載JS
的時候,會阻止一切其餘活動,好比其餘資源的下載,內容的呈現等等。直到JS
下載、解析、執行完畢後纔開始繼續並行下載
其餘資源並呈現內容。爲了提升用戶體驗,新一代瀏覽器都支持並行下載JS
,可是JS
下載仍然會阻塞其它資源的下載(例如.圖片,css文件等)。
因爲瀏覽器爲了防止出現JS
修改DOM
樹,須要從新構建DOM
樹的狀況,因此就會阻塞其餘的下載和呈現。
嵌入JS
會阻塞全部內容的呈現,而外部JS
只會阻塞其後內容的顯示,2種方式都會阻塞其後資源的下載。也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執行。
CSS
怎麼會阻塞加載了?CSS
原本是能夠並行下載的,在什麼狀況下會出現阻塞加載了(在測試觀察中,IE6
下CSS
都是阻塞加載)
當CSS
後面跟着嵌入的JS
的時候,該CSS
就會出現阻塞後面資源下載的狀況。而當把嵌入JS
放到CSS
前面,就不會出現阻塞的狀況了。
根本緣由:由於瀏覽器會維持html
中css
和js
的順序,樣式表必須在嵌入的JS執行前先加載、解析完。而嵌入的JS
會阻塞後面的資源加載,因此就會出現上面CSS
阻塞下載的狀況。
嵌入JS
應該放在什麼位置?
一、放在底部,雖然放在底部照樣會阻塞全部呈現,但不會阻塞資源下載。 二、若是嵌入JS放在head中,請把嵌入JS放在CSS頭部。 三、使用defer(只支持IE) 四、不要在嵌入的JS中調用運行時間較長的函數,若是必定要用,能夠用`setTimeout`來調用
<link>
仍是放在head
中,用以保證在js
加載前,能加載出正常顯示的頁面。<script>
標籤放在</body>
前。成組腳本:因爲每一個<script>
標籤下載時阻塞頁面解析過程,因此限制頁面的<script>
總數也能夠改善性能。適用於內聯腳本和外部腳本。
非阻塞腳本:等頁面完成加載後,再加載js
代碼。也就是,在window.onload
事件發出後開始下載代碼。
(1)defer
屬性:支持IE4和fierfox3.5
更高版本瀏覽器
(2)動態腳本元素:文檔對象模型(DOM)容許你使用js動態建立HTML
的幾乎所有文檔內容。代碼以下:
<script> var script=document.createElement("script"); script.type="text/javascript"; script.src="file.js"; document.getElementsByTagName("head")[0].appendChild(script); </script>
此技術的重點在於:不管在何處啓動下載,文件額下載和運行都不會阻塞其餘頁面處理過程。即便在head裏(除了用於下載文件的http連接)。
詳情請見:詳解js閉包
它的功能是把對應的字符串解析成JS代碼並運行; 應該避免使用eval,不安全,很是耗性能(2次,一次解析成js語句,一次執行)。
// event(事件)工具集,來源:github.com/markyun markyun.Event = { // 頁面加載完成後 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = fn; } else { window.onload = function() { oldonload(); fn(); }; } }, // 視能力分別使用dom0||dom2||IE方式 來綁定事件 // 參數: 操做的元素,事件名稱 ,事件處理程序 addEvent : function(element, type, handler) { if (element.addEventListener) { //事件類型、須要執行的函數、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function() { handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent : function(element, type, handler) { if (element.removeEnentListener) { element.removeEnentListener(type, handler, false); } else if (element.datachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,由於IE不支持事件捕獲) stopPropagation : function(ev) { if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默認行爲 preventDefault : function(event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, // 獲取事件目標 getTarget : function(event) { return event.target || event.srcElement; }, // 獲取event對象的引用,取到事件的全部信息,確保隨時能使用event; getEvent : function(e) { var ev = e || window.event; if (!ev) { var c = this.getEvent.caller; while (c) { ev = c.arguments[0]; if (ev && Event == ev.constructor) { break; } c = c.caller; } } return ev; } };
高併發、聊天、實時消息推送
* 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲null的話,咱們就稱之爲原型鏈。 * 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈。
編寫 CSS、讓頁面結構更合理化,提高用戶體驗,實現良好的頁面效果和提高性能。
html5 websoket WebSocket經過Flash XHR長時間鏈接 XHR Multipart Streaming 不可見的Iframe <script>標籤的長時間鏈接(可跨域)
1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。 2. 事件處理機制:IE是事件冒泡、firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件。; 3. ev.stopPropagation();
詳情請見:JavaScript學習總結(七)Ajax和Http狀態字
1. 經過異步模式,提高了用戶體驗 2. 優化了瀏覽器和服務器之間的傳輸,減小沒必要要的數據往返,減小了帶寬佔用 3. Ajax在客戶端運行,承擔了一部分原本由服務器承擔的工做,減小了大用戶量下的服務器負載。 2. Ajax的最大的特色是什麼。 Ajax能夠實現動態不刷新(局部刷新) readyState屬性 狀態 有5個可取值: 0=未初始化 ,1=啓動 2=發送,3=接收,4=完成 ajax的缺點 一、ajax不支持瀏覽器back按鈕。 二、安全問題 AJAX暴露了與服務器交互的細節。 三、對搜索引擎的支持比較弱。 四、破壞了程序的異常機制。 五、不容易調試。 跨域: jsonp、 iframe、window.name、window.postMessage、服務器上設置代理頁面
function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; //建立一個空的數組 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; }else if (Obj instanceof Object){ buf = {}; //建立一個空對象 for (var k in Obj) { //爲這個對象添加新的屬性 buf[k] = clone(Obj[k]); } return buf; }else{ return Obj; } }
詳情請見:詳解JavaScript模塊化開發
網站重構:在不改變外部行爲的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行爲。也就是說是在不改變UI的狀況下,對網站進行優化,在擴展的同時保持一致的UI。 對於傳統的網站來講重構一般是: 表格(table)佈局改成DIV+CSS 使網站前端兼容於現代瀏覽器(針對於不合規範的CSS、如對IE6有效的) 對於移動平臺的優化 針對於SEO進行優化 深層次的網站重構應該考慮的方面 減小代碼間的耦合 讓代碼保持彈性 嚴格按規範編寫代碼 設計可擴展的API 代替舊有的框架、語言(如VB) 加強用戶體驗 一般來講對於速度的優化也包含在重構中 壓縮JS、CSS、image等前端資源(一般是由服務器來解決) 程序的性能優化(如數據讀寫) 採用CDN來加速資源加載 對於JS DOM的優化 HTTP服務器的文件緩存
<script> function whatBrowser() { document.Browser.Name.value=navigator.appName; document.Browser.Version.value=navigator.appVersion; document.Browser.Code.value=navigator.appCodeName; document.Browser.Agent.value=navigator.userAgent; } </script>
如下是數組去重的三種方法:
Array.prototype.unique1 = function () { var n = []; //一個新的臨時數組 for (var i = 0; i < this.length; i++) //遍歷當前數組 { //若是當前數組的第i已經保存進了臨時數組,那麼跳過, //不然把當前項push到臨時數組裏面 if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; } Array.prototype.unique2 = function() { var n = {},r=[]; //n爲hash表,r爲臨時數組 for(var i = 0; i < this.length; i++) //遍歷當前數組 { if (!n[this[i]]) //若是hash表中沒有當前項 { n[this[i]] = true; //存入hash表 r.push(this[i]); //把當前數組的當前項push到臨時數組裏面 } } return r; } Array.prototype.unique3 = function() { var n = [this[0]]; //結果數組 for(var i = 1; i < this.length; i++) //從第二項開始遍歷 { //若是當前數組的第i項在當前數組中第一次出現的位置不是i, //那麼表示第i項是重複的,忽略掉。不然存入結果數組 if (this.indexOf(this[i]) == i) n.push(this[i]); } return n; }