一、浮動佈局(佈局簡單,兼容性好,可是浮動元素脫離文檔流)javascript
二、絕對定位佈局(佈局快速,元素脫離文檔流)css
三、彈性盒子佈局(自應性好,兼容性差)html
四、多列布局(寬度自適應)前端
五、table佈局(兼容性好)java
好比:header footer nav section article aside dialoggit
<audio controls>
<source src="horse.ogg" type="audio/ogg">
<source src="horse.mp3" type="audio/mpeg">
您的瀏覽器不支持 audio 元素。
</audio>
複製代碼
<video width="320" height="240" controls>
<source src="movie.mp4" type="video/mp4">
<source src="movie.ogg" type="video/ogg">
您的瀏覽器不支持Video標籤。
</video>
複製代碼
canvas標籤訂義圖形,好比圖表和其餘圖像,您必須使用腳原本繪製圖形web
HTML5 Geolocation API 用於得到用戶的地理位置,鑑於該特性可能侵犯用戶的隱私,除非用戶贊成,不然用戶位置信息是不可用的正則表達式
window.navigator.geolocation {
getCurrentPosition: fn 用於獲取當前的位置數據
watchPosition: fn 監視用戶位置的改變
clearWatch: fn 清除定位監視
} 
複製代碼
navigator.geolocation.getCurrentPosition(
function(pos){
console.log('用戶定位數據獲取成功')
console.log('定位時間:',pos.timestamp)
console.log('經度:',pos.coords.longitude)
console.log('緯度:',pos.coords.latitude)
console.log('海拔:',pos.coords.altitude)
console.log('速度:',pos.coords.speed)
}, //定位成功的回調
function(err){
console.log('用戶定位數據獲取失敗')
} //定位失敗的回調
)
複製代碼
拖放是一種常見的特性,即抓取對象之後拖到另外一個位置,在 HTML5 中,拖放是標準的一部分,任何元素都可以拖放算法
使用HTML5能夠在本地存儲用戶的瀏覽數據。早些時候,本地存儲使用的是cookies。可是Web 存儲須要更加的安全與快速. 這些數據不會被保存在服務器上,可是這些數據只用於用戶請求網站數據上.它也能夠存儲大量的數據,而不影響網站的性能。數據以 鍵/值 對存在, web網頁的數據只容許該網頁訪問使用。數據庫
客戶端存儲數據的兩個對象爲:
localStorage - 沒有時間限制的數據存儲 sessionStorage - 針對一個 session 的數據存儲, 當用戶關閉瀏覽器窗口後,數據會被刪除。
無論是 localStorage,仍是 sessionStorage,可以使用的API都相同,經常使用的有以下幾個(以localStorage爲例):
保存數據:localStorage.setItem(key,value);
讀取數據:localStorage.getItem(key);
刪除單個數據:localStorage.removeItem(key);
刪除全部數據:localStorage.clear();
獲得某個索引的key:localStorage.key(index);
WebSocket 是 HTML5 開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議。
WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,容許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只須要完成一次握手,二者之間就直接能夠建立持久性的鏈接,並進行雙向數據傳輸。
在 WebSocket API 中,瀏覽器和服務器只須要作一個握手的動做,而後,瀏覽器和服務器之間就造成了一條快速通道。二者之間就直接能夠數據互相傳送
當在 HTML 頁面中執行腳本時,頁面的狀態是不可響應的,直到腳本已完成。 web worker 是運行在後臺的 JavaScript,獨立於其餘腳本,不會影響頁面的性能。您能夠繼續作任何願意作的事情:點擊、選取內容等等,而此時 web worker 在後臺運行
dragstart:事件主體是被拖放元素,在開始拖放被拖放元素時觸發,。
darg:事件主體是被拖放元素,在正在拖放被拖放元素時觸發。
dragenter:事件主體是目標元素,在被拖放元素進入某元素時觸發。
dragover:事件主體是目標元素,在被拖放在某元素內移動時觸發。
dragleave:事件主體是目標元素,在被拖放元素移出目標元素是觸發。
drop:事件主體是目標元素,在目標元素徹底接受被拖放元素時觸發。
dragend:事件主體是被拖放元素,在整個拖放操做結束時觸發
css盒子的四個組成區域相對應,每一個盒子有四個邊界:內容邊界 Content edge、內邊距邊界 Padding Edge、邊框邊界 Border Edge、外邊框邊界 Margin Edge。
css盒模型分爲兩種兩種標準:一種是標準模型,一種是IE模型
從上圖中發現,標準盒模型的寬高就是內容(content)的寬高,而IE盒模型的寬高則是由內容(content)+內邊距(padding)+邊框(border)的寬高的總和。
事件流描述的是從頁面中接受事件的順序,事件流分爲冒泡流和捕獲流
###事件冒泡
IE事件流叫作事件冒泡,就是事件開始是由最具體的元素(目標元素)接收,而後逐級向上傳播到較爲不具體的節點(文檔),如圖所示
事件捕獲是從Document接收到事件,而後逐級向下傳播到目標元素,如圖所示
在觸發DOM上的某個事件時,會產生一個事件對象event,這個對象中包含着全部與事件有關的信息,好比事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。
下圖是事件對象經常使用的屬性方法
事件委託是利用事件冒泡,只指定一個事件處理程序來管理某一類型的全部事件。
優勢:減小事件註冊,節省內存、簡化了dom節點更新時,相應事件的更新。 缺點:事件委託基於冒泡,對於不冒泡的事件不支持
http:超文本傳輸協議,用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。 https:是以安全爲目標的HTTP通道,即HTTP下加入SSL層,HTTPS的安全基礎是SSL。
區別
客戶端在使用HTTPS方式與Web服務器通訊時有如下幾個步驟:
http報文由請求報文和響應報文組成
http常見的狀態碼
//第一種方式:字面量
var o1 = {name: 'o1'};
var o2 = new Object({name: 'o2'});
//第二種方式:經過構造函數
var M = function (name) {
this.name = name;
};
var o3 = new M('o3');
//第三種方式:Object.create
var p = {name: 'p'};
var o4 = Object.create(p);
複製代碼
每一個函數被建立的時候都會有一個prototye屬性,這個屬性會指向函數的原型對象。默認狀況下每一個原型對象又都會獲取一個constructor屬性,這個屬性包含一個指向prototype屬性所在函數的指針(指向構造函數)
//建立構造函數
function Person (name) {
this.name = name;
}
//在Person函數的原型對象上增長一個方法
Person.prototype.sayName = function (){
console.log(this.name)
}
//Person的原型對象中的constructor屬性指向Person函數
Person.prototype.constructor===Person //true
//建立child實例
var child = new Person ('xiaoming');
child.sayName() //xiaoming
複製代碼
function Foo1(){
this.name1 = '1';
}
function Foo2(){
this.name2 = '2';
}
Foo2.prototype = new Foo1();
function Foo3(){
this.name3 = '3';
}
Foo3.prototype = new Foo2();
var foo3 = new Foo3();
console.dir(foo3)
console.dir(foo3.name1); //1
3個函數經過__proto__連接起來造成原型鏈,繼承就是經過這個原理來的
複製代碼
instanceof 原理:檢查左邊對象與右邊對象是否在同一條原型鏈上。
constructor原理:取對象的proto屬性指向的prototype對象上的constructor字段。
var myNew = function (func) {
var o = Object.create(func.prototype)
var i = func.call(o)
return typeof i === 'object' ? i : o
}
複製代碼
js要實現繼承,咱們須要一個父類,代碼以下:
// 定義一個動物類
function Animal (name) {
// 屬性
this.name = name || 'Animal';
// 實例方法
this.sleep = function(){
console.log(this.name + '正在睡覺!');
}
}
// 原型方法
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃:' + food);
};
複製代碼
核心:將父類的實例做爲子類的原型
function Cat(){
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';
// Test Code
var cat = new Cat();
console.log(cat.name); //cat
console.log(cat.eat('fish')); //cat正在吃:fish
console.log(cat.sleep()); //cat正在睡覺!
console.log(cat instanceof Animal); //true
console.log(cat instanceof Cat); //true
複製代碼
特色:
缺點:
核心:就是子類構造函數內部調用父類構造函數(使用call或者apply方法)
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
// Test Code
var cat = new Cat();
console.log(cat.name); //Tom
console.log(cat.sleep()); //Tom正在睡覺
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
複製代碼
特色:
缺點:
核心:經過原型鏈實現對原型屬性和方法的繼承,經過構造函數來實現對實例屬性的繼承。
function Cat(name){
Animal.call(this); //第一次調用父類
this.name = name || 'Tom';
}
Cat.prototype = new Animal(); //第二次調用父類
//改變構造函數的指向
Cat.prototype.constructor = Cat;
// Test Code
var cat = new Cat();
console.log(cat.name); //Tom
console.log(cat.sleep());//Tom正在睡覺!
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true
複製代碼
特色:
缺點:
核心:經過寄生方式,砍掉父類的實例屬性
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 建立一個沒有實例方法的類
var Super = function(){};
Super.prototype = Animal.prototype;
//將實例做爲子類的原型
Cat.prototype = new Super();
})();
// Test Code
var cat = new Cat();
console.log(cat.name); //Tom
console.log(cat.sleep()); //Tom正在睡覺!
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true
複製代碼
特色:
閉包就是可以讀取其餘函數內部變量的函數,或者子函數在外調用,子函數所在的父函數的做用域不會被釋放
JS中的this不是指向定義他的位置,而是在哪調用它它就指向哪裏,箭頭函數中的 this 是依賴於所在函數的上下文的,相似於繼承的關係。
同源策略限制從一個源加載的文檔或腳步如何與來自另外一個源的資源進行交互(協議、域名、端口這3個構成一個源)。這是一個用於隔離潛在惡意文件的關鍵的安全機制
限制的內容
原理:利用script標籤的異步加載來實現的,script標籤src屬性中的連接能夠訪問跨域的js腳本,利用這個特性,服務端再也不返回JSON格式的數據,而是返回一段調用某個函數的js代碼,在src中進行了調用,這樣實現了跨域。
舉個例子:
function test(data){
//打印後端傳過來的數據
console.log(data) //data爲{a:1,b:2}
}
var url="http://www.x.com/test?callback=test"//向x.com/test告訴他要調用的函數名是「test」
//後臺攔截到callback,知道要生成一個調用方法,方法名是test,並傳遞參數,後臺處理生成以下(數據虛構)
test({a:1,b:2})
//而後前端經過script標籤去訪問並執行,上面的東西
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script標籤加入head,此時調用開始
document.getElementsByTagName('head')[0].appendChild(script);
//而後就會調用頁面的test方法,這就是jsonp的實現原理。
複製代碼
把js封裝成一個通用組件
function myjsonp(URL,callback,callbackname){
//給系統中建立一個全局變量,叫作callbackname,指向callback函數
//定義
window[callbackname] = callback;
//建立一個script節點
var oscript = document.createElement("script");
//和image不同,設置src並不會發出HTTP請求
oscript.src = URL;
oscript.type = "text/javascript";
//script標籤的請求是在上樹的時候發出,請求的是一個函數的執行語句
document.head.appendChild(oscript);
//爲了避免污染頁面,瞬間把script拿掉
document.head.removeChild(oscript);
}
//使用
myjsonp("http://sclub.jd.com/productpage/p-1217508-s-0-t-3-p-1.html?callback=abcdefg",function(data){
console.log(data);
},"abcdefg");
複製代碼
原理:原理是利用location.hash來進行傳值。
//利用hash,場景是當前頁面A經過iframe或frame嵌入了跨域的頁面B
//在A中的僞代碼以下:
var B = document.getElementsByTagName('iframe');
B.src = B.src + '#' + 'data';
//在B中的僞代碼以下:
//onhashchange事件是用來監聽當前頁面的hash有沒有改變
window.onhashchange = function () {
var data = window.location.hash;
}
複製代碼
舉例來講,父窗口http://a.com向子窗口http://b.com發消息,調用postMessage方法就能夠了
a頁面
<iframe id="frame1" src="http://127.0.0.1/JSONP/b.html" frameborder="1"></iframe>
document.getElementById('frame1').onload = function(){
//contentWindow返回的是iframe的window對象,因此後面能夠接着調用document方法
var win = document.getElementById('frame1').contentWindow;
win.postMessage("我是來自a頁面的","http://127.0.0.1/JSONP/b.html")
}
複製代碼
b頁面
window.onmessage = function(e){
e = e || event;
console.log(e.data);//我是來自a頁面的數據
console.log(e.source);//發送消息的窗口對象
console.log(e.origin);//發送消息窗口的源
}
複製代碼
WebSocket protocol是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通訊,同時容許跨域通信,是server push技術的一種很好的實現
整個CORS通訊過程,都是瀏覽器自動完成,不須要用戶參與。對於開發者來講,CORS通訊與同源的AJAX通訊沒有差異,代碼徹底同樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感受。
所以,實現CORS通訊的關鍵是服務器。只要服務器實現了CORS接口,就能夠跨源通訊。
參考資料:www.ruanyifeng.com/blog/2016/0…
CSRF,即(Cross-site request forgery), 中文名爲跨站請求僞造。是一種挾持用戶在當前已登陸的Web應用程序上執行非本意的操做的一種攻擊方式。
舉個例子:當用戶經過身份認證登陸了網站A,這時候網站A的cookie會保存在瀏覽器中,而後用戶又訪問了網站B,這時候網站B會有一個引誘點擊,這個引誘點擊每每是個連接,這個連接指向的就是網站A的API接口,由於瀏覽器會自動上傳cookie,當網站A對身份從新確認發現是合法用戶,因此就執行這個接口的動做。
綜上所訴:要完成一個CSFR攻擊,受害者必須依次完成兩個步驟
Token驗證:CSRF原理中訪問漏洞接口的時候瀏覽器只上傳了cookie,沒有手動的上傳一個token。這個token是用戶登陸註冊甚至只是訪問網站A,服務器會自動向用戶本地存儲一個token,在用戶訪問各個接口的時候,若是沒帶這個token,服務器就不會經過驗證。因此當用戶點擊引誘連接,這個連接只會自動攜帶cookie,可是不會自動攜帶token
Referer驗證 (Referer指的是頁面來源):服務器經過判斷頁面來源是否是本身站點的頁面來源,若是是就執行接口動做,若是不是一概攔截。
XSS就是跨域腳本攻擊
反射型:發出請求時,XSS代碼出如今URL中,做爲輸入提交到服務器端,服務器端解析後響應,XSS代碼隨響應代碼一塊兒傳給瀏覽器,最後瀏覽器解析執行XSS代碼。整個過程像一次反射,故叫反射型XSS
儲存型:也叫持久型XSS,主要是將XSS代碼發送到服務器(無論是數據庫、內存仍是文件系統等。),而後在下次請求頁面的時候就不用帶上XSS代碼了
###一、快速排序
原理:
var quickSort = function(arr) {
//若是數組長度小於等於1無需判斷直接返回便可
if (arr.length <= 1){ return arr; }
var pivotIndex = Math.floor(arr.length / 2);
//取基準點的值,splice(index,1)函數能夠返回數組中被刪除的那個數
var pivot = arr.splice(pivotIndex, 1)[0];
console.log(pivot)
var left = [];
var right = [];
for(var i = 0; i < arr.length; i++){
if (arr[i] < pivot){
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
//遞歸執行以上操做,對左右兩個數組進行操做,直到數組長度爲<=1;
return quickSort(left).concat([pivot], quickSort(right));
}
複製代碼
原理:
1.比較相鄰的兩個元素,若是前一個比後一個大,則交換位置。
2.第一輪的時候最後一個元素應該是最大的一個。
3.按照步驟一的方法進行相鄰兩個元素的比較,這個時候因爲最後一個元素已是最大的了,因此最後一個元素不用比較
function bSort(arr) {
var len = arr.length;
for (var i = 0; i < len-1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
// 相鄰元素兩兩對比,元素交換,大的元素交換到後面
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
//舉個數組
myArr = [20,18,27,19,35];
//使用函數
bSort(myArr)//[18,19,20,27,35]
複製代碼
原理:
function selectSort (arr) {
var len = arr.length;
var temp;
for(var i=0; i<len-1; i++){
for(var j=i+1; j<len; j++){
if(arr[i]>arr[j]){
//互換位置
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
var oldArr = [3,9,4,5,2,8];
selectSort(oldArr); //[2, 3, 4, 5, 8, 9]
複製代碼
概念:簡單地說就是同一時間只能作一件事,當有多個任務時,只能按照一個順序一個完成了再執行下一個
任務隊列能夠分紅兩種,一種是同步任務(synchronous),另外一種是異步任務(asynchronous)。同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有"任務隊列"通知主線程,某個異步任務能夠執行了,該任務纔會進入主線程執行。
舉個例子:
console.log(1) //這個是同步任務,放入主線程裏
setTimeout(function(){ //這個是異步任務,放入任務隊列中,等同步任務執行完畢,才能執行
console.log(2)
},0)
console.log(3) //這個是同步任務,在主線程裏
//運行結果是132
複製代碼
主線程從任務隊列中讀取事件,這個過程是循環不斷的,因此整個的這種運行機制又稱爲Event Loop(事件循環)
異步任務的執行順序準確的劃分方式是:
舉個例子:
setTimeout(function(){
console.log('定時器開始啦')
});
new Promise(function(resolve){
console.log('立刻執行for循環啦');
for(var i = 0; i < 10000; i++){
i == 99 && resolve();
}
}).then(function(){
console.log('執行then函數啦')
});
console.log('代碼執行結束');
//執行結果是:立刻執行for循環啦 > 代碼執行結束 > 執行then函數啦 > 定時器開始啦
//執行原理是:
首先執行script下的宏任務,遇到setTimeout,將其放到宏任務的【隊列】裏
遇到 new Promise直接執行,打印"立刻執行for循環啦"(Promise函數體裏面是同步任務)
遇到then方法,是微任務,將其放到微任務的【隊列裏】
打印 "代碼執行結束"
本輪宏任務執行完畢,查看本輪的微任務,發現有一個then方法裏的函數, 打印"執行then函數啦"
到此,本輪的event loop 所有完成。
下一輪的循環裏,先執行一個宏任務,發現宏任務的【隊列】裏有一個 setTimeout裏的函數,執行打印"定時器開始啦"
複製代碼
提高頁面性能的方法有哪些?
一、異步加載的方式
二、異步加載的區別
瀏覽器緩存:「分爲強制緩存和協商緩存」,當客戶端向瀏覽器發送請求的時候,若是沒有緩存則直接請求服務器。若是有則根據緩存狀態來是否從緩存中獲取對應的文件
做用:
利用Expires和Cache-Control兩個字段來控制
expires:是緩存過時時間(即資源過時時間),是個絕對值。因此若是客戶端更改時間,會致使緩存混亂。因此http:1.1增長了cache-control:max-age 字段,它是一個相對的時間
Cache-Control與Expires能夠在服務端配置同時啓用,同時啓用的時候Cache-Control優先級高。
Control:max-age=3600,表明着資源的有效期是3600秒
協商緩存涉及到兩組header 字段。
Etag和If-None-Match
Last-Modified和If-Modified-Since
複製代碼
Etag和If-None-Match
他們返回的是一個校驗碼,是個hash值。Etag可以保證資源都是惟一的,是客戶端請求服務器的時候服務器返回的。若是資源變化了Etag也會發生變化。當再次請求服務器的時候服務器根據瀏覽器上送的If-None-Match(以前服務器返回的etag值)值來判斷是否命中緩存。
Last-Modified和If-Modified-Since
瀏覽器第一次請求一個資源的時候,服務器返回的header中會加上Last-Modify,Last-modify是一個時間標識該資源的最後修改時間,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。
當瀏覽器再次請求該資源時,request的請求頭中會包含If-Modify-Since,該值爲緩存以前返回的Last-Modify。服務器收到If-Modify-Since後,根據資源的最後修改時間判斷是否命中緩存。
若是命中緩存,則返回304,而且不會返回資源內容,而且不會返回Last-Modify。
Last-Modified與ETag是能夠一塊兒使用的,服務器會優先驗證ETag,一致的狀況下,纔會繼續比對Last-Modified,最後才決定是否返回304。