封装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 函数,方便请求发送的更多相关文章

  1. 原生JavaScript封装的jsonp跨域请求

    原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...

  2. jsonp跨域请求响应结果处理函数(python)

    接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...

  3. 封装 jsonp请求数据的方法

    什么是jsonp :  Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从不 ...

  4. 封装jsonp

    1.写一个类封装jsonp: jsonp(url, params, success, funName)     参数url:请求地址     参数params:请求数据,可以是json对象,或形如&q ...

  5. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器

    1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...

  6. 轻松搞定Ajax(分享下自己封装ajax函数,其实Ajax使用很简单,难是难在你得到数据后来怎样去使用这些数据)

    hey,guys!今天我们一起讨论下ajax吧!此文只适合有一定ajax基础,但还是模糊状态的同志,当然高手也可以略过~~~ 一.概念 Ajax(Asynchronous Javascript + X ...

  7. 使用promise手动封装ajax函数

    最近在做一个单页应用,node和浏览器仅通过json传输数据,因为是只有自己用等于是锻炼一下自己,所以也不用考虑seo的问题,node端我已经写好了,但是浏览器端想要用ajax原生太麻烦,用封装的函数 ...

  8. 轻松搞定JSONP跨域请求

    一.同源策略 要理解跨域,先要了解一下"同源策略".所谓同源是指,域名,协议,端口相同.所谓"同源策略",简单的说就是基于安全考虑,当前域不能访问其他域的东西. ...

  9. 一个http请求发送到后端的详细过程

    我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...

随机推荐

  1. C# 中 ConcurrentDictionary 一定线程安全吗?

    根据 .NET 官方文档的定义:ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合.这也是我们在并发任务中比较 ...

  2. Python编程学习爆破一些简单加密的文件

    前言 这里只是分享一下Python如何生成爆破字典,对于简单的一些加密文件,咱们可以跑字典获取正确的密码,比如zip加密文件.这里小编给大家简单的介绍一下爆破字典的方法,希望对大家学习Python有帮 ...

  3. vSphere Esxi 6.x 常用序列号

    以下资料转载于互联网公开资料,不得用于商业用途,仅做学习交流. vSphere 6 Enterprise Plus1F6XH-8VJ9L-481Y9-L835P-CFHHA1G28U-AW18P-08 ...

  4. (三)、vim的移动(旋转,跳跃)

    一.以word为单位的移动 1.w 向后移动到后一个单词词头,取自"word" This is a line with example text ----->--->- ...

  5. SpringBoot默认首页配置

    @Configuration public class DefaultView extends WebMvcConfigurerAdapter { @Override public void addV ...

  6. layer做阻塞式弹出层的方法

    今天遇到一个问题: layer弹出一个confirm提示窗,然后confirm还没有点击对应的按钮的时候,就已经执行了后续代码,我这里做出的判断是,是否需要进行后续操作,但是因为layer.confi ...

  7. ES6箭头函数与this指向

    一.ES6箭头函数 ES6之前的语法想要定义一个函数,如图example1,ES6之后定义一个函数如图example2,相比较之下简洁了很多 二.函数的this指向 非箭头函数,谁调用函数this指向 ...

  8. Hbase-cdh5.14.2与kylin集成异常

    1.原先使用版本:apache-kylin-2.5.1-bin-hbase1x 原生版本 启动报错出现异常: Failed to find metadata store by url: kylin_m ...

  9. [开源软件] 腾讯云Linux服务器一键安装LAMP/LNMP/LANMP环境 转

    本帖最后由 我本戏子 于 2015-8-13 22:00 编辑OneinStack是非常优秀的一键PHP/JAVA安装脚本,提供以下环境:lnmp(Linux + Nginx+ MySQL+ PHP) ...

  10. phpstorm 注册码破解

    激活码1 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2ln ...