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请求错误处理的更多相关文章

  1. jQuery ajax请求错误返回status 0和错误error的问题

    上周发现一个jQuery ajax请求错误返回status 0和错误error的问题,responseText是"error",状态码是0而不是200: $.ajax({ type ...

  2. 深入源码分析使用jQuery连续发起jsonp请求失败的原因

    jQuery的 jsonp 大家应该是十分熟悉了.曾遇到过这样的需求1.希望请求几个相似的内容添加到页面2.请求的内容一定时间内是固定不变的,希望做个缓存. 于是脑子一拍写下了类似这样的代码 for( ...

  3. 原生js,jquery ajax请求以及jsonp的调用

    ajax    是用来处理前后端交互的技术,可以改善用户体验,其本质是    XMLHttpRequest,异步访问服务器并发送请求数据,服务器返回响应的数据,以页面无刷新的效果改变页面中的局部内容  ...

  4. 跨域Ajax请求(jQuery JSONP MVC)

    通过jQuery的$.ajax方法发送JSONP请求 js代码 <script type="text/javascript"> function jsonptest2( ...

  5. jquery ajax 请求参数详细说明 及 实例

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  6. jsonp 请求

    $.ajax()方法详解 $.ajax() 方法详解:来源 http://www.cnblogs.com/tylerdonet/p/3520862.html jsonp 调用 无法进入 success ...

  7. ajax--->请求异常 jQuery提示parsererror错误解决办法

    ajax请求异常 jQuery提示parsererror错误解决办法 原因:出现这个错误是因为后端返回的数据类型和前端请求中dataType的要求类型不一致导致的. dataType简介:jquery ...

  8. jQuery异步请求(如getJSON)跨域解决方案

    相信大家在使用jQuery异步请求非自己网站内相对资源(通过别人站点上的URL直接读取)使经常会遇到如下错误吧,实际上这些错误都是浏览器安全机制“搞的鬼”,才让我们开发路上遇到了拦路虎. 当你直接在浏 ...

  9. JavaScript跨域请求和jsonp请求实例

    <script type="text/javascript" src="./whenReady.js"></script> <sc ...

随机推荐

  1. maven项目编译:程序包com.sun.image.codec.jpeg不存在 这个类文件的位置在jre/lib/rt.jar

    转载:http://superich2008.iteye.com/blog/2047830 失败提示信息为:程序包com.sun.image.codec.jpeg不存在 这个类文件的位置在jre/li ...

  2. UVALive 3942 Remember the Word 字典树+dp

    /** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...

  3. C0302 将一个代码块中的内容保存在文件中, 查看一个rpm包是否可以安装

    #!/bin/bash # 这个脚本是用来描述和确认是否可以安装一个rpm包 # 在一个文件中保存输出 SUCCESS=0 E_NOARGS=65 if [ -z "$1" ] t ...

  4. 2014年辛星解读css第一节

    CSS是Cascading Style Sheets的缩写.即层叠样式表,它用于表现HTML的样式,即HTML仅仅是去写该网页有哪些内容,至于怎样去表现它们,由CSS去定制. ************ ...

  5. 【转】Android横竖屏重力自适应

    通常我们的应用只会设计成横屏或者竖屏,锁定横屏或竖屏的方法是在manifest.xml文件中设定属性android:screenOrientation为"landscape"或&q ...

  6. php 使用curl 进行简单模拟提交表单

    //初始化curl $ch = curl_init(); $url = 'xxx'; $option = [ CURLOPT_URL => $url, CURLOPT_HEADER => ...

  7. 第一篇:《UNIX 环境高级编程》编译环境的搭建

    第一步:搭建基本的编译环境 安装gcc, g++, bulid-essential等编译软件 第二步:下载本书示例源码包 可在这里下载 www.apuenook.com 第三步:解压下载到的包并放在用 ...

  8. cocos2d安卓自动编译脚本去掉复制Resources资源和签名功能

    去掉这两个功能的原因: 1.因为有时候打包是分渠道的,不同的渠道资源也可能不一样,所以不能直接复制资源. 2.如果用cocostudio打release包,因为要输入签名地址,会导致在自动签名处停住不 ...

  9. SSH原理记录

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...

  10. jupyter 修改工作路径

    在所需打开的目录中新建一个runJupyter.bat文件 将内容修改为: cd ......jupyter notebook 注1:上述两行中,第一行的......为路径(可以不添加,可空着不填), ...