【问题标题】:jquery ajax post - json is returning but not working rightjquery ajax post - json正在返回但无法正常工作
【发布时间】:2009-12-30 10:20:16
【问题描述】:

我已经为我想用 javascript(使用 jquery)编写的 ajax/post/update 函数启动了以下框架:

$.post("/gallery/resize",
  function (data) {
    alert(data);
    alert(data.complete);
    if (data.complete) {
      alert("done");
    } else {
      alert("blah");
    }
  },
  "json"
);

而服务器上的响应脚本是:

$return['complete'] = 'complete';
header('Content-type: application/json');
echo json_encode($return);
exit;

FireBug 控制台显示我得到一个 JSON 字符串作为响应 - 但 data.complete 的值是“未定义”。这是 FireBug 报告的来自服务器的字符串(我在控制台中 XHR 显示​​下的 JSON 选项卡下也有相应的值/数据对):

{"complete":"complete"}

关于我可能错过的任何指示......

我正在使用 localhost 服务器 - ubuntu 上的 apache - 如果这有什么不同?

【问题讨论】:

  • 你能把萤火虫在 xhr 请求的响应标签中显示的准确的 json 字符串贴出来吗?
  • 已添加字符串,显示在 FireBug 控制台中

标签: javascript ajax json jquery


【解决方案1】:

哦,男孩 - 原来我有点太相信 jQuery 的强大功能 - 我在 $.post() 方法中遗漏了一个参数,除非你想指定其他东西,否则它可能是可选的。

奇怪的是,回调可以在没有设置前面的数据参数的情况下工作 - 但是当你想要设置数据类型时它会崩溃(并且必须设置数据和回调)。

所以 - 我想要的正确代码是:

$.post("/gallery/resize", "",
  function (data) {
    alert(data);
    alert(data.complete);
    if (data.complete) {
      alert("done");
    } else {
      alert("blah");
    }
  },
  "json"
);

【讨论】:

  • 谢谢!我遇到了同样的问题:)
【解决方案2】:

我不确定 jQuery 如何解析 JSON 数据,但可能是 JSON 字符串被错误地评估。如果您在 FireBug 控制台中输入 {"complete":"complete"},它将被解释为块语句而不是对象文字("complete" 属性名称被评估为标签)。这可以通过评估({"complete":"complete"}){complete:"complete"} 或在{"complete":"complete"} 上使用JSON.parse 来解决。解决此问题的最快方法是从 $.post 调用中删除 "json" 参数并自己解析数据,如下所示:

$.post("/gallery/resize",
  function (data) {
    var obj;
    if (JSON.parse) {
      obj = JSON.parse(data);
    } else {
      obj = eval("(" + data + ")"); // obligatory eval() warning
    }
    if (data.complete) {
      alert("done");
    } else {
      alert("blah");
    }
  }
);

顺便说一句,如果您正在使用 Firebug 进行调试,请始终尝试使用 console.log 而不是 alert - 它不会中断 JS 的执行,并且它提供的 JSON 序列化信息比 [object Object] 更多信息

【讨论】:

  • 在console.log 上足够公平,但根据jQuery 自己的$.post 手册页,您不需要解析数据-docs.jquery.com/Ajax/jQuery.post
  • 嗯 - 它确实让我前进......通过 JSON.parse() 传递值“数据”现在让我得到一个合适的对象。奇怪
【解决方案3】:

试试这个:

header('Content-Type: application/json');
$return = array('complete' => 'complete');
echo json_encode($return);
exit;

【讨论】:

  • 这没什么区别——除了所有关于 PHP 标头的文档和内容类型标头都表明它应该是 Content-type
【解决方案4】:

JSON 数据就像一个 javascript 数组。所以你应该以同样的方式访问它。

因此,在您提供的代码中,您应该以这种方式访问​​“完整”条目:

data.items[0].complete

这应该可以解决问题。

You may look here 获取更多 jQuery/JSON 信息。

【讨论】:

  • JSON 不像 javascript 数组 - 它是 JS 对象的简明表示法,可以轻松传输数据 - 在可能的情况下,“数据”是对象,“完整”应该是那个物体。 jQuery 或浏览器显然应该将 JSON 解析为一个对象 - 所以我应该能够从我的响应中获取 data.complete 的值。
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多