Fork me on GitHub

使用jQuery Ajax功能的时候需要注意的一个问题


每次jquery的Ajax请求都会创建一个xmlHttprequest对象,理论上讲,长连接(页面需要和服务器保持长连接,而且在连接超时后需要重新请求连接)的请求是一个无限递归,请求数量是非常大的,但是由于每次请求都会建立一个新的xmlhttprequest,而且jquery不会自动回收资源,所以导致了内存溢出。

通过查看jquery API,发现jquery还有一个 complete对象,是请求完成后回调函数 (请求成功或失败之后均调用)。 同时有两个参数XMLHttpRequest, textStatus。所以,我们只需要在请求完成后,将传回的XMLHttprequest对象手工回收即可,代码如下:

$.ajax({
    url: "http://www.aizr.net",
    data: { name: "xxxx" },
    dataType: "xml",
    success: function (data, textStatus) {
       //do something...
    },
    complete: function (XHR, TS) { XHR = null }
});


我们可以重写ajax:

(function($){
    //备份jquery的ajax方法
    var _ajax=$.ajax;
    
    //重写jquery的ajax方法
    $.ajax=function(opt){
        //备份opt中error和success方法
        var fn = {
            error:function(XMLHttpRequest, textStatus, errorThrown){},
            success:function(data, textStatus){}
        }
        if(opt.error){
            fn.error=opt.error;
        }
        if(opt.success){
            fn.success=opt.success;
        }
        
        //扩展增强处理
        var _opt = $.extend(opt,{
            error:function(XMLHttpRequest, textStatus, errorThrown){
                //错误方法增强处理
                
                fn.error(XMLHttpRequest, textStatus, errorThrown);
            },
            success:function(data, textStatus){
                //成功回调方法增强处理
                
                fn.success(data, textStatus);
            }
        });
        _ajax(_opt);
    };
})(jQuery);

这样写的目的就是增强,作用:可以提高用户体验,可以统一处理ajax返回的服务端错误。

posted @ 2013-08-14 11:46  迁梦余光  阅读(273)  评论(0编辑  收藏  举报