Ошибка: jQuery1830649454693285679_1359620502896 не был вызван JSON

Я прочитал много-много вопросов и ответов по одной и той же проблеме, но ни у одного из них нет моей конкретной проблемы (по крайней мере, я не смог найти).

У меня есть скрипт php, который возвращает строку json

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"}}

И веб-скрипт jquery, который читает json:

$.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, и он не возвращает HTML.
  • Я проверил действительность JSON с помощью JSONLint
  • Я попытался удалить data: "json", как говорится в некоторых ответах, но по-прежнему возвращает parsererror
  • Использование jQuery 1.8.3

person SnareChops    schedule 31.01.2013    source источник
comment
@salmanA Да, должно, и мне неловко ... Хотя, к сожалению, это не повлияло на результат ... :(   -  person SnareChops    schedule 31.01.2013
comment
Простое добавление callback=? не позволяет автоматически решить междоменные проблемы ... Сервер должен возвращать JSONP, чтобы он работал. (В противном случае это не было бы важной функцией безопасности.)   -  person JJJ    schedule 31.01.2013
comment
@Juhana Теперь, когда это было упомянуто, я знал, что искать, и сейчас добавляю модификации в свой php.   -  person SnareChops    schedule 31.01.2013


Ответы (2)


Ваши серверные и клиентские скрипты не дополняют друг друга. У вас есть два варианта:


Сделайте так, чтобы ваш серверный скрипт возвращал 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 молча добавляет &callback=jQuery_xxxxxxxx к URL-адресу для таких запросов. Сервер должен использовать имя обратного вызова, указанное в URL-адресе. Вы можете сделать что-то вроде этого:

echo sprintf(
    "%s(%s);",
    isset($_GET["callback"]) ? $_GET["callback"] : "void",
    json_encode($data)
);
person Salman A    schedule 31.01.2013
comment
Спасибо, что указали мне правильное направление. Я использовал ответ здесь (который совпадает с вашим), и он работает красиво сейчас. - person SnareChops; 31.01.2013

Я просто попробовал, и вот решение, протестированное в кросс-домене

$.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"}}'.')';

Позаботьтесь о jsonp в dataType.

person Spin0us    schedule 31.01.2013
comment
Это была echo $_GET['callback'] . "(" . $json . ");" часть, которой мне не хватало. Я не знал, что вы должны повторить это в функции. Спасибо. - person SnareChops; 31.01.2013