自定义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 ...
随机推荐
- vue-router push
//push 方法一 对象 // this.$router.push({path:'HelloWorld2'}); //push 方法二 命名的路由 // this.$router.push({nam ...
- poj 1390 Blocks (经典区间dp 方块消除)
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4250 Accepted: 1704 Descriptio ...
- 【Excle数据透视表】如何按照地区交替填充背景颜色
现存在如下数据透视表 需要根据地区填充不同的背景颜色 步骤 选定数值区域→开始→条件格式→新建规则,出现如下窗口: 公式:=MOD(COUNT(1/(MATCH($A$4:$A4,$A$4:$A4,) ...
- spring aop中的propagation(传播属性)的7种配置的意思
1.前言. 在声明式的事务处理中,要配置一个切面,即一组方法,如 <tx:advice id="txAdvice" transaction-manager="t ...
- 安装Linux centos 时编辑选项
将第上一步选择编辑之后出来的文字修改为:>vmlinuz initrd=initrd.img linux dd quiet 这里注意了:网上很多文章都说这一步改成“>vmlinuz ini ...
- 基于React的PC网站前端架构分析
代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...
- 运行./cpp.sh,显示command not found
首先运行ls -l 查看这个文件的属性是否可执行drwxrwxrwx对当前用户必须具有可执行权限(即含有x符号)如果没有可以运行chmod 777 cpp.sh 添加可执行权限
- Active Directory的基本概念
前言 本文是面对准备加入Active Directory编程的初学者的一份文章,主要是讲解Active Directory(活动目录)的一些概念和相关知识.这篇文章本来是不想写下来的,因为概念性内容的 ...
- mock测试类的时候,添加@InjectMocks
1.在单元测试某个类的时候,引入该类的时,添加注解@InjectMocks 2.该类的变量,需要添加注解:@Mock 3.类中需要第三方协作者时,通常会用到get和set方法注入.通过spring框架 ...
- ”非常危险“的Linux命令
Linux命令是一种很有趣且有用的东西,但在你不知道会带来什么后果的时候,它又会显得非常危险.所以,在输入某些命令前,请多多检查再敲回车. rm –rf rm –rf是删除文件夹和里面附带内容的一种最 ...