整理代码的时候发现一个以前写的实现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请求数据的更多相关文章

  1. vue 使用 jsonp 请求数据

    vue 使用 jsonp 请求数据 vue请求数据的时候,会遇到跨域问题,服务器为了保证信息的安全,对跨域请求进行拦截,因此,为了解决vue跨域请求问题,需要使用jsonp. 安装jsonp npm ...

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

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

  3. 豆瓣 jsonp 请求数据 并分页

    豆瓣分页 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4 ...

  4. get和post方式请求数据,jsonp

    get方式请求数据: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #289c97 } p.p2 { ma ...

  5. Angular 请求数据

    Angular 请求数据 get post 以及 jsonp 请求数据 引入 HttpModule .JsonpModule 普通的 HTTP 调用并不需要用到 JsonpModule,不过稍后我们就 ...

  6. Vue系列(二):发送Ajax、JSONP请求、Vue生命周期及实例属性和方法、自定义指令与过渡

    上一篇:Vue系列(一):简介.起步.常用指令.事件和属性.模板.过滤器 一. 发送AJAX请求 1. 简介 vue本身不支持发送AJAX请求,需要使用vue-resource.axios等插件实现 ...

  7. 使用JSONP跨域请求数据

    下面代码,可以使用JSONP进行跨域请求数据,Insus.NET记录以下,以备忘记.

  8. Struts2 请求数据的自动封装 及 自定义转换器类

    请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...

  9. vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询

    vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询 基于element Transfer http://element-cn.eleme.io/#/zh-CN/comp ...

随机推荐

  1. Nginx:管理HTTP模块的配置项

    参考资料<深入理解Nginx> 一个nginx.conf的例子 http { mytest_num ; server { server_name A; listen ; mytest_nu ...

  2. Shell脚本之:函数

    Shell 也支持函数.Shell函数必须先定义后使用. 函数的定义与调用 Shell 函数的定义格式如下: function_name () { list of commands [ return ...

  3. Oracle 查询用户表信息,导入导出处理表空间不一致

    select table_name,tablespace_name from user_tables t; //查询用户默认表空间信息 SELECT t.* FROM USER_USERS t; 导入 ...

  4. .Net 异步调用

    .NET异步编程之新利器——Task与Await.Async   一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方 ...

  5. 原 [Android]LIstView的HeaderView

    目录[-] (1)添加HeaderView之后尺寸布局被忽略. (2)添加HeaderView之后导致OnItemClickListener的position移位 (3)LayoutInflater的 ...

  6. 使用Fiddler抓包拦截线上JS

    第三方教程:http://www.lcgod.com/atc_74 分六步即可: 1.左侧session列表中选中你想替换的一条请求 2.右侧,切换到AutoResponder,点击Add rules ...

  7. MapReduce Input Split 输入分/切片

    MapReduce Input Split(输入分/切片)详解 public static long getMaxSplitSize(JobContext context) { return cont ...

  8. 将普通用户添加至sudoers列表

    编辑/etc/sudoers文件,在尾部添加如下内容: myusername ALL=(ALL) ALL myusername ALL=(ALL) NOPASSWD: ALL 其中需要将红色部分替换成 ...

  9. Linux 能PING IP 但不能PING 主机域名的解决方法 vim /etc/nsswitch.conf hosts: files dns wins

    Linux 能PING IP 但不能PING 主机域名的解决方法 转载 2013年12月25日 10:24:27 13749 . vi /etc/nsswitch.conf hosts: files ...

  10. Highways - poj 2485 (Prim 算法)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24383   Accepted: 11243 Description T ...