自定义jsonp请求数据
整理代码的时候发现一个以前写的实现jsonp请求方法,放在这里分享一下~
原理:通过js新建script dom对象,利用src携带参数和callback方法,将数据发送至后端,需要后端配合将数据放在callback中返回
功能:可以同时进行多个jsonp请求,且可以设置超时时间
注意:为了保证可以同时进行多个jsonp请求,所以每次请求需要新增script dom对象,请求结束后需要进行销毁
var jsonpId = 0; // 用来标记创建的<script>元素
var debug = true; // 是否开启debug
function addScriptTag(src) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src',src);
script.setAttribute('onload','try {document.body.removeChild(this);} catch (e) { debug ? console.error(e) : ""; }'); // 用完就删
document.body.appendChild(script);
return script;
}
/*
* jsonp 获取数据 跨域
* paramObj {
* url: 请求的接口
* timeout: 请求过期时间(设置为0或者不设置这个参数,表示不设置过期时间,默认为0)
* data: 要发送的数据
* ready: 请求成功后调用的方法
* error: 请求失败后调用的方法(如:超时)
* }
* */
function jsonpData(paramObj) {
var url = paramObj.url + ((paramObj.url.indexOf('?') > -1) ? '&' : '?') + formatParams(paramObj.data);
// 请求数据
var mark = jsonpId++;
window.jsonpCallback ? true : window.jsonpCallback = {};
window.jsonpCallback[mark] = function (data) { // 针对每一个jsonp请求,生成一个对应的callback方法
clearTimeout(window.timer[mark]); // 清除掉对应的定时器
paramObj.ready ? paramObj.ready(data) : '';
try { // 删除回调方法
delete window.jsonpCallback[mark];
} catch (e) {
window.jsonpCallback[mark] = null;
}
};
var script = addScriptTag(url + "&callback=jsonpCallback[" + mark + "]");
// 请求超时处理
var timeout = paramObj.timeout ? paramObj.timeout : 0;
window.timer ? true : window.timer = {};
if(timeout) {
window.timer[mark] = setTimeout(function () {
if(window.jsonpCallback[mark]) { // 移除对应的script dom,解决当数据超过设置的超时时间后返回了数据,但callback却不存在的情况
try {
document.body.removeChild(script);
} catch (e) {
debug ? console.error(e) : '';
}
window.jsonpCallback[mark] = function () { // 重新定义一下回调方法, 改写 callback
try {
delete window.jsonpCallback[mark];
} catch (e) {
window.jsonpCallback[mark] = null;
}
};
paramObj.error ? paramObj.error('请求超时,请检查网络环境!') : ''; // 超时执行 error
// 设置一个足够长的计时器,将上面的回调方法彻底删除,如果没有走超时处理的方法,这个计时器也就不会存在
var longTimer = setTimeout(function () {
if(window.jsonpCallback[mark]) { // 如果回调方法存在,彻底删除
try {
delete window.jsonpCallback[mark];
clearTimeout(longTimer);
} catch (e) {
window.jsonpCallback[mark] = null;
}
}
}, 120000);
}
clearTimeout(window.timer[mark]); // 清除掉对应的定时器
}, timeout);
}
}
本文链接:https://www.cnblogs.com/xsilence/p/10794840.html
自定义jsonp请求数据的更多相关文章
- vue 使用 jsonp 请求数据
vue 使用 jsonp 请求数据 vue请求数据的时候,会遇到跨域问题,服务器为了保证信息的安全,对跨域请求进行拦截,因此,为了解决vue跨域请求问题,需要使用jsonp. 安装jsonp npm ...
- 封装 jsonp请求数据的方法
什么是jsonp : Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从不 ...
- 豆瓣 jsonp 请求数据 并分页
豆瓣分页 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4 ...
- get和post方式请求数据,jsonp
get方式请求数据: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #289c97 } p.p2 { ma ...
- Angular 请求数据
Angular 请求数据 get post 以及 jsonp 请求数据 引入 HttpModule .JsonpModule 普通的 HTTP 调用并不需要用到 JsonpModule,不过稍后我们就 ...
- Vue系列(二):发送Ajax、JSONP请求、Vue生命周期及实例属性和方法、自定义指令与过渡
上一篇:Vue系列(一):简介.起步.常用指令.事件和属性.模板.过滤器 一. 发送AJAX请求 1. 简介 vue本身不支持发送AJAX请求,需要使用vue-resource.axios等插件实现 ...
- 使用JSONP跨域请求数据
下面代码,可以使用JSONP进行跨域请求数据,Insus.NET记录以下,以备忘记.
- Struts2 请求数据的自动封装 及 自定义转换器类
请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...
- vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询
vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询 基于element Transfer http://element-cn.eleme.io/#/zh-CN/comp ...
随机推荐
- Xcode强大的多视图立体分层显示View UI Herarchy
Xcode能够显示执行页面的立体uivew结构图,能够让你看到一个页面包括哪些视图,在哪一层,在页面的什么位置. 一看就能看到你的uiview是否显示.显示在哪里了. 用鼠标点击页面移动鼠标能够看到页 ...
- NSDate 类的总结,全面基础
<span style="font-size:24px;"><span style="font-size:18px;">//1.创建日期 ...
- Fog of War小调研
看起来LOL和DOTA2都用的是格子来做的战争阴影,并且是用PP做的.
- 键盘上所有键位的ascii值
上次用的时候一直找,这次找到了,收藏起来. 0x1 鼠标左键 0x2 鼠标右键 0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 ...
- Atitit.软件硕士 博士课程 一览表 attilax 总结
Atitit.软件硕士 博士课程 一览表 attilax 总结 1. Attilax聚焦的领域1 2. 研究生硕士博士课程汇总表1 3. 博士课程3 4. Attilax额外的4 5. 参考4 1. ...
- 使用Firebug进行断点调试详解
利用Firebug我们可以非常方便地对网页上的任何JavaScript代码进行断点调试. 首先,使用快捷键F12在当前页面打开Firebug,并切换到脚本选项卡. 其次,我们需要为指定的js代码添加断 ...
- 【问题记录】web项目访问时出现404
请一定检查一下项目的Context root是否是你访问时使用的. Context root设置为/时,可以直接用ip+端口访问. Context root设置为项目名的,访问时请带上项目名. 设置方 ...
- VMware网络连接 桥接、NAt、host-only模式
如果你想利用VMWare安装虚拟机,或想创建一个与网内其他机器相隔离的虚拟系统,进行特殊的调试工作.此时,对虚拟系统网络连接模式的选择就非常重要了.如果你选择的工作模式不正确,就无法实现上述目的,也就 ...
- 《Lucene in Action第二版》学习总结---如何在Windows下编译luceneinAction2Edition源码包
1. 下载此源码包,位置是: www.manning.com/hatcher3,得到:lia2e.tar.gz,然后解压缩得到目录:lia2e,为了以后能辨识,我将此目录改名为:luceneinAct ...
- k8s部署dashborad
环境: 两台虚拟机, 10.10.20.203 部署docker.etcd.flannel.kube-apiserver.kube-controller-manager.kube-scheduler ...