自定义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 ...
随机推荐
- jquery 插件:chosen
options 文档 https://harvesthq.github.io/chosen/options.html 官网: http://plugins.jquery.com/chosen/
- SQL优化的一些总结 SQL编写一般要求
SQL编写一般要求---SQL语句尽可能简单---分解联接保证高并发---同数据类型的列值比较---不在索引列做运算---禁止使用SELECT *---避免负向查询和%前缀模糊查询---保持事务(连接 ...
- asp.net core mvc视频A:笔记2-4.ActionResult(动作结果,即返回值)
json类型测试 方法一:实例化对象方式 代码 运行结果 方法二:封装方式 代码改动 运行结果 重点视图返回介绍,其他的不做介绍了 项目文件目录及文件添加 代码 运行结果 如果要显示的不是默认视图,可 ...
- laravel处理ajax的post提交
Html页面(laravel表单提交必须token)所以 头部要加入: <meta name="csrf-token" content="{{ csrf_token ...
- Spark高速上手之交互式分析
1.1 Spark交互式分析 执行Spark脚本前,启动Hadoop的HDFS和YARN.Spark的shell提供 了简单方式去识别API.相同也有一个强大的工具去交互式地分析数据. 两种语言有这 ...
- IIS 下 部署nodejs 使用反向代理
目标服务器:targetServer 配置反向代理的服务器:reveseProxServer iis应该是iis7及以上版本,才可以. 1.确定最终访问的网址:比如www.baidu.com .ww ...
- Weka学习之认识weka(一)
Weka 简介 WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归.聚类.关联规则以及在新的交互式界面上的可视化. Weka是基 ...
- Android发短信
设置应用一打开时候的背景图片 去掉相对布局时候的标题 去除标题必须在setContentView(R.layout.activity_main)之前. @Override protected void ...
- torrent&BT百科
转自:百度百科 名词指代 Tracker:收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据. 种子:指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一 ...
- 域名解析-CNAME
不要把域名解析简单看成把一个域名指向一个IP那么简单的事. 事实上域名解析能做的事非常多. 简单样例,假如你买了一台server仅仅有一个IP,你想弄两站点,而且仅仅想直接通过IP就能訪问,就是不加什 ...