get請求會主動快取,回退不會再次發請求,post回退會再次發送請求
jQuery解決get請求快取:在 $.ajax({}) 中加個選項(cache: false),
原理是 在GET請求參數中附加時間戳"_={timestamp}"
[外連圖片轉存失敗,源站可能有防盜鏈機制 機製,建議將圖片儲存下來直接上傳(img-gqvIYePF-1597285859537)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20191121105135054.png)]
css3僞類選擇器
:first-child,:last-child,:nth-child(n),:hover,:link,:target 等
css選擇器優先順序
!important > 行內樣式>ID選擇器 > 類選擇器 > 標籤 > 萬用字元 > 繼承 > 瀏覽器預設屬性
@import 和 link 引入樣式的區別
閉包可以讓你從內部函數存取外部函數作用域(必須要返回這個函數或物件)
function fn1(){
var a = 1;
return function(){
console.log(a+1)
}
}
fn1();
https協定需要到 CA(Certificate Authority,證書頒發機構)申請證書,一般免費證書較少,因而需要一定費用。(原來網易官網是http,而網易郵箱是https。)
http是超文字傳輸協定,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協定。
http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
http的連線很簡單,是無狀態的。Https協定是由SSL+Http協定構建的可進行加密傳輸、身份認證的網路協定,比http協定安全。(無狀態的意思是其數據包的發送、傳輸和接收都是相互獨立的。無連線的意思是指通訊雙方都不長久的維持對方的任何資訊。)
閉包
意外的全域性變數:未宣告的全域性變數
定時器:定時器未被及時回收,會造成記憶體漏失
如果在mounted/created 勾點中使用了$on
,需要在beforeDestroy 中做對應解綁($off)處理
給DOM物件新增的屬性是一個物件的參照
var testObject = {};
// 如果DOM不被消除,則testObject會一直存在,造成記憶體漏失
document.getElementById('idname').property = testObject;
// 解決方法:在window.onunload事件中寫上:
window.onunload=function(){
//釋放記憶體
document.getElementById('idname').property = null;
};
五個選項:state,mutations,actions,getters,modules
state:
注意:
Vuex 優勢:相比本地儲存,儲存數據更安全,本地儲存可以在控制檯被看到。
Vuex 劣勢:在重新整理頁面後,vuex會重新更新state,所以,儲存的數據會丟失。
解決Vuex 儲存數據丟失問題:
created(){
//在頁面重新整理時將vuex裡的資訊儲存到localStorage裡
window.addEventListener("beforeunload",()=>{
localStorage.setItem("messageStore",JSON.stringify(this.$store.state))
})
//在頁面載入時讀取localStorage裡的狀態資訊
localStorage.getItem("messageStore") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("messageStore"))));
}
使用vuex-persistedstate 外掛
// 安裝外掛:
npm install vuex-persistedstate --save
在store的index.js中,手動引入外掛並設定
import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
// ...
plugins: [createPersistedState()]
})
該外掛預設持久化所有state,當然也可以指定需要持久化的state:
import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
// ...
plugins: [createPersistedState({
storage: window.sessionStorage,
reducer(data) {
return {
// 設定只儲存state中的myData
myData: data.myData
}
}
})]
}
完整寫法: Array.prototype.forEach.call(…)
[] 是爲了使用陣列的方法, [].forEach.call() 是一種快速的方法存取 forEach ,並將空陣列的 this 換成想要遍歷的list。
[].forEach.call(['a', 'b', 'c','d'], function (item, i, arr) {
console.log(i + ': '+item);
});
// 輸出
// 0: a
// 1: b
// 2: c
// 3: d
// 上面的例子就是將空陣列的 this 換成了 陣列 ['a', 'b', 'c','d'] 的 this
使用 jsencrypt.js ,官網: http://travistidwell.com/jsencrypt/
npm install jsencrypt
裝好後在vue檔案裡參照
import JSEncrypt from 'jsencrypt/bin/jsencrypt
for of :不能遍歷物件
let obj = {
name: "張三",
sex: "男",
age: 20,
height: 150
}
for (let key of Object.keys(obj)) {
console.log(key)
}
// 輸出
// name
// sex
// age
// height
for in
let obj = {
name: "張三",
sex: "男",
age: 20,
height: 150
}
for (let key in Object.keys(obj)) {
console.log(key)
}
// 輸出
// 0
// 1
// 2
// 3
Object.keys():回圈物件中的屬性,存入一個數組中
let obj = {
name:"張三",
sex:"男",
age:20,
height:150
}
for ( let key in Object.keys(obj)){
console.log(key)
}
// name
// sex
// age
// height
Object.value():回圈物件中屬性值
let obj = {
name:"張三",
sex:"男",
age:20,
height:150
}
for ( let val of Object.values(obj)){
console.log(val)
}
// 張三
// 男
// 20
// 150
Object. entries ():回圈物件的某一項
let obj = {
name:"張三",
sex:"男",
age:20,
height:150
}
for ( let val of Object.entries(obj)){
console.log(val)
}
// ["name", "張三"]
// ["sex", "男"]
// ["age", 20]
// ["height", 150]
Object. entries ():回圈某一項(拆開)
let obj = {
name:"張三",
sex:"男",
age:20,
height:150
}
for ( let [key,val] of Object.entries(obj)){
console.log(key,val)
}
// name 張三
// sex 男
// age 20
// height 150
迴流: 迴流(reflow)是更明顯的一種改變,可以理解爲渲染樹需要重新計算。
重繪: 重繪(repaints)是一個元素外觀的改變所觸發的瀏覽器行爲,
例如:改變vidibility、outline、背景色等屬性。瀏覽器會根據元素的新屬性重新繪製,使元素呈現新的外觀。重繪不會帶來重新佈局,並不一定伴隨迴流。
重構:頁面佈局重新載入
先看一段程式碼
//app.use(function(req,res){
// console.log('如果執行我,所有的http請求都會被我中斷,因爲我沒有next');
//})
app.use(function(req,res,next){
console.log('');
res.send('我執行後,下面 下麪的請求還會繼續');
next();
});
app.get('/add',function(req,res){
console.log('get add');
res.send('我輸出的響應將會被忽略,因爲我之前的中介軟體已經有發送過響應');
})
所謂中介軟體其實也是一個路由,是一個可以處理所有 http 請求的路由
1.路由處理器app.get/app.post這些一般被統稱爲app.VERB,可以被當作是隻處理特定http謂詞(GET,POST等)的中介軟體,而use中介軟體可以當作可以處理全部http請求的路由處理器。
2.路由處理器第一個參數必須是路徑,如果要讓一個路由匹配所有的路徑,可以用 /* .
中介軟體也可以用路徑作爲第一個參數,而它是可選的,如果忽略了這個參數,它就會匹配所有的路徑。
3.路由處理器和中介軟體參數都有回撥,回撥有2個參數時,是(req,res);回撥有3個參數時,是(req,res,next);有4個參數時,是(err,req,res,next);
4.next。如果在中介軟體回撥中呼叫了next(); 程式就會繼續匹配下一個合適的路由處理器,如果你沒有在中介軟體呼叫next()的話,中介軟體在處理完之後就會被終止,不會繼續匹配相應的路由處理器,這時應該要發送響應到用戶端,否則用戶端會被掛起最終超時。
5.如果在中介軟體回撥中呼叫了next();就不宜發送響應到用戶端了,因爲你發送了響應,之後的中介軟體或者路由器還會繼續匹配執行,但是它們發送的任何響應都會被忽略。
IE都能識別*
;標準瀏覽器(如FF)不能識別*
;IE6能識別*
;不能識別 !important
;IE7能識別*
,能識別!important
;FF不能識別*
,但能識別!important
;
瀏覽器優先級別:
FF<IE7<IE6,CSS hack
書寫順序一般爲FF IE7 IE6
屬性級Hack:比如IE6能識別下劃線「_
」和星號「*
」,IE7能識別星號「*
」,但不能識別下劃線」_
」,而firefox兩個都不能認識。
選擇符級Hack:比如IE6能識別*html .class{}
,IE7能識別*+html .class{}
或 *:first-child+html .class{}
。
區別不同瀏覽器:
/* 區別IE6與FF:*/
background:orange;
*background:blue;
/* 區別IE6與IE7:*/
background:green!important;
background:blue;
/* 區別IE7與FF:*/
background:orange;
*background:green;
/* 區別FF,IE7,IE6:*/
background:orange; *background:green; _background:blue;
background:orange; *background:green!important; *background:blue;
ajax:
$.ajax({
type: 'POST',
url: url,
data: data,
dataType: dataType,
success: function () {},
error: function () {}
});
axios:
axios({
method: 'post',
url: url,
data: data
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
ajax 優缺點:
優點:
1、 最大的優點就是頁面無需重新整理
2、 使用非同步的方式與伺服器通訊,不需要中斷操作。
缺點:
1、 ajax幹掉了Back和History功能,即對瀏覽器機制 機製的破壞
2、 對搜尋引擎的支援比較弱。如果使用不當,AJAX會增大網路數據的流量,從而降低整個系統的效能。
3、 不經意間會暴露比以前更多的數據和伺服器邏輯, ajax的邏輯可以對用戶端的安全掃描技術隱藏起來,允許駭客從遠端伺服器上建立新的攻擊,還有 跨站點腳步攻擊、SQL隱碼攻擊和基於credentials的安全漏洞等。
[外連圖片轉存失敗,源站可能有防盜鏈機制 機製,建議將圖片儲存下來直接上傳(img-R3cq2yB3-1597285859540)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20191127194133210.png)]
[外連圖片轉存失敗,源站可能有防盜鏈機制 機製,建議將圖片儲存下來直接上傳(img-WPVYGs8U-1597285859541)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20191127194303235.png)]
Request Method:OPTIONS ,這是瀏覽器的預檢,只有預檢通過了,才能 纔能從後臺拿到數據
其實跨域分爲 簡單跨域請求
和 複雜跨域請求
簡單跨域請求
簡單跨域請求是不會發送options請求的
複雜跨域請求, 要滿足以下:
1、請求方法不是 GET/HEAD/POST
2、POST請求的Content-Type並非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
3、請求設定了自定義的header欄位
如果不想發送option請求可以改爲簡單請求 比如你的Content-Type可能是application/json格式 將其改爲application/x-www-form-urlencoded
解決:
例如,在 vue.config.js 檔案中設定如下:
module.exports = {
lintOnSave: true,
devServer: {
proxy: {
'/api': {
target: 'http://t.api.idangjian.cn', // 代理介面
changeOrigin: true,
pathRewrite: {
'^/api': '/user/login' // 代理的路徑
}
}
}
}
}
<img src="[object Module]">
base64
格式編碼的圖片;元件
實現;繼續補充中。。。