2009-05-17 23 views
7

Estoy tratando de crear un pequeño sistema de chat ajax (por el simple hecho) y estoy usando prototype.js para manejar la parte ajax.Obteniendo json en la devolución de llamada de respuesta Ajax

Una cosa que he leído en la ayuda es que si devuelve datos json, la función de devolución de llamada llenará esos datos json en el segundo parámetro.

Así que en mi archivo php que es llamada que tengo:

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)); 

A petición ajax tengo:

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

La alerta de la response.responseText me da { "lastid": 8} pero el json me da nulo.

¿Alguien sabe cómo puedo hacer que esto funcione?

Respuesta

22

Ésta es la sintaxis correcta para recuperar JSON with Prototype

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

Gracias! Pero sí leí en alguna parte sobre esa cosa del segundo parámetro: P – AntonioCS

+0

Gracias Jose. Sí, http://www.prototypejs.org/learn/introduction-to-ajax dice que el segundo param es json, mierda, no funcionará para mí - onSuccess: function (transport, json) { alert (json? Object. inspeccionar (json): "no hay objeto JSON"); } – umpirsky

1

También puede simplemente omitir el marco. Aquí está una manera multi-navegador compatible que ver Ajax, que se utiliza en un widget de comentarios:

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

I de código abierto este código aquí http://www.trailbehind.com/comment_widget

+0

Cool. Gracias por esto. Acabo de usar un prototipo porque hago algunas cosas más con él, como utilizar el retraso, la actualización y algunas otras cosas pequeñas. – AntonioCS

2

Esto viene desde el prototipo oficial:

La evaluación de una Respuesta de JavaScript A veces, la aplicación está diseñada para enviar código JavaScript como respuesta. Si el tipo de contenido de la respuesta coincide con el tipo MIME de JavaScript , entonces esto es cierto y Prototype evalúa automáticamente() el código devuelto. No necesita manejar la respuesta explícitamente si no es necesario.

Alternativamente, si la respuesta contiene un encabezado X-JSON, su contenido será analiza, salvado como un objeto y enviados a las devoluciones de llamada como el segundo argumento:

nuevo Ajax.Request ('/ some_url', { método: 'conseguir', onSuccess: función (transporte, JSON) {

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

} 

});

Utilice esta funcionalidad cuando desee obtener datos no triviales de con Ajax, pero desee evitar la sobrecarga al analizar las respuestas XML. JSON es mucho más rápido (y más ligero) que XML.

3

Existe una propiedad de Response: Response.responseJSON que se llena con un objeto JSON solo si el servidor devuelve Content-Type: application/json, es decirsi haces algo como esto en su código de fondo:

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

en este caso Response.responseJSON = indefinido que se puede comprobar en el extremo receptor, en su onSuccess (t) manejador:

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

No estoy realmente respondiendo la pregunta sobre el segundo parámetro del controlador, pero si existe, seguro Prototype solo lo proporcionará en caso de un tipo de contenido adecuado de la respuesta.

Cuestiones relacionadas