1

我正在对 ajax 进行 jQuery 同步调用——返回类型设置为“json”——但是返回数据作为字符串返回。有什么我做错了,或者有没有将字符串转换为对象?

var ajax_response = $.ajax({url:"ajx_services", async:false, type:"post", data:{method: "getItem", item_no: $(ctx).val()}, dataType:"json"});
var data = ajax_response.responseText;

ajax 调用正在工作,我可以在调试器中看到结果,只是返回的数据在字符串中。

4

3 回答 3

1

responseText 将始终是一个字符串。在 $.ajax() 中添加一个带有参数的“成功”回调函数,这将是 JSON 数据。

$.ajax({
    -- other stuff --
  , success: function(data)
    {
        // do something with data
    }
});
于 2009-12-09T19:45:34.030 回答
1

那是因为 $.ajax() 将返回一个实际的 XMLHttpRequest .. 它responseText没有 JSON 等概念。

尝试这个:

var data = (function () {
    var ajaxResponse = '';
    $.ajax({url:"ajx_services", async:false, type:"post", data:{method: "getItem", item_no: $(ctx).val()}, success: function (data) {
        ajaxResponse = data;
    }, dataType:"json"}); 
    return ajaxResponse;
}());

由于ajaxResponse定义在ajax()调用中定义的函数的父闭包中,因此可以设置为函数提供的 JSONdata对象success(在 Ajax 请求成功完成时调用)。然后,ajaxResponse由父闭包返回,然后将其分配给外部data变量。

请注意,这种立即从 中返回修改ajaxResponse的能力ajax()是唯一可能的,因为请求是同步的。如果它是异步的,return ajaxResponse很可能会返回一个空字符串。

于 2009-12-09T19:56:06.963 回答
0

使用 eval 函数,这种方式应该可以工作:

var ajax_response = $.ajax({url:"ajx_services", async:false, type:"post", data:{method: "getItem", item_no: $(ctx).val()}, dataType:"json"});
ajax_response.onreadystatechange = xHandler;

function xHandler() {
  if (ajax_response.readyState == 4) {
    var data = eval('(' + ajax_response.responseText + ')');
  }
}

但正如之前所说,您应该使用 jQuery 成功回调,它的存在是为了让您的生活更轻松。

于 2009-12-09T20:04:27.807 回答