2010-06-11 29 views
8

Actualmente tengo un chat basado en Ajax, que estoy intentando simplificar cargando solo el script de chat cuando ocurre una actualización. Por lo tanto, nada tiene que seguir cargando si no ha cambiado nada en la base de datos.Chat de Ajax: solo se actualiza si hay un cambio

Mi lógica actual dice:

  • función de JavaScript dispara cada medio segundo para obtener los registros (setInterval())

Si nada ha cambiado, sin embargo, parece bastante ineficiente para seguir llamando a chatear eso. En su lugar, lo que me gustaría hacer es:

  1. cheques JavaScript función si hay nuevos registros en la base de datos
  2. Si SI - cargar los nuevos registros, si NO - abandonan los registros mostrados actualmente solo.

¿Cómo podría hacer esto? La función que estoy usando actualmente es:

function updateShouts() { 
    $('#chatArea').load('chat.php'); // load chat logs 
} 
setInterval("updateShouts()", 500); // call function every half a second 

Respuesta

0

Como sabe, la función .load llena un elemento con el resultado devuelto por su archivo chat.php. Esta función .load realiza dos pasos: realiza una solicitud de ajax a chat.php y luego establece el valor del elemento a la salida de chat.php. Lo que quieres hacer es solo el primer paso. Para ello utilice la función .ajax

http://api.jquery.com/jQuery.ajax/

En lugar de utilizar el archivo chat.php Yo sugeriría llamar a un guión diferente como isChatUpdated.php. Ese script hará exactamente lo que sugiere el nombre y verifica si ha habido algún cambio en el chat. A continuación, puede usar ese resultado para determinar si necesita llamar a su función .load.

+0

Con la función Ajax ¿cómo se consigue el valor devuelto por el chequeo del script php? – Dave

+0

Debe especificar una función de devolución de llamada "exitosa". Verás cómo funciona en la página a la que te he vinculado. –

0

De cualquier forma debe consultar el archivo db en el lado del servidor, por lo que es casi irrelevante si devuelve datos de registro o un único valor.
Puede decidir no actualizar #chatArea, en función de un valor de retorno, pero debe realizar otra llamada para recuperar los registros, de lo contrario.

1

Una forma relativamente simple de hacer esto es usar AJAX para buscar una página que simplemente le dice si ha habido alguna actualización. Por ejemplo, puede buscar una página como checkForUpdate.php que tiene un 1 o un 0 para indicar si hay algo nuevo en el chat. Si obtuvo un 1 de vuelta, puede continuar y cargar la página completa chat.php.

(Si no ha utilizado AJAX antes, este es un muy buen tutorial: http://www.tizag.com/ajaxTutorial/)

Otra solución (y uno que creo que es probablemente mejor) es cargar una página que sólo tiene el más reciente líneas de chat. Por ejemplo, supongamos que actualmente muestra las líneas 1 a 14 del chat. A continuación, puede usar AJAX para buscar el contenido de, por ejemplo, getLines.php?s=14. Esta página solo mostraría las líneas del chat después de la línea 14. A continuación, solo agregaría esas líneas al final de la ventana de chat actual.

+0

+1 solo para cargar líneas "nuevas" (para el cliente). – timdev

3

Pasaría timestamp s (o message_id s) junto con los mensajes de chat que la secuencia de comandos del servidor envíe a un cliente. Entonces el cliente simplemente solicita nuevos mensajes, y el servidor solo envía novedades.

Por lo tanto, imaginar que cada mensaje de chat tiene un ID. Yo diseño mi chat.php para aceptar un parámetro de este modo:

chat.php?since=12345 

12345 sería el id del último mensaje que el cliente haya visto. chat.php básicamente hace algo como:

SELECT * FROM chatmessages WHERE id > $since 

... y pasa hacia atrás una estructura poco agradable de datos (una matriz de objetos, codificado en JSON, digamos).

Por lo tanto, si no hay nuevos mensajes de chat, el servidor simplemente está devolviendo una matriz vacía.

No creo que pueda ser más eficiente que eso.

EDIT:

que darse cuenta de que hacerlo de esta manera requiere un poco más de codificación del lado del cliente. Ya no solo estás actualizando algunos div con todo el historial de chat. Usted también necesita tener un manejador en su llamada AJAX que itera sobre los resultados, y para cada mensaje, programáticamente construyen una div para esa línea, entonces lo anexa a su charla div.

0

Me gustaría en primer lugar crear un archivo llamado por ejemplo messages.php que parecía algo como esto:

<?php header('Content-Type: application/json'); 

$messages_since = !empty($_POST['since']) 
    ? mysql_real_escape($_POST['since']) 
    : '0000-00-00 00:00:00'); 

// Get all messages from database since the $messages_since date_time 

echo json_encode($array_with_messages); 

A continuación, en el lado del cliente usando jQuery o algo así me gustaría hacer algo como esto:

  1. reciben mensajes utilizando algo así como $.post('messages.php', new_messages_handler)
  2. En el controlador me gustaría crear html para cada mensaje nuevo regresamos y anexar/anteponga al contenedor de chat, así como una tienda ¿qué tiempo de los últimos mes sabio fue creado.
  3. esperar un tiempo
  4. Obtener nuevos mensajes usando algo como $.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
  5. Ir a 2

Al menos funciona bastante bien en mi cabeza: p

Cuestiones relacionadas