function receiveMessage(event) {
console.log(‘event’, event)
}
window.addEventListener(“message”, receiveMessage, false);
postMessage
复制代码
我就直接说一下大概的思路了: 首先看看B页面:
-
在B页面有一个按钮,点击这个按钮会触发一个方法,post()
-
在post()方法中,window.postMessage(“hi there!”, location.origin),发送到所有同源的窗口,注意,当前窗口也会收到
-
之后通过 window.addEventListener(“message”, receiveMessage, false)去监听,如果有数据,就执行receiveMessage(),把数据打印出来
再来看A页面:
-
在A页面也有一个按钮,当点击这个按钮时触发test()
-
打开新窗口,并建立窗口的引用变量op = window.open(‘B.html’, ‘_blank’);
-
op.addEventListener(“message”, receiveMessage, false); 监听新开窗口发来的消息,通过 receiveMessage() 把数据打印出来
3.2.2、如何正确的使用,以保证安全性?
-
始终使用origin和source属性验证发件人的身份,没有验证origin和source属性会导致跨站点脚本攻击。
-
当使用postMessage将数据发送到其他窗口时,指定精确的目标origin,而不是*
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
3.3.1、JSONP的介绍
JSONP 是通过在<script></srcipt>
标签里,通过src,img,href 属性的跨域方式向一个不同源的网站地址发送http请求,并且使得json数据可以在javascript代码中能够使用。
它规避了javascript代码中的跨源网络访问,也就是无法使用XMLHttpRequest,fetch被同源机制管到了(如果不同源的话)。
提前准备一个接口:https://photo.sina.cn/aj/index?page=1&cate=recommend
直接网页中打开,我们是可以看到有很多数据的,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOqT1VMJ-1618820609526)(https://upload-images.jianshu.io/upload_images/23129380-7f4e1aed616cbfa6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
让我们尝试在本地请求一下这个地址,看看能不能拿到数据:因为双方地址并不是同源的,因此这样请求会报跨域的错:
复制代码
通过 live-server打开浏览器,在控制台可以看到报错了,因为这个是一个跨域的请求:
接下来我们来看看JSONP如何解决这个问题:
3.3.2、jsonp 如何使用?原理是什么?返回数据格式?前端怎么处理?
还是请求上面的这个网站地址,我们把代码改成下面这样:
复制代码
再来看看页面控制台输出:
data成功取到了。但是我们的数据到达之后是json数据,不能直接使用,script标签是一个加载资源的标签,它并不能直接运行这个代码。
事实上我们是在访问的时候,在请求的地址后面加上一个,&callback=callback
,通知服务器,本地想进行一个跨资源访问(以JSOP的形式进行跨域)。等号后面的callback
是一个你自己定义的函数,名字可自取,这个函数就是,通知我需要请求的地址,这边页面上我有一个函数,它会等待调用,用来执行你发过来的数据(也就是可以去执行把数据请求下来的操作)。
因此在数据到达之后,还包了一层函数 callback({data})
,当数据通过script标签请求下来之后,再通过callback
实现了一个调用本地资源的能力。
最后再理一下这部分的内容:
- JSONP的原理
script标签请求数据,在请求的地址后面加上一个,&callback=callback
,请求的服务器就在json数据外面包一层callback函数,当这个带有数据的callback函数可以在script得到之后可以运行的函数:
- 返回的数据格式
JSON
- 以及前端如何处理的
JSON with padding — callback({data})
3.3.3、自己封装一个jsonp?
- 准备工作
复制代码
- 具体实现流程
-
确定传递参数: url 、携带的参数 、callback;
-
处理url上的参数(?后面的);
-
准备好url(携带callback函数);
-
构建script标签;
-
把这个标签挂到window上
复制代码
3.3.4、实现一个jsonp服务器端?(node版本,express版本)
node版本
创建一个结构如下的服务器端文件夹,我们将在index.js中实现我们的JSONP:
var http = require(‘http’);
http.createServer(function(req, res){
// req url callback=?
console.log(req.url);
let data = {a: 1};
res.writeHead(200, {‘Content-type’ : ‘text/json’})
const reg = /callback=([\w]+)/
if (reg.test(req.url)) {
let padding = RegExp.$1
res.end(${padding}(${JSON.stringify(data)})
)
} else {
res.end(JSON.stringify(data));
}
// res.end(‘
Hello World
’);res.end(JSON.stringify(data));
}).listen(3000);
复制代码
express 版本
var express = require(‘express’);
var cors = require(‘cors’);//后端cors 中间件
const app = express();
app.use(cors());
app.get(‘/product’,(req,res)=>{
res.json({
a:1,
b:2
})
})
app.listen(8000,()=>{
console.log(‘server is ok’)
})
复制代码
3.4.1、介绍一下cors?
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
3.4.2、简单请求和非简单请求?
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
除了简单请求其他的都是非简单请求,因此只要记住哪些是简单请求就可以啦:
简单请求:(需要同时满足下面两种条件)
- 请求方法是以下三种方法之一:
-
HEAD
-
GET
-
POST
- HTTP的头信息不超出以下几种字段:
-
Accept:设置接受的内容类型(请求头)
-
Accept-Language:设置接受的语言(请求头)
-
Content-Language:为封闭内容设置自然语言或者目标用户语言(响应头)
-
Content-Type:(设置请求体的MIME类型(适用POST和PUT请求))只限于三个值
application/x-www-form-urlencoded
:
中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
multipart/form-data
:将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。
text/plain
:text/plain :纯文本格式
3.4.3、项目中怎么使用?
- 服务器端:
const express = require(‘express’);
const app= express();
app.get(‘/’, (req, res)=>{
console.log(‘server is OK’);
res.end(‘jingjing’)
});
// app.use((req, res, next) => {
// res.header(“Access-Control-Allow-Origin”,‘http://localhost:5500’);
// res.header(“Access-Control-Allow-Credentials”, true);
// res.header(“Access-Control-Allow-Headers”, ‘Content-Type,Content-Length,Authorization, Accept,X-Requested-With’);
// res.header(“Access-Control-Allow-Methods”, ‘PUT,POST,GET,DELETE,OPTIONS,HEAD’);
// req.method === ‘OPTIONS’ ? res.send(‘CURRENT SERVICES SUPPORT CROSS DOMAIN REQUESTS!’) : next();
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
Vue
-
什么是MVVM?
-
mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?
-
组件之间的传值?
-
Vue 双向绑定原理
-
描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
-
虚拟 DOM 实现原理
-
Vue 中 key 值的作用?
-
Vue 的生命周期
-
Vue 组件间通信有哪些方式?
-
vue 中怎么重置 data?
-
组件中写 name 选项有什么作用?
-
Vue 的 nextTick 的原理是什么?
-
Vuex 有哪几种属性?
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-DZE1iewc-1710707740283)]
Vue
-
什么是MVVM?
-
mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?
-
组件之间的传值?
-
Vue 双向绑定原理
-
描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
-
虚拟 DOM 实现原理
-
Vue 中 key 值的作用?
-
Vue 的生命周期
-
Vue 组件间通信有哪些方式?
-
vue 中怎么重置 data?
-
组件中写 name 选项有什么作用?
-
Vue 的 nextTick 的原理是什么?
-
Vuex 有哪几种属性?
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】