[toc]
### 1.什么是跨域
瀏覽器出于安全考慮,具有同源策略,當協議域名端口號有一個不同時就會出現跨域,數據請求就會被攔截
### 2.如何解決跨域
#### 1.JSONP
原理:
1. 因為script標簽不會受到跨域限制,通過script標簽指向一個需要訪問的地址,并提供回調函數來接受數據來進行通信
2. 僅限于 get 請求,在工作中比如請求高德地圖cdn,和echarts就是這種方式
```js
<script src="http://domain/api?param1=a¶m2=b&callback=jsonp">
</script>
<script>
function jsonp(data) {
console.log(data)
}
</script>
```
3. JSONP封裝
```js
export function jsonp(url) {
if (!url) {
console.error("Axios.JSONP 至少需要一個url參數!")
return
}
return new Promise((resolve, reject) => {
window.jsonCallBackJsonp = (result) => {
resolve(result)
}
var JSONP = document.createElement("script")
JSONP.type = "text/javascript"
JSONP.src = `${url}&callback=jsonCallBackJsonp`
document.getElementsByTagName("head")[0].appendChild(JSONP)
setTimeout(() => {
// document.getElementsByTagName("head")[0].removeChild(JSONP)
}, 500)
})
}
```
#### 2.vue.config.js 中的 proxy 代理
原理:
```
1.將域名發送給本地服務器 localhost:8080
2.再由本地服務器去請求真正的服務器
3.因為請求是從服務端發出的,所以就不存在跨域的問題
```
配置:
```js
module.exports = {
devServer: {
// 跨域
proxy: {
'/api': { // 表示攔截以/api開頭的請求路徑
// 目標路徑
target: 'http://www.bilibili.com/',
// 允許跨域
changeOrigin: true,
// 重寫路徑以 /api 開頭的為 ''
pathRewrite: {
'^/api': ''
}
}
}
}
}
axios.get('api/getList').then(res => {})
```
#### 3.cors
需要后端配置 Access-Control-Allow-Origin,或者使用一個cors插件
#### 4.postMessage
postMessage是用于嵌入頁面的第三方頁面數據,比如說iframe,一個頁面發送消息,另一個頁面判斷并接收消息
+ 一個頁面通過postMessage發送message到指定的url
+ 另一個頁面 new一個MessageChannel對象,并且監聽這個對象,當它的origin等于目標url時,執行相應的動作
```js
// 發送消息端
window.parent.postMessage('message', 'http://test.com');
// 接收消息端
var mc = new MessageChannel();
mc.addEventListener('message', (event) => {
var origin = event.origin || event.originalEvent.origin;
if (origin === 'http://test.com') {
console.log('驗證通過')
}
});
```
- JavaScript
- 1.數組
- 1.數組Api
- 2.判斷是否為數組
- 3.手寫forEach, map, filter, every, some, reduce
- 4.類數組轉化為數組
- 5.reduce實現compose函數
- 7.sort實現與排序
- 2.類型
- 1. let, const, var
- 1. Number 數字
- 3. Boolean 布爾值
- 4. undefined和null
- 2. String 字符串
- 1. 字符串方法
- 2. 操作字符串實例
- 3. startWith&字符串模板
- 5. 類型轉換
- 4.深拷貝與淺拷貝
- 7.Symbol類型
- typeof 和 instanceof
- Set
- Map
- 3.this,原型,原型鏈
- 1.this
- 2.手寫call, apply, bind
- 3.模擬new操作符
- 4.手寫Object.create
- 4.對象
- proxy代理
- defineProperty數據劫持
- 4.模塊化
- 5.http
- ECMAScript
- 0. 調試&兼容性&錯誤處理
- 3. 運算
- 4. 對象(三種引用類型&正則)
- 1. 數組
- 1. 數組的六種遍歷方法
- 2. 數組的增刪查改
- 3. 操作數組(展開、join、排序...)
- 4. 補充五種ES6方法
- 2. 函數
- 3. JSON
- 4. 正則
- 附:正則表達式特殊字符
- 5. 面向對象
- es6的繼承
- 6. 控制語句
- 7. ajax
- 8. promise
- 9. 閉包
- 1. 閉包產生三個相同隨機數
- 2. 閉包實現點贊
- 10.箭頭函數
- _isEmpty
- Object.assign(target, obj, obj)
- Math.ceil, round,
- DOM
- 3.1 節點
- 3.2 DOM操作元素
- 3.3 fragment DOM碎片
- 5. 事件
- BOM
- 1. window
- 2. navigation檢測訪問類型
- 3. screen窗口大小內容大小
- 4. history
- promise
- 1.promise使用
- 2.手寫promise
- 3.手寫promise.all
- 生成器generator
- 1.generator的使用
- 2.簡單實現generator
- 手寫async await
- async/await
- 5.防抖節流
- 難點深入
- 1. 瀏覽器&js特點
- 2. JS堆棧與深淺拷貝
- 3. 詳解a++和++a的區別
- 4. JS&jQuery獲取元素的方法
- 5. NodeList和HTMLCollection區別
- 6. var與let的區別
- 7. this 與 bind call apply
- 8. get與post請求的區別
- 9. 閉包
- Dom demo
- 1. JQuery--頁面點擊切換效果
- 2. JQuery-load實現頭尾封裝
- 3. JS--添加移除屬性名
- 4. jQuery--eq()與index()
- 5. table隔行變色
- 6. 改變函數this的指向
- 7. jQuery each遍歷
- ECMAScript demo
- 1. 斐波那契數列
- 2. 數組去重
- 3. 自調用函數生成隨機數
- 瀏覽器、DOM
- 1.從輸入url到頁面加載的全過程
- 2.http與https
- 3.v8垃圾回收機制
- 4.dom事件
- 5.跨域
- 6.強緩存和協商緩存
- 3.eventloop,宏任務和微任務
- 1.什么是任務
- 2.執行順序例題
- 3.執行順序例題,添加script
- 4.執行順序,多個宏任務
- 4.HTTP
- 1.經典五層模型
- 2.http發展歷史
- 3.http三次握手
- 4.URI,URL,URN
- 1.http協議
- 2.https
- http狀態碼
- 5.script標簽defer和async區別
- cookie
- connect: keep-alive