Получение JSON на ответный обратный вызов Ajax - PullRequest
7 голосов
/ 18 мая 2009

Я пытаюсь создать небольшую систему чата ajax (просто так), и я использую prototype.js для обработки части ajax.

В справке я прочитал одну вещь: если вы возвращаете данные json, функция обратного вызова заполнит эти данные json вторым параметром.

Итак, в моем php-файле, который вызывается, у меня есть:

header('Content-type: application/json');

if (($response = $acs_ajch_sql->postmsg($acs_ajch_msg,$acs_ajch_username,$acs_ajch_channel,$acs_ajch_ts_client)) === true)
    echo json_encode(array('lastid' => $acs_ajch_sql->msgid));
else
    echo json_encode(array('error' => $response));

По запросу Ajax у меня есть:

onSuccess: function (response,json) {
                alert(response.responseText);
                alert(json);    
            }

Предупреждение о response.responseText дает мне {"lastid": 8}, но json дает мне ноль.

Кто-нибудь знает, как я могу сделать эту работу?

Ответы [ 4 ]

22 голосов
/ 18 мая 2009

Это правильный синтаксис для получения JSON с прототипом

onSuccess: function(response){
   var json = response.responseText.evalJSON();
}
3 голосов
/ 11 июня 2012

Существует свойство Response: Response.responseJSON, которое заполняется объектами JSON, только если бэкэнд возвращает Content-Type: application / json, т.е. если вы делаете что-то подобное в своем бэкэнд-коде:

$this->output->set_content_type('application/json');
$this->output->set_output(json_encode($answer));
//this is within a Codeigniter controller

в этом случае Response.responseJSON! = Undefined, который вы можете проверить на принимающей стороне, в вашем обработчике onSuccess (t):

onSuccess:function(t) {
  if (t.responseJSON != undefined) 
  {
    // backend sent some JSON content (maybe with error messages?)
  }
  else 
  {
    // backend sent some text/html, let's say content for my target DIV
  }
}

На самом деле я не отвечаю на вопрос о втором параметре обработчика, но если он существует, то Prototype наверняка предоставит его только в случае правильного типа содержимого ответа.

2 голосов
/ 03 февраля 2011

Это происходит от официального прототипа:

Оценка ответа JavaScript Иногда приложение разработано отправить код JavaScript в ответ. Если тип содержимого ответа соответствует MIME-типу JavaScript тогда это правда, и прототип будет автоматически eval () возвращает код. Вам не нужно обрабатывать ответ явно, если вам не нужно.

В качестве альтернативы, если ответ содержит Заголовок X-JSON, его содержимое будет проанализирован, сохранен как объект и отправлен обратные вызовы в качестве второго аргумента:

новый Ajax.Request ('/ some_url', { Метод: «получить», onSuccess: функция (транспорт, JSON) {

  alert(json ? Object.inspect(json) : "no JSON object");

}   

}); * +1011 *

Используйте эту функцию, если вы хотите получить нетривиальный данные с Ajax, но хотят избежать накладные расходы на анализ XML-ответов. JSON намного быстрее (и легче), чем XML.

1 голос
/ 18 мая 2009

Вы также можете просто пропустить рамки. Вот совместимый с браузером способ сделать ajax, используемый в виджете комментариев:

//fetches comments from the server
CommentWidget.prototype.getComments = function() {
  var commentURL = this.getCommentsURL + this.obj.type + '/' + this.obj.id; 
  this.asyncRequest('GET', commentURL, null);
}


//initiates an XHR request
CommentWidget.prototype.asyncRequest = function(method, uri, form) {
  var o = createXhrObject()
  if(!o) { return null; } 
  o.open(method, uri, true);
  o.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  var self = this;
  o.onreadystatechange =  function () {self.callback(o)};
  if (form) { 
    o.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    o.send(makePostData(form)); 
  } else {
    o.send(''); 
  }  
}

//after a comment is posted, this rewrites the comments on the page
CommentWidget.prototype.callback = function(o) {                  
  if (o.readyState != 4) { return }
  //turns the JSON string into a JavaScript object.
  var response_obj = eval('(' + o.responseText + ')');
  this.comments = response_obj.comments;
  this.refresh()
}

Я открыл этот код здесь http://www.trailbehind.com/comment_widget

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