jQuery dataFilter以某种方式导致将空数据发送到ajax成功回调

时间:2011-04-08 09:46:03

标签: jquery ajax

我为我的jQuery调用定义了一个ajax dataFilter,它返回JSON数据以确保.Net编码的日期在返回时自动转换为JavaScript日期:

$.ajaxSetup({
    dataFilter: function(data, type) {
        var rx = /"\\\/Date\(([0-9]+)\)\\\/"/g;
        if(type == 'json' && typeof(data) == 'string' && rx.test(data)) {
            var obj = JSON && JSON.parse ? JSON.parse(data) : eval(data);
            replaceMicrosoftJSONDates(obj);
            return obj;
        }
        return data;
    }
});

replaceMicrosoftJSONDates功能正常;它以递归方式遍历对象并将匹配相应日期格式字符串的字符串替换为实际的JavaScript日期,但此处用于测试目的:

function replaceMicrosoftJSONDates(obj) {
    for(var p in obj)
        switch(typeof(obj[p])) {
            case 'string':
                var match = /^\/Date\(([0-9]+)\)\/$/.exec(obj[p]);
                if(match) obj[p] = new Date(parseInt(match[1]));
                break;
            case 'object':
                replaceMicrosoftJSONDates(obj[p]);
                break;
        }
}

问题在于dataFilter函数。如果我返回修改后的JSON对象,null将作为data参数发送到ajax success回调:

$.ajax({
    type: 'GET',
    cache: false,
    url: __appPath + 'path/to/my/page',
    success: function(data) {
        console.log(data); // displays null
    }
});

据我所知,此过程中涉及的jQuery私有函数是ajaxConvert,您可以在https://github.com/jquery/jquery/blob/master/src/ajax.js#L897-979

看到

请记住以下内容:

  • 这不是跨域脚本调用
  • 服务器返回HTTP200(OK)响应,responseText具有完整数据
  • 数据正在正确发送到dataFilter函数
  • dataFilter函数似乎正确解析和修改响应并返回已经解析并准备好使用的有效JavaScript对象

如果我从dataFilter函数返回一个字符串,jQuery正确地完成它的工作并向我发送一个解析的JSON对象。如果我返回一个预解析的JavaScript对象,jQuery会将null发送到我的success回调。我在这种情况下使用jQuery 1.5.2,此过滤器使用在其他应用程序和旧版本的jQuery中工作。现在突然间它似乎不再起作用了。

此处:http://forum.jquery.com/topic/datafilter-function-and-json-string-result-problems

2 个答案:

答案 0 :(得分:3)

Rick Strahl最近遇到了类似的问题(这似乎是针对jQuery 1.5.2的)。因为我不想复制他的作品,所以这是他的解决方案,可以很容易地指导你解决问题:http://codepaste.net/i89xhc

答案 1 :(得分:1)

从我的经历中快速评论一下:

无论你将dataFilter方法用于远程验证,只要确保它返回stringyfied布尔值,就像这样:

     return   $.toJSON(true)  
  or 
     return  $.toJSON(false)

我失去了几个小时才能找到这个:)