【问题标题】:jQuery $.post not returning datajQuery $.post 不返回数据
【发布时间】:2013-02-27 18:11:04
【问题描述】:

我正在使用 $.post 通过 ajax 将表单发送到 PHP 页面,该页面返回 JSON 数据。曾几何时,它运行良好,并且函数(数据)正常执行。不知何故,我把它弄坏了,现在它甚至没有触及函数(数据)。我已经尝试撤消我所做的大部分工作,但我仍然找不到问题。

这是脚本:

$("#modifyhome").submit(function(event) {
    if($("#modifyhome").valid()) {  
        event.preventDefault();

        var $form = $( this ),
            title = $form.find('input[name="title"]').val(),
            content = $form.find('textarea[name="content"]').val();

        $.post("?action=page-accueil", {"title": title, "content": content},
            function(data) {            
                if(data['error'] == 1)
                {           
                    $().message(data['message']);
                    $("div.jquery-message").effect("shake", {times: 3}, 900);
                }
                else if(data['error'] == 0)
                {           
                    $().message(data['message']);
                    $("div.jquery-message").effect("bounce", {times: 3}, 900);
                }
                else
                {           
                    $().message("Erreur de connexion au serveur : veuillez réessayer.");
                    $("div.jquery-message").effect("shake", {times: 3}, 900);
                }
            }, "json"
        );
    }
    else
    {
        $("[id^=qtip-]").effect("pulsate", {times: 3}, 600);
        return false;
    }
});

这是 PHP 页面 (?action=page-accueil) 返回的内容:

{"error":0,"message":"Page modifiée."}

所有这些都被检查为有效的 JSON,但 jQuery 好像由于某种原因无法识别它。非常感谢任何帮助:)

【问题讨论】:

  • 添加错误回调并发布结果。 $.post(...).fail(function(){ console.log(arguments); });
  • 如果您将post 调用更改为等效的ajax 调用并使用error 回调,您将获得有用的信息。
  • 您是否使用 chrome 或 firebug for firefox 检查了错误/网络控制台?
  • @R.S:是的,我做到了,0 个错误。 T.J.克劳德:现在正在努力。
  • 您的描述有冲突。我看到你发帖到?action=page-accueil,但你的PHP页面?page=page-accueil返回。不同的是“action=”和“page=”。可能是您的 php 没有返回任何内容。

标签: javascript jquery ajax json post


【解决方案1】:

你不清楚问题是什么。一开始你说

不知怎的,我把它弄坏了,现在它甚至没有触及函数(数据)

但是你说 jQuery 没有识别你的 JSON,这意味着回调函数被调用了。您需要测试流程的每个阶段以发现错误。在这种情况下,必须使用浏览器控制台进行调试。

测试用例:

  1. 服务器是否返回任何内容?如果没有

    • php代码有错误吗?可能返回 500 错误或返回 OK,但错误消息为字符串。
    • 是否存在同源问题?可能会采用 HTTP -> HTTPS?
  2. 如果服务器正在返回某些内容但未正确解析。

    • 返回的数据是否为有效的 JSON?对于 PHP,您应该使用 json_encode 函数(如果可用)或类似的东西。 jQuery 端有 jQuery.parseJSON()
    • 响应类型的标头是否存在问题?在这种情况下,您需要使用普通的 $.ajax 并将 beforeSend 参数设置为类似于 beforeSend: function(xhr){ xhr.setRequestHeader("Accept", "text/javascript") }。您需要进一步研究此选项。

要测试其中的任何内容,您必须熟悉浏览器控制台。 Chrome Network PanelFirebug Net Tab

【讨论】:

  • 查看原始帖子中的 cmets,我对 Firebug 非常熟悉,PHP 文件(位于完全相同的域中,没有 HTTPS)返回以下内容:{"error": 0,"message":"Page modifiée."} 这是有效的 JSON,根据 jsonlint.com,但 $.ajax 函数返回“parsererror”。
  • 尝试将dataType响应设置为“text”而不是“json”,然后使用jQuery.parseJSON(data)。
【解决方案2】:

我也遇到过这个问题,不知道是什么原因。但我有一个可行的解决方案。

$.post("?action=page-accueil", 
    {"title": title, "content": content},
    function(data) {
        data = eval("("+data+")");
        //.... Then continue it
});

或者,如果您不想使用eval(),请使用.parseJSON() 函数将字符串读取为JSON,

$.post("?action=page-accueil", 
    {"title": title, "content": content},
    function(data) {
        data = $.parseJSON(data);
        //.... Then continue it
});

【讨论】:

  • 使用eval(非必要时)在编码风格和性能方面似乎是一个糟糕的主意,至少对我来说是这样。
  • 只有在返回 json 时忘记将 dataType 设置为 "json" 时才会发生这种情况,在这种情况下是正确的。
  • @KevinB,我并不总是记得有完全相同的问题,即使提供 'json' 作为返回类型。
  • @dirkk,为什么这会是个问题?我了解与使用 eval() 相关的风险,但这些风险均不适用于此处。
  • 如果你将数据类型设置为 json 并得到一个字符串而不是一个对象或数组,那么你遇到了一个重大错误(或者你的 json 不是 json)
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2011-04-07
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多