Ajax tepki geri arama json Başlarken

4 Cevap php

Ben (tıpkı o halt için) biraz ajax sohbet sistemi oluşturmak için çalışıyorum ve ben ajax parçası ele prototype.js kullanıyorum.

Ben yardım okudum Bir şey json veri dönerseniz, geri çağırma işlevi ikinci parametre bu json veri doldurmak olacaktır.

Yani benim php dosyasında denilen alır var:

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 isteği üzerine ben:

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

Response.responseText bir uyarı beni {"lastid": 8} verir ama json bana boş veriyor.

Herkes bu işi yapmak nasıl biliyor?

4 Cevap

Bu almak için doğru sözdizimi JSON with Prototype

onSuccess: function(response){
   var json = response.responseText.evalJSON();
}

Yanıtın bir özelliği vardır: Bir JSON ile doludur Response.responseJSON nesneleri arka uç Content-Type döndürür yalnızca: application / json, yani arka uç kod böyle bir şey yaparsam:

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

Bu durumda Response.responseJSON = Eğer alıcı ucunda kontrol edebilirsiniz hangi tanımsız, sizin onSuccess (t) işleyicisi içinde!:

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

Gerçekten işleyici ikinci parametresi hakkında soruyu cevaplarken değilim, ama eğer var, emin Prototip sadece cevabın doğru içerik türü durumunda bunu sağlayacaktır.

Bu Prototip resmi geliyor:

Evaluating a JavaScript response Sometimes the application is designed to send JavaScript code as a response. If the content type of the response matches the MIME type of JavaScript then this is true and Prototype will automatically eval() returned code. You don't need to handle the response explicitly if you don't need to.

Alternatively, if the response holds a X-JSON header, its content will be parsed, saved as an object and sent to the callbacks as the second argument:

new Ajax.Request('/some_url', { method:'get', onSuccess: function(transport, json){

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

}   

});

Use this functionality when you want to fetch non-trivial data with Ajax but want to avoid the overhead of parsing XML responses. JSON is much faster (and lighter) than XML.

Ayrıca, sadece çerçeve atlayın. İşte yorumlar widget kullanılan ajax yapmak için bir çapraz tarayıcı uyumlu şekilde, var:

//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()
}

Ben burada bu kodu açmak kaynaklı http://www.trailbehind.com/comment_widget