知道为什么我的jQuery .ajax()函数不会运行'success'部分吗?

时间:2012-06-12 19:10:00

标签: jquery ajax

我有以下代码:

$.ajax({
    async: false,
    url: 'chart_data.php',
    data: {'option':'high', 'id':id},
    dataType: 'json',
    success: function(response){
        alert('in');
        var data = google.visualization.arrayToDataTable(response);
        var options= { curveType:'none', width: 300, height: 200, hAxis: {title:'Years'}, vAxis: {title:'Value'}, title: 'High Time - Low Value' };
        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
        chart.draw(data, options);  
    }
});

在网页中。我想根据下拉菜单显示图表。功能的其余部分工作得很好。我检查了Firebug,JSON响应通过200 OK状态消息传来。事实上,我可以在Firebug中看到所有的JSON。

问题仍然存在,为什么alert('in');永远不会被触发,为什么谷歌不会将它的图表加载到关联的图表div中?

编辑:

添加错误回调时出现以下错误: parseerror SyntaxError:JSON.parse:意外字符。

这是来自服务器的JSON响应:

[['Year', 'Low', 'High'],['1984', 318000, 395000],['1984', 418000, 495000],
['1984', 380000, 450000],['1984', 410000, 460000],['1984', 410000, 460000],
['1985', 435000, 485000],['1985', 435000, 485000],['1985', 435000, 485000],
['1985', 435000, 485000],['1985', 435000, 485000],['1985', 435000, 485000],
['1985', 435000, 485000],['1985', 435000, 485000],['1985', 318000, 395000],
['1985', 418000, 495000],['1985', 380000, 450000],['1985', 420000, 470000],
['1985', 420000, 470000]]

虽然我对JSON结构并不是100%肯定,但对我来说看起来是正确的。

编辑:

我做了一些改动,似乎我进一步了解。首先,我从PHP脚本中删除了header('Content-type: application/json');行。然后我将dataType: 'json'更改为dataType: 'html'

现在加载$ .ajax()调用中的成功回调。当我尝试将其发送到Google的arrayToDataTable()方法时,它不喜欢文本响应。

如果我可以将返回的字符串(看起来像上面的JSON响应,实际上不是JSON响应)解析为javascript数组,那么我就是金色的。我希望。

编辑:

我最终在成功回调中使用eval语句将http响应转换为数组eval('var res = ' + response);这可能不是最好的方法。如果某人有更好(更安全)的方式,那就太好了。

编辑:

我真的不喜欢使用eval语句,因此我研究了将返回字符串更改为数组的其他方法。在我遇到这个小宝石之前,我并不关心它们中的任何一个:

response = JSON.parse(response);

这没有问题。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

好的还没有人回答,所以我会在这里试一试。您似乎已更新了错误消息以及从ajax调用获得的返回值。

问题是你收到的不是JSON对象,而是javascript数组。 JSON对象将用大括号{和}封装,而数组则用方括号[和]包围。

您应该通过ajax修改您正在调用的脚本,以便它返回一个正确的JSON对象(在php中使用json_encode非常方便)。

您希望您的回复看起来更像这样:

{"data":[["Year", "Low", "High"],["1984", 318000, 395000],["1984", 418000, 495000],
["1984", 380000, 450000],["1984", 410000, 460000],["1984", 410000, 460000],
["1985", 435000, 485000],["1985", 435000, 485000],["1985", 435000, 485000],
["1985", 435000, 485000],["1985", 435000, 485000],["1985", 435000, 485000],
["1985", 435000, 485000],["1985", 435000, 485000],["1985", 318000, 395000],
["1985", 418000, 495000],["1985", 380000, 450000],["1985", 420000, 470000],
["1985", 420000, 470000]]}

根据google,他们正在寻找类似的东西:

{
   cols: [{id: 'task', label: 'Task', type: 'string'},
          {id: 'hours', label: 'Hours per Day', type: 'number'}
   ],
   rows: [{c:[{v: 'Work'}, {v: 11}]},
          {c:[{v: 'Eat'}, {v: 2}]},
          {c:[{v: 'Commute'}, {v: 2}]},
          {c:[{v: 'Watch TV'}, {v:2}]},
          {c:[{v: 'Sleep'}, {v:7, f:'7.000'}]}
   ]
 }

那么,您是否真的需要重新编写数据以首先遵循此结构?像这样:

{
  "cols": [{"id":"year", "label":"Year", "type":"string"},
         {"id":"low",  "label":"Low",  "type":"string"},
         {"id":"high", "label":"High", "type":"string"}],
  "rows": [{"c":[{"v":"1984"}, {"v":"318000"}, {"v":"395000"}]},
         {"c":[{"v":"1984"}, {"v":"418000"}, {"v":"495000"}]},
         {"c":[{"v":"1984"}, {"v":"380000"}, {"v":"450000"}]},
         {"c":[{"v":"1985"}, {"v":"420000"}, {"v":"470000"}]}]
}

如果JSON看起来有点令人困惑,你可以在这里阅读更多相关内容:http://www.json.org/

修改

考虑到我忽略了.arrayToDataTable()函数调用,我想我应该从Google的文档引用这个例子(链接已在上面引用):

// Version 1: arrayToDataTable method
var data2 = google.visualization.arrayToDataTable([
  ['Country', 'Population', 'Area'],
  ['CN', 1324, 9640821],
  ['IN', 1133, 3287263],
  ['US', 304, 9629091],
  ['ID', 232, 1904569],
  ['BR', 187, 8514877]
]);

由于您的阵列是这样的:

[['Year', 'Low', 'High'],
 ['1984', 318000, 395000],
 ['1984', 418000, 495000],
 ['1984', 380000, 450000],
 ['1984', 410000, 460000],
 ['1984', 410000, 460000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 435000, 485000],
 ['1985', 318000, 395000],
 ['1985', 418000, 495000],
 ['1985', 380000, 450000],
 ['1985', 420000, 470000],
 ['1985', 420000, 470000]]

似乎格式正确,我认为您应该尝试将ajax调用中的“dataType”更改为“text”而不是“json”,因为您实际上是在返回数组而不是JSON对象。这应该可以解决你的问题。

答案 1 :(得分:1)

您的JSON格式存在错误,字符串必须是双引号(“)而不是单引号(')

如果您想检查JSOn是否有效,可以使用this