Foros del Web » Programando para Internet » Javascript »

Actualizar ventana solo cuando hay cambios??

Estas en el tema de Actualizar ventana solo cuando hay cambios?? en el foro de Javascript en Foros del Web. Hola a todos. A ver si me podeis ayudar, por que me voy dar por vencido de hacerlo con ajax xD Quiero actualizar una lista ...
  #1 (permalink)  
Antiguo 06/08/2012, 05:58
Avatar de Silkon  
Fecha de Ingreso: mayo-2011
Ubicación: Lugo
Mensajes: 201
Antigüedad: 12 años, 11 meses
Puntos: 20
Actualizar ventana solo cuando hay cambios??

Hola a todos.

A ver si me podeis ayudar, por que me voy dar por vencido de hacerlo con ajax xD

Quiero actualizar una lista de nicks mediante ajax, pero solo cuando hay algun cambio. Ahora lo tengo por tiempo asi.

window.setInterval("actualizar()", 3000);


function llamadaAjax()
{
var xmlhttp;
if (window.XMLHttpRequest)
{

xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
alert("Tu navegador no soporta XMLHTTP!");
}
xmlhttp.onreadystatechange=function()
{

if(xmlhttp.readyState==4)
{
document.getElementById('chatnicksact').innerHTML= xmlhttp.responseText;
document.getElementById('chatnicksact').style.back groundColor = '#550000';
}
}
xmlhttp.open("GET","listanicks.php",true);
xmlhttp.send(null);
}

function actualizar() {
llamadaAjax();
}


Intente cambiar la primera linea de actualizar por tiempo, por algo asi

onreadystatechange = actualizar;
onreadystatechange = actualizar();


Pero no funciona... Como podria hacer que solo actualice al existir cambios en la lista?
  #2 (permalink)  
Antiguo 06/08/2012, 22:32
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Actualizar ventana solo cuando hay cambios??

Hay una técnica específica para eso, llamada LongPolling, no sé si mi método se ajusta exactamente a eso, pero funciona, quizás se pueda optimizar. Desde ya que solo tiene sentido si la página en que se insertan los nuevos valores es diferente de la que se muestran los resultados, sino, simplemente llamas a la función ajax para recargar al hacer el insert

por un lado tenemos el index.php

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <script type="text/javascript">
  7. //<![CDATA[
  8. var phpbd = 'select_empleados.php';
  9. var div_entradas = 'entradas';
  10. var control = 'control_cambios.php';
  11. var tiempo = 10000;
  12.  
  13. /*** no editar ***/
  14. // agrega un parámetro unico al archivo
  15. var t;
  16. function cargarAjax(url){
  17. var contenidoAjax = false;
  18. if(window.XMLHttpRequest) {
  19. contenidoAjax = new XMLHttpRequest();
  20. }else if(window.ActiveXObject) {
  21. contenidoAjax = new ActiveXObject("Microsoft.XMLHTTP");
  22. }else{
  23. alert('Su navegador no soporta Ajax');
  24. }
  25. contenidoAjax.onreadystatechange=function(){
  26. cargaPagina(contenidoAjax);
  27. }
  28. cacheParam=(url.indexOf("?")!=-1)? "&"+ new Date().getTime() : "?"+ new Date().getTime();
  29. contenidoAjax.open('GET', url+cacheParam, true);
  30. contenidoAjax.send(null);
  31. }
  32.    
  33. function cargaPagina(contenidoAjax){
  34. if(contenidoAjax.readyState == 4 && (contenidoAjax.status==200 || window.location.href.indexOf("http")==-1)){
  35.         if(contenidoAjax.responseText == 'si'){
  36.         actualizaCapa(phpbd,div_entradas);
  37.     }
  38. }
  39.  
  40. }      
  41.  
  42. function actualizaCapa(urlDatos,divDatos){
  43. var actualizaAjax = false;
  44. if(window.XMLHttpRequest) {
  45. actualizaAjax = new XMLHttpRequest();
  46. }else if(window.ActiveXObject) {
  47. actualizaAjax = new ActiveXObject("Microsoft.XMLHTTP");
  48. }else{
  49. alert('Su navegador no soporta Ajax');
  50. }
  51. actualizaAjax.onreadystatechange=function(){
  52. cargaDatos(actualizaAjax,divDatos);
  53. }
  54. cacheParam=(urlDatos.indexOf("?")!=-1)? "&"+ new Date().getTime() : "?"+ new Date().getTime();
  55. actualizaAjax.open('GET', urlDatos+cacheParam, true);
  56. actualizaAjax.send(null);
  57. }
  58.    
  59. function cargaDatos(actualizaAjax,divDatos){
  60. if(actualizaAjax.readyState == 4 && (actualizaAjax.status==200 || window.location.href.indexOf("http")==-1)){
  61. document.getElementById(divDatos).innerHTML = actualizaAjax.responseText;
  62. }
  63. }
  64.  
  65. window.onload = t =setInterval("cargarAjax('" +control+"')", tiempo);
  66. //]]>
  67. </head>
  68. <div id="entradas">
  69. <?php
  70. include('select_empleados.php');
  71. ?>
  72. </div>
  73. </body>
  74. </html>

