手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:phpoo.com

扩展JQuery Ajax请求错误机制

如何对ajax的错误进行更好的处理?本文给出了一个简单的解决方案。想当于类的扩展和继承一样。有新意,一直以来,对于框架我们要么是扩展,要么是写新方法,就从来没有想过要继承这些方法。所以,作者这个给了我很多启发。

原文:http://www.cnblogs.com/lyk831216/archive/2009/04/24/1442791.html

JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,但时间久了,也让我们离不开他。比如简单的Jquery Ajax请求的封装让我们忘却了最原始的XmlHttpRequest对象和他的属性,方法,也让我们远离事情的真相。

在Ajax项目中,经常遇到需要服务器端返回错误的消息提示,或者消息码之类的数据。查过一些帮助,解决方案,很多网站是返回错误的消息JSON数据或者 脚本,这种方式当我们用JQuery.ajax()的时候出现了问题,jquery.ajax()回调函数success(data)的data参数可能 是 xmlDoc, jsonObj, html, text, 等等...这取决于我们dataType设置和MIME.很多时候我们的错误处理都是统一的处理,不管你请求的是XML,JSON...。不光不好统一, 还容易出现解析错误等等情况。

参考了Prototyp框架的做法,做了一个Jquery的错误扩展。

原理:Prototype思路是把服务器处理结果状态信息写在Header里面,这种方式既保证了reponse body的干净,同时适应XML,JSON,HTML,Text的返回情况。

   服务器端只需要 Response.AddHeader("Error-Json""{code:2001,msg:'User settings is null!',script:''}");

实现:为了不影响原有的Jquery.ajax方法,同时不破坏jquery库源文件,做了如下扩展,代码很简单都能看懂:

JavaScript代码
  1. ;(function($){  
  2.     var ajax=$.ajax;  
  3.     $.ajax=function(s){  
  4.         var old=s.error;  
  5.         var errHeader=s.errorHeader||"Error-Json";  
  6.         s.error=function(xhr,status,err){  
  7.             var errMsg = window["eval"]("(" + xhr.getResponseHeader(errHeader) + ")");  
  8.             old(xhr,status,errMsg||err);  
  9.         }  
  10.         ajax(s);  
  11.     }  
  12.   
  13. })(jQuery);   

使用方法:

  服务器端:我们是对错误进行扩展,如果要让jquery.ajax破获[膘叔:应该为捕获]错误,必须要服务器端返回非200的错误码,由于Opera浏览器下面对 400以上的错误码,都无法获得请求的Header,建议如果要支持Opera,最好返回30*错误,这是Opera能接受Header的错误范围。没有 做包装,可以再单独把Catch内容出来。

C#代码
  1. try {  
  2.     context.Response.Write(GetJson(context));  
  3.     throw new Exception("msg");  
  4. }  
  5. catch {  
  6.     context.Response.ClearContent();  
  7.     context.Response.StatusCode = 300;  
  8.     context.Response.AddHeader("Error-Json""{code:2001,msg:'User settings is null!',script:''}");  
  9.     context.Response.End();  
  10. }  

 客户端:

JavaScript代码
  1. $.ajax({  
  2.     url: this.ajaxUrl,  
  3.     type: "POST",  
  4.     success: callback,  
  5.     error: function(xhr,status,errMsg){  
  6.     alert(errMsg.code+"<br/>"+errMsg.msg);  
  7.     }  
  8. });  

也许不是最好的,但觉得用起来很方便,忘了个写新增参数errorHeader:"Error-Json",这个header头key根据你后台设定配置。

 

 

 

Tags: jquery, 扩展

思维决定出路

其实我要讲的并非什么大道理,而是我在读者上看到的一篇文章。内容大概讲的是文章作者(简称作者)乘大巴回杭州,让大巴司机在城北的某个路口放他下来——因为如果乘到终点站,那他到家的路程比从那个路口回到家中的路程远的多。

刚下车,就有一出租车过来。上车后,司机说:这路口每天晚上都有从大巴下来的顾客,在这里等是一等一个准。如果去车站的话,那边同行太多,和他们抢生意,不一定能抢得过。而现在这样,运气好的话,一天可以赚两天的钱。作者非常感慨,认为司机非常会做生意。不料司机说,这是他老婆教她的。

说到这里,或许有人在猜想,这。。。。怎么和以前那个了出租车MBA的故事很象?但事实并不是这样。

司机说他老婆不是开出租的,是擦鞋的,一天赚的钱是同行的四五倍。作者不信,于是司机一一道来:

他老婆每天起早,先到汽车客运站,有很多人等车,很无聊,这时候正好擦擦皮鞋。8、9点的时候,擦鞋的多了,她就到洗车店那里去,帮那些在洗车并且很无聊的人擦皮鞋,11点左右去车站附近的小饭店,那些在等上菜的人,也可能会擦皮鞋。下午1点多人少的时候,再去洗车店。再晚一点的时候,去写字楼门口,那些想去约会的小青年也会去擦擦皮鞋。

故事就这样结束了,虽然我认为事情可能是虚构的,但讲的道理也是有的:大多数人在做的事情,要么抢在他们前面,要么就干脆放弃。

顺便再讲个网上关于白领的新定义:今天发薪水,交了房租、水电费,买了油、米、煤气和泡面,摸摸口袋,感慨一下,这个月工资又白领了。

Tags: 出路, 思维, 出租车司机, 擦鞋