jquery jsonp请求错误处理
jQuery将ajax方法进行了封装,jsonp可以轻松实现跨域请求。
$.ajax({type: 'GET', url: "<%= SysUtils::TASK_CENTER_URL %>/all_tasks_h/verbose",
async: false,
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
timeout: 10,
jsonpCallback:"flightHandler",
success: function (msg) {
if(msg){
$('#main-content').text(JSON.stringify(msg));
}else{
$("#main-content").text("未返回数据,请勿频繁刷新"); } },
error: function(jqXHR,textStatus){
var error_info = $('<div class="alert alert-danger">连接失败,请勿频繁刷新,如需帮助请联系管理员</div>');
$("#main-content").empty().append(error_info); }
});
上面的方法正常的情况下可以执行,但是虽然浏览器终端报出错误(404或其他网络错误),但你的error回调却没有被执行!?如果出错的情况下,error回调确没有执行。
我们仔细看看ajax方法的文档,在它error回调说明的最后有一句话:
Note: This handler is not called for cross-domain script and cross-domain JSONP requests. This is an Ajax Event.
这就说明在调用跨域的脚本及jsonp请求时,这个错误将不会被执行,并强调指出这个error是一个 Ajax Event.
其实,严格而讲jsonp不是ajax,ajax是通过XMLHttpRequest对象发送异步请求,而jsonp则是利用js标签天生具备的跨域能力来实现跨域资源访问。也就是说,虽然它的名字叫JSONP(JSON with Padding),但它底层是通过js标签实现的,它跟json以及普通异步请求关系都不大,jquery之所以把jsonp请求放到ajax方法里面,只是为了让api更方便调用而已。 (JSONP的详细描述可以查看WIKI,或者google)
那怎么做才能使JSONP的error回调被执行呢?
有两个方法,方法一:添加timeout参数。
$.ajax({
url: '<%= SysUtils::TASK_CENTER_URL%>/all_tasks_h/verbose',
type: 'GET',
dataType: 'jsonp', // dataType为jsonp
timeout: 5000, // 添加timeout参数
success: function(data) { $('.result').text(JSON.stringify(data)); },
error: function(jqXHR, textStatus) {
// 此时textStatus为‘timeout’
$('#main-content').text('error'); alert('JSONP error!');
}
});
添加timeout参数后,虽然JSONP请求本身的错误没有被捕获,但是最终会因为超时而执行error回调。
那还有没有方法使error回调在JSONP错误发生时就执行呢?
方法二出场:使用jquery jsonp插件 - https://github.com/jaubourg/jquery-jsonp
以下为常见的jqeury jsonp插件调用代码:
$.jsonp({
url: '<%= SysUtils::TASK_CENTER_URL%>/all_tasks_h/verbose',
callbackParameter: "callback",
timeout: 5000,
error: function(xOptions, textStatus) {
// 错误发生时,立即执行
$('.result').text('error');
alert('JSONP error!');
},
success: function(data) {
$('#main-content').text(JSON.stringify(data));
}
});
使用jsonp插件,能够在错误发生时立即执行error回调,并且还附带如’数据过滤’等功能,更多详细介绍请查看它的主页。
以上。
jquery jsonp请求错误处理的更多相关文章
- jQuery ajax请求错误返回status 0和错误error的问题
上周发现一个jQuery ajax请求错误返回status 0和错误error的问题,responseText是"error",状态码是0而不是200: $.ajax({ type ...
- 深入源码分析使用jQuery连续发起jsonp请求失败的原因
jQuery的 jsonp 大家应该是十分熟悉了.曾遇到过这样的需求1.希望请求几个相似的内容添加到页面2.请求的内容一定时间内是固定不变的,希望做个缓存. 于是脑子一拍写下了类似这样的代码 for( ...
- 原生js,jquery ajax请求以及jsonp的调用
ajax 是用来处理前后端交互的技术,可以改善用户体验,其本质是 XMLHttpRequest,异步访问服务器并发送请求数据,服务器返回响应的数据,以页面无刷新的效果改变页面中的局部内容 ...
- 跨域Ajax请求(jQuery JSONP MVC)
通过jQuery的$.ajax方法发送JSONP请求 js代码 <script type="text/javascript"> function jsonptest2( ...
- jquery ajax 请求参数详细说明 及 实例
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- jsonp 请求
$.ajax()方法详解 $.ajax() 方法详解:来源 http://www.cnblogs.com/tylerdonet/p/3520862.html jsonp 调用 无法进入 success ...
- ajax--->请求异常 jQuery提示parsererror错误解决办法
ajax请求异常 jQuery提示parsererror错误解决办法 原因:出现这个错误是因为后端返回的数据类型和前端请求中dataType的要求类型不一致导致的. dataType简介:jquery ...
- jQuery异步请求(如getJSON)跨域解决方案
相信大家在使用jQuery异步请求非自己网站内相对资源(通过别人站点上的URL直接读取)使经常会遇到如下错误吧,实际上这些错误都是浏览器安全机制“搞的鬼”,才让我们开发路上遇到了拦路虎. 当你直接在浏 ...
- JavaScript跨域请求和jsonp请求实例
<script type="text/javascript" src="./whenReady.js"></script> <sc ...
随机推荐
- C++读取Sql Server
代码如下: // ReadSqlConsole.cpp: 主项目文件. #include "stdafx.h" #include <iostream> #include ...
- js 数组取出最大值最小值和平均值的方法
1.直接遍历数组 ,,,,,,,]; ]; ;i<arr.length;i++){ if(max<arr[i]) max=arr[i]; } 2.借用Math的方法 ,,,,,,,]; v ...
- MongoDB 连接数高产生原因及解决
MongoDB Sharding架构下连接数很容易达到很高,这里连接数分为几个概念:tcp 连接数 netstat可以统计的,一般这个是最高.如果mongod/mongos在同一台服务器,更明显.参考 ...
- php+mysqli实现批量执行插入、更新及删除数据的方法
本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只 ...
- npm中本地安装命令行类型的模块是不注册Path的
http://www.jianshu.com/p/c04dea6e46de 首先有必要解释下什么是命令行(Command Line)类型的模块.npm的模块一共分为三类: 绑定型(Binding):本 ...
- win7物理主机与虚拟XP系统互相ping不通解决方法
安装了虚拟XP系统,win7物理主机与XP系统ping不通,原因在于安装虚拟XP系统网络连接方式选的仅主机网络,则win7物理主机上的网卡应为VMnet1,而自己的win7VMnet1网卡处于禁用状态 ...
- IOS控件:计算文字长度(UITextField,UILabel对象 和 IBAction)
#import <UIKit/UIKit.h> // UIViewController类为程序提供了基本的视图管理模块 @interface NavControllerViewContro ...
- 【BZOJ4503】两个串 FFT
[BZOJ4503]两个串 Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字 ...
- javamail 发送邮件demo(文字与附件)
package com.get.one; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multip ...
- python拓展库whl下载网址集合:
http://www.lfd.uci.edu/~gohlke/pythonlibs/