Как заставить JQuery принять ответ JSON? - PullRequest
3 голосов
/ 28 июня 2010

Вот простой Javascript:

(function($){
    var ajax_callback = function(data) { window.location.hash = data.h1; };
    $('.clickable').live('click', function() { 
             $.post('server.fcgi', {}, ajax_callback, 'json');
         }
    );
})(jQuery);

Сервер представляет собой двоичный файл c ++ (да, я знаю), который выплевывает (через fast_cgi) строку: {"h1":"newhash"}.

Ожидаемое поведение - URL должен измениться. Вместо этого ничего не происходит, и Firebug жалуется, что «данные» являются «нулевыми» !. Любая помощь будет принята с благодарностью!

Will.

Когда следующий код вводит «ajax_callback», он говорит, что «data» равен «null» !. Но сервер представляет собой двоичный файл c ++, который, как подтверждается, возвращает строку JSON {"h1":"newhash"}. У кого-нибудь есть идея, почему JQuery не может принимать данные JSON при вызове ajax_callback?

Ответы [ 3 ]

2 голосов
/ 28 июня 2010

У меня была такая же проблема, как вы упоминали при использовании $ .POST ().Есть две вещи, если вы используете метод jquery $ .post.Вам нужно добавить дополнительную скобку перед определенным типом данных ("JSON"), как показано ниже.Я не знаю почему, но это работает, он вернет данные.

$.post('server.fcgi', {}, ajax_callback,{}, 'json');

Во-вторых, вам необходимо проанализировать данные JSON, используя $ .parseJSON (data) в стороне от функции обратного вызова.

Еще одна вещь, чтобы убедиться, что URLизвлеките JSON, тип документа страницы должен быть определен как JSON в заголовке.

Я привел пример ниже.

$.post("url/path/here/to/json", {}, function(data){

    if(data){ // just in case the called program had a problem
         var obj =  $.parseJSON(data);
        .... do everything else using the Obj->         
    }
},{},"json");

Это будет работать.

Однако я рекомендую вам использовать другую функцию Jquery, специально реализованную для JSON, которая называется

$.getJSON();

Вот это url для получения дополнительной информации

И я предлагаю вам использовать следующий метод вместо описанного вами.

$(document).ready(function(){

    $('.clickable').live('click', function() { 
             $.getJSON('server.fcgi', function(data){
                         window.location.hash = data.h1;
              });
         }
    );
});
0 голосов
/ 28 июня 2010

Вероятно, не тот ответ, который вы хотите услышать, но я предполагаю, что вы используете jQuery 1.4.2? Я заметил, что это работает, как и ожидалось в 1.3.2, поэтому вы можете рассмотреть возможность использования этого вместо. (

0 голосов
/ 28 июня 2010

Убедитесь, что сервер также возвращает правильные заголовки HTTP перед полезной нагрузкой. E.g.:

HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: ...
...

{"h1":"bla"}

Из вашего описания я не мог разобрать, все ли это было printf("{\"h1\":\"bla\"}"); или нет.

Чтобы проверить фактический результат, используйте инструмент командной строки, например HEAD, GET, wget, curl или даже nc. Если вы не можете использовать один из них, вы можете получить некоторые подсказки с панели «Сеть» в Firebug и т. П.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...