Explico un poco, el javascript tiene las siguientes variables

Este es el php que muestra el contenido de la base de datos, y al cual por defecto se le hace un include dentro de un div
var phpbd = 'select_empleados.php';
El nombre del div en el que se muestran y actualizarán los resultados
var div_entradas = 'entradas';
El archivo php que va a controlar si hubo cambios o no
var control = 'control_cambios.php';
El tiempo en milisegundos cada cuanto se ejecutará el setInterval (creo que 10 seg. es razonable, si se pone un valor inferior hay que ver que el server responda bien)
var tiempo = 10000;

El javascript tiene 2 funciones Ajax, con algunas diferencias, la primera controla si hubo cambios, de haberlos, invoca a la segunda para que recargue el contenedor de resultados

los php, por un lado tenemos el php que recorre y muestra el contenido de la base de datos,
select_empleados.php

Código PHP:
Ver original
  1. <?php
  2. $sqlhostname = "localhost";
  3. $login = "root";
  4. $password = "";
  5. $base = "emprear";
  6.  
  7. $db_connect = mysql_connect($sqlhostname,$login,$password);
  8. $base_selection = mysql_select_db($base,$db_connect);
  9. $consulta = "SELECT * FROM empleados ORDER BY idempleado ASC";
  10. $req = mysql_query($consulta);
  11. while($row = mysql_fetch_array($req)){
  12.         extract($row);
  13.         echo"$idempleado<br />";
  14.     }
  15. file_put_contents('control-cambios.txt','no',LOCK_EX);
  16. ?>

no tiene nada fuera de lo comun, salvo que en la última linea utiliza file_put_contents(), para escribir en un archivo de texto control-cambios.txt el valor "no"

archivo control_cambios.php

Código PHP:
Ver original
  1. <?php
  2. $control_cambios = file_get_contents('control-cambios.txt');
  3. if($control_cambios == 'si'){
  4. echo 'si';
  5. }
  6. ?>

este archivo es el que llama la primera función de Ajax, lo que hace es leer el contenido del archivo de texto control-cambios.txt, y si su contenido es "si" enviar como responseText a Ajax el valor "si", y ponemos la condición:

Código Javascript:
Ver original
  1. if(contenidoAjax.responseText == 'si'){
  2. actualizaCapa(phpbd,div_entradas);
  3. }

con lo que llamamos a la segunda función, que carga el select_empleados.php (que como ya vimos escribe "no" en el archivo de texto.
Ahora, la clave del asunto, el archivo
insertar.php
Código PHP:
Ver original
  1. <?php
  2. $sqlhostname = "localhost";
  3. $login = "root";
  4. $password = "";
  5. $base = "emprear";
  6.  
  7. $db_connect = mysql_connect($sqlhostname,$login,$password);
  8. $base_selection = mysql_select_db($base,$db_connect);
  9. $idempleado = 'xxxx';
  10. $nombres = 'aaaa';
  11. $departamento = 'cccc';
  12. $sueldo = time();
  13. $consulta = "INSERT INTO empleados (idempleado,nombres,departamento,sueldo) VALUES ('$idempleado','$nombres','$departamento','$sueldo')";
  14. $req = mysql_query($consulta);
  15. echo "fila insertada";
  16. file_put_contents('control-cambios.txt', 'si', LOCK_EX);
  17. ?>
el mismo, tras insertar la fila, escribe nuevamente en el archivo de control, pero esta vez la palabra "si", con lo que se hará la revcarga del contenido.
Dependiendo de la configuración del server, el archivo control-cambios.txt necesir¡trá ser creado manualmente y tener permisos 0777.



Edito:
Hago una pequeña modificación ya que IE8/7 tieen problemas con
window.onload = t =setInterval("cargarAjax('" +control+"')", tiempo);
asi que simplemente la ultima linea de la script debe contener
setInterval("cargarAjax('" +control+"')", tiempo);
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Última edición por emprear; 07/08/2012 a las 11:25
  #3 (permalink)  
Antiguo 08/08/2012, 08:16
Avatar de Silkon  
Fecha de Ingreso: mayo-2011
Ubicación: Lugo
Mensajes: 201
Antigüedad: 12 años, 11 meses
Puntos: 20
Respuesta: Actualizar ventana solo cuando hay cambios??

Muchas Gracias, una respuesta muy completa.
  #4 (permalink)  
Antiguo 18/08/2012, 02:02
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Actualizar ventana solo cuando hay cambios??

Estuve trabajando sobre una variante del código anterior, con alguna funcionalidad extra.
Demo:
http://emprear.com/polling/index_polling.php

Para probarla, abran varios navegadores y prueben de agregar registros en uno y en otro.
Si les es útil, avisenme y dejo los código en un zip con alguna explicación adicional

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: ajax, funcion, html, php, ventanas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:04.