封装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是一个应用层的协议,在这个层的协议,只是一种通讯 ...
随机推荐
- Azure Service Bus(一)入门简介
一,引言 今天开始学习新的内容 Azure Service Bus(服务总线),其实也叫 "云消息服务",和 RabbitMQ,KafKa的一样都是作为消息通信服务,但是它们直接还 ...
- Hyperledger fabric 1.4 环境搭建(一)
Hyperledger fabric 1.4 环境搭建(一) 1.更换下载源 更换apt的下载源,因为官方下载源很慢,需要更换到国内的镜像站 1.1.进入/etc/apt/目录 cd etc/apt ...
- 修改mysql和MariaDB密码
一.修改mysql密码 UPDATE user SET password=PASSWORD('new_password') WHERE user='root'; 二.修改MariaDB密码 alter ...
- .netcore 微服务快速开发框架 Anno&Viper -分布式锁是个什么鬼
1.什么是锁 锁是为了解决多线程或者多进程资源竞争的问题. 同一进程的多个线程资源竞争可以用lock解决. lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线 ...
- Hadoop支持的压缩格式对比和应用场景以及Hadoop native库
对于文件的存储.传输.磁盘IO读取等操作在使用Hadoop生态圈的存储系统时是非常常见的,而文件的大小等直接影响了这些操作的速度以及对磁盘空间的消耗. 此时,一种常用的方式就是对文件进行压缩.但文件被 ...
- Stata极简生存分析
1. 导入数据 webuse drugtr,clear *webuse -- Use dataset from Stata website stset,clear *上一行命令导入进来的数据是&quo ...
- 【vue】常用指令
vue指令带有前缀 v-. 一.v-bind 单向数据绑定 在html中显示数据,除了使用插值表达式{{}}之外,也可以使用vue中的v-bind指令. ... ... <body> &l ...
- [从源码学设计]蚂蚁金服SOFARegistry之服务上线
[从源码学设计]蚂蚁金服SOFARegistry之服务上线 目录 [从源码学设计]蚂蚁金服SOFARegistry之服务上线 0x00 摘要 0x01 业务领域 1.1 应用场景 1.1.1 服务发布 ...
- 网络设置-指定ip
1 克隆centos6.设置网卡 vim /etc/udev/rules.d/70-persistent-net.rules 确定光标所在的位置 d3d删除以下三行,更改NAME为0 vim /etc ...
- 数仓建设中最常用模型--Kimball维度建模详解
数仓建模首推书籍<数据仓库工具箱:维度建模权威指南>,本篇文章参考此书而作.文章首发公众号:五分钟学大数据,公众号中发送"维度建模"即可获取此书籍第三版电子书 先来介绍 ...