封装JSONP 函数,方便请求发送
封装JSONP 函数,方便请求发送
封装jsonp的代码和封装Ajax的代码非常的相似!可以参照食用偶!
<button id="btn">点击我发送请求!</button>
<script>
function fn2 (data, succ) {
console.log('客户端的函数fn被调用了!')
console.log(data, succ)
}
</script>
<script type="text/javascript">
const btn = document.getElementById('btn');
btn.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better?callback=fn2'
})
}
function jsonp(options) {
// 1 动态的创建一个script标签
const script = document.createElement('script');
// 为script标签添加src属性
script.src = options.url;
// 将script标签追加到页面当中!
document.body.appendChild(script);
// 给script标签添加onload事件, 当script标签被加载完成的时候删除标签!
script.onload = function () {
document.body.removeChild(script );
}
}
</script>
封装代码优化!
1第一个优化的地方就是处理返回服务器端返回的函数fn2【现在我们希望fn2函数和jsonp函数进行关联!怎么做?!】把外部函数变成参数函数!再把参数函数变成一个全局函数!
<button id="btn">点击我发送请求!</button>
<button id="btn2">点击我发送请求!</button>
<script type="text/javascript">
const btn = document.getElementById('btn');
btn.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
success: function (data, succ) {
console.log(123);
console.log(data, succ)
}
})
}
const btn2 = document.getElementById('btn2');
btn2.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
success: function (data, succ) {
console.log(234234234);
console.log(data, succ)
}
})
}
function jsonp(options) {
// 1 动态的创建一个script标签
const script = document.createElement('script');
// myjsonp后面生成随机数字!
let fnName = 'myJsonp' + Math.random().toString().replace('.', '');
// 他已经不是一个全局函数了!
// 我们要想办法让它变成一个全局函数!
// 第二个地方就是现在的函数已经变成了一个匿名函数了,所以名字变成了一个亟待解决的问题!
window[fnName] = options.success;
// 为script标签添加src属性
script.src = options.url + '?callback=' + fnName;
// 将script标签追加到页面当中!
document.body.appendChild(script);
// 给script标签添加onload事件, 当script标签被加载完成的时候删除标签!
script.onload = function () {
document.body.removeChild(script );
}
}
</script>
jsonp代码的最终优化【如果要求传入更多的callback函数应该怎么做呢?!】
<button id="btn">点击我发送请求!</button>
<button id="btn2">点击我发送请求!</button>
<script type="text/javascript">
const btn = document.getElementById('btn');
btn.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
data: {
name: 'lvchengxin',
age: 20
},
success: function (data, succ) {
console.log(123);
console.log(data, succ)
}
})
}
const btn2 = document.getElementById('btn2');
btn2.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
success: function (data, succ) {
console.log(234234234);
console.log(data, succ)
}
})
}
function jsonp(options) {
// 1 动态的创建一个script标签
const script = document.createElement('script');
// 拼接字符串的变量
let params = '';
for (let attr in options.data) {
params += '&' + attr + '=' + options.data[attr];
}
// myjsonp后面生成随机数字!
let fnName = 'myJsonp' + Math.random().toString().replace('.', '');
// 他已经不是一个全局函数了!
// 我们要想办法让它变成一个全局函数!
// 第二个地方就是现在的函数已经变成了一个匿名函数了,所以名字变成了一个亟待解决的问题!
window[fnName] = options.success;
// 为script标签添加src属性
script.src = options.url + '?callback=' + fnName + params;
// 将script标签追加到页面当中!
document.body.appendChild(script);
// 给script标签添加onload事件, 当script标签被加载完成的时候删除标签!
script.onload = function () {
document.body.removeChild(script);
}
}
</script>
服务器端代码的优化
app.get('/better', (req, res) => {
// 接收客户端传递过来的函数名称
// const fnName = req.query.callback;
// 将函数名称对应的函数调用代码返回给客户端!
// const data = JSON.stringify([{name: "lvhang"},{test: "如果你能看到这条消息,说明你已经解决了同源的问题!你用的或许是jsonph or CROS但是,这已经不重要了!"}]);
// const result = fnName + '(' + data + ')';
// setTimeout( () => {
// }, 1000)
// res.send(result)
// 在jsonp的内部就是干的上面的事情!
res.jsonp({name: 'lvchengxin', age: 20})
})
封装JSONP 函数,方便请求发送的更多相关文章
- 原生JavaScript封装的jsonp跨域请求
原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...
- jsonp跨域请求响应结果处理函数(python)
接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...
- 封装 jsonp请求数据的方法
什么是jsonp : Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从不 ...
- 封装jsonp
1.写一个类封装jsonp: jsonp(url, params, success, funName) 参数url:请求地址 参数params:请求数据,可以是json对象,或形如&q ...
- .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器
1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...
- 轻松搞定Ajax(分享下自己封装ajax函数,其实Ajax使用很简单,难是难在你得到数据后来怎样去使用这些数据)
hey,guys!今天我们一起讨论下ajax吧!此文只适合有一定ajax基础,但还是模糊状态的同志,当然高手也可以略过~~~ 一.概念 Ajax(Asynchronous Javascript + X ...
- 使用promise手动封装ajax函数
最近在做一个单页应用,node和浏览器仅通过json传输数据,因为是只有自己用等于是锻炼一下自己,所以也不用考虑seo的问题,node端我已经写好了,但是浏览器端想要用ajax原生太麻烦,用封装的函数 ...
- 轻松搞定JSONP跨域请求
一.同源策略 要理解跨域,先要了解一下"同源策略".所谓同源是指,域名,协议,端口相同.所谓"同源策略",简单的说就是基于安全考虑,当前域不能访问其他域的东西. ...
- 一个http请求发送到后端的详细过程
我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...
随机推荐
- Docker来搭建分布式文件系统FastDfs
对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文件较少的时候,Django是可以应付的过来的.但当文件以海量形式出现的时候 ...
- 用Python写个开心消消乐小游戏
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...
- 二、LINUX文本处理三剑客之grep
1. grep一般格式:grep [选项] 基本正则表达式 [文件],其中基本正则表达式需要用引号引起来 引号引起来的作用:a.防止被误解为shell命令,b.可以用来查找多个单词组成的字符串 gre ...
- npm 各种常用命令
全局删除 node-gyp npm -g uninstall node-gyp 再次安装依赖 npm install 更改包内容后重建 npm rebuild 清除缓存 npm cache clean ...
- vue3.0自定义指令(drectives)
在大多数情况下,你都可以操作数据来修改视图,或者反之.但是还是避免不了偶尔要操作原生 DOM,这时候,你就能用到自定义指令. 举个例子,你想让页面的文本框自动聚焦,在没有学习自定义指令的时候,我们可能 ...
- How to install android studio on ubuntu14.04
First: open the web page: https://developer.android.com/studio/index.html download the Android Studi ...
- Qt学习笔记-启动一个额外的应用程序-获取输入的回车信号
现在让我们的程序模拟windows下的运用程序. 在命令行中输入命令.点击确定即可运行系统中的程序. 添加头文件#include <QProcess> 在确定按钮的响应函数中写上功能要求. ...
- Java学习日报8.6
<构建之法:现代软件工程>读后感 比起一般的教学类书籍,这本书更像是一本传记小说,作者邹欣以自己或者说一些典型的软件工程师为例子,详细介绍了一个软件工程师的工作内容,全书给我的感觉就是以一 ...
- 【Redis】内部数据结构自顶向下梳理
本博客将顺着自顶向下的思路梳理一下Redis的数据结构体系,从数据库到对象体系,再到底层数据结构.我将基于我的一个项目的代码来进行介绍:daredis.该项目中,使用Java实现了Redis中所有的数 ...
- 新建表后,在sqlserver manager中使用显示引用对象无效
编辑>intelliSense(I)>刷新本地缓存.