[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