【问题标题】:Error: jQuery1830649454693285679_1359620502896 was not called JSON错误:jQuery1830649454693285679_1359620502896 未被调用 JSON
【发布时间】:2013-01-15 07:02:03
【问题描述】:

我已经阅读了很多很多关于同一问题的问答,但没有一个是我的具体问题(至少不是我能找到的)。

我有一个回显 json 字符串的 php 脚本

header('Content-Type: application/json');
echo $result;

返回的JSON(用JSONLint检查并且有效):

{"Announcement":{"ID":1,"Type":1,"Text":"This is a test Albums announcement.","TimeStart":"1969-12-31","TimeEnd":"1969-12-31"}}

还有一个读取 json 的 web jquery 脚本:

$.ajax({
        type : "GET",
        url : "http://b***s.net/S****s/GetAnnouncements.php?callback=?",
        data : {get_param : "Announcement"},
        dataType : "json",
        error : function(jqXHR, textStatus, errorThrown) {alert(errorThrown); alert(textStatus);},
        success : function(data) {alert('success');
            $.each(data, function(index, element) { alert('here');
                $("#announcements-list").append("<li><a id='announcements-a-" + element.ID + "' href='#announcement-details'><p>" + element.Type + ": " + element.Text + "</p></a></li>");
                $("#announcements-a-" + element.ID).bind('click', function() {Announcements.AnnouncementID = element.ID;});
            });
            $("#announcements-list").listview('refresh');
        }
    });

success: 永远不会被调用。而error: 返回一个textStatus"parsererror"errorThrown"Error: jQuery1830649454693285679_1359620502896 was not called"

  • 我已将 callback=? 添加到 url 以解决跨域问题。
  • 我已将header('Content-Type: application/json'); 发送到php,它返回NO html。
  • 我已经用JSONLint 验证了 JSON 的有效性
  • 我已经尝试删除data: "json",正如一些答案所说,但仍然返回parsererror
  • 使用 jQuery 1.8.3

【问题讨论】:

  • @salmanA 是的,应该这样,我感到很尴尬......不过,不幸的是,这并没有改变结果...... :(
  • 仅添加callback=? 不会自动解决跨域问题...服务器必须返回 JSONP 才能正常工作。 (否则它不会是一个安全功能。)
  • @Juhana 现在已经提到了,我知道要搜索什么,现在正在将修改添加到我的 php 中。

标签: php jquery ajax json parse-error


【解决方案1】:

您的服务器和客户端脚本不能相互补充。你有两个选择:


让你的服务器端脚本返回 JSON:

Content-Type: application/json

{"Announcement":{"ID":1}}

并省略回调参数:

$.ajax({
    type : "GET",
    url : "http://example.com/feed/json.php",
    dataType : "json"
});

让您的服务器端脚本返回 JSONP,即包装在回调函数中的 JSON:

Content-Type: application/javascript

jQuery_xxxxxxxx({"Announcement":{"ID":1}});

并将数据类型更改为 jsonp:

$.ajax({
    type : "GET",
    url : "http://example.com/feed/json.php",
    dataType : "jsonp"
});

请注意,对于此类请求,jQuery 会默默地将 &amp;callback=jQuery_xxxxxxxx 附加到 URL。 服务器应使用 URL 中指定的回调名称。你可以这样做:

echo sprintf(
    "%s(%s);",
    isset($_GET["callback"]) ? $_GET["callback"] : "void",
    json_encode($data)
);

【讨论】:

  • 感谢您为我指明了正确的方向。我用了答案here(和你的一样)现在效果很好。
【解决方案2】:

我刚刚尝试过,这里是跨域测试的解决方案

$.ajax({
    type : "GET",
    url : "http://******/14621356.php",
    data : {get_param : "Announcement"},
    dataType : "jsonp",
    error : function(jqXHR, textStatus, errorThrown) {alert(errorThrown); alert(textStatus);},
    success : function(data) {alert('success');
        $.each(data, function(index, element) { alert('here');
            $("#announcements-list").append("<li><a id='announcements-a-" + element.ID + "' href='#announcement-details'><p>" + element.Type + ": " + element.Text + "</p></a></li>");
            $("#announcements-a-" + element.ID).bind('click', function() {Announcements.AnnouncementID = element.ID;});
        });
        $("#announcements-list").listview('refresh');
    }
});

对于php

header('Content-Type: application/json');
echo $_GET['callback'].'('.'{"Announcement":{"ID":1,"Type":1,"Text":"This is a test Albums announcement.","TimeStart":"1969-12-31","TimeEnd":"1969-12-31"}}'.')';

注意dataType中的jsonp。

【讨论】:

  • 我缺少的是 echo $_GET['callback'] . "(" . $json . ");" 部分。我不知道您必须在函数中回显它。谢谢。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2018-08-02
相关资源
最近更新 更多