Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Recargar consulta cada tres segundos

Estas en el tema de Recargar consulta cada tres segundos en el foro de Frameworks JS en Foros del Web. ¡Hola! Tengo un chat.... y un iframe a un script php que saca los mensajes recibidos. Puse un iframe para evitar tener que recargar toda ...
  #1 (permalink)  
Antiguo 01/06/2009, 11:55
(Desactivado)
 
Fecha de Ingreso: abril-2009
Ubicación: En mi casa
Mensajes: 191
Antigüedad: 15 años, 8 meses
Puntos: 0
Recargar consulta cada tres segundos

¡Hola!

Tengo un chat.... y un iframe a un script php que saca los mensajes recibidos.

Puse un iframe para evitar tener que recargar toda la página.

Este iframe se recarga cada tres segundos... y quiero evitar que se note en el chat.

Es decir... que se recargue el chat.php... sin notarse que se está cargando el iframe, ya que es muy muy molesto.

¿Cómo puedo hacer si no para recargar la consulta sql que hace renovar los mensajes enviados?...

El chat en beta es este...

Saludos!
  #2 (permalink)  
Antiguo 01/06/2009, 12:23
Avatar de jaao_death  
Fecha de Ingreso: abril-2009
Ubicación: Murcia/españa
Mensajes: 229
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Recargar consulta cada tres segundos

Lo que quieres es bastante complicado, pero si te empeñas averigua todo lo que puedas sobre AJAX, o intenta hacer el chat en otro lenguaje como Flash y ActionScript, o JAVA.

Eso sí, por que cambies de lenguaje eso no quiere decir que diseñar un chat es fácil.
__________________
Mucha seguridad nunca es suficiente.... Por una red segura
El señor ilustre obscurece nuestras mentes
Usas Linux? http://www.dudalibre.com/gnulinuxcounter
  #3 (permalink)  
Antiguo 01/06/2009, 12:28
(Desactivado)
 
Fecha de Ingreso: abril-2009
Ubicación: En mi casa
Mensajes: 191
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Recargar consulta cada tres segundos

Jmmm.... gracias, pero a mi me interesa hacerlo con ajax.

Solo hacer que cada 3 segundos, la función de php vermensajes()... se recargue sin recargar la página...

¿Qué hay que hacer en ajax para eso?

¿Hay algún script ya hecho?
  #4 (permalink)  
Antiguo 01/06/2009, 12:47
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 11 meses
Puntos: 44
Respuesta: Recargar consulta cada tres segundos

Debes hacer en una funcion ajax que llame al archivo php que llama a esa funcion:
más o menos, para que te hagas una idea (y partiendo de la base de que no sabes nada de ajax):

Creamos un objeto Ajax:

Código PHP:
function crearObjeto() {
    var 
req null;
    var 
acv = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];
    if(
window.XMLHttpRequest) {
        
req = new XMLHttpRequest();    
    }
    else if(
window.ActiveXObject) {
        for (var 
0acv.lengthi++) {
            try {
                var 
actx = new ActiveXObject(acv[i]);
                
req actx;
            }catch (
error) {}
        }
    }
    else {
        
alert('Error fatal. Tu ordenador va a explotar');    
    }
    return 
req;

Y creamos la funcion que llama a tu querida funcion (si sólo quieres que se ejecute esa function, métela aislada en un archivo php. Hasta dónde yo se (novato), no se puede llamar a una funcion específica sin usar frameworks en plan XAJAX)

No se si le debes pasar argumentos o no. Presupongo que no.
Código PHP:
function getMensajes() {
    
peticion crearObjeto();
    
peticion.open('GET''ver_mensajes.php'true);
    
peticion.onreadystatechange = function() {
    if(
peticion.readyState == 1){
        
document.getElementById('divdondetieneslosmensajes').innerHTML "Cargando comentarios...";
    }
    else if(
peticion.readyState == 4) {
        if(
peticion.status == 200) {
            
document.getElementById('divdondetieneslosmensajes').innerHTML peticion.responseText;
                    }
                }
    
peticion.send(null);

Datos: divdondetieneslosmensajes -> no hace falta explicar...
ver_mensajes.php -> archivo donde está la función vermensajes(). Recuerda que debe "escribir" algo, pues lo que hace la funcion es mas o menos meter en el div lo que te hace dicha funcion php.

Para hacerlo cada tres segundos, una sencilla línea que llamas al principio:

Código HTML:
setInterval("getMensajes()",300);
Repasa bien los corchetes, pues puede que me haya comido alguno.. Un saludo
  #5 (permalink)  
Antiguo 01/06/2009, 12:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Recargar consulta cada tres segundos

Tema trasladado desde PHP
  #6 (permalink)  
Antiguo 01/06/2009, 13:38
(Desactivado)
 
Fecha de Ingreso: abril-2009
Ubicación: En mi casa
Mensajes: 191
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Recargar consulta cada tres segundos

Muchas gracias

Pero es que no funciona...

Esto es lo que hay entre body y /body... (antes hay un estilo css y todo el rollo de metas y eso )

Código javascript:
Ver original
  1. <script language="javascript">
  2. function messageon(i){
  3. document.getElementById('messagewrap_' + i).className="messagedivon";
  4. }
  5.  
  6. function messageoff(i,par){
  7.    if(par=="yes"){
  8.    document.getElementById('messagewrap_' + i).className="messagedivpar";
  9.    }else{
  10.    document.getElementById('messagewrap_' + i).className="messagediv";
  11.    }
  12. }
  13.  
  14. //Para los mensajes
  15. function crearObjeto() {
  16.     var req = null;
  17.     var acv = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];
  18.     if(window.XMLHttpRequest) {
  19.         req = new XMLHttpRequest();    
  20.     }
  21.     else if(window.ActiveXObject) {
  22.         for (var i = 0; i < acv.length; i++) {
  23.             try {
  24.                 var actx = new ActiveXObject(acv[i]);
  25.                 req = actx;
  26.             }catch (error) {}
  27.         }
  28.     }
  29.     else {
  30.         alert('Tu navegador no soporta ajax... Bájate uno nuevo');    
  31.     }
  32.     return req;
  33. }  
  34. </script>
  35. <title>CHAT beta</title></head>
  36. <body style="width:700px;" onLoad='setInterval("getMensajes()",300);'>
  37.  
  38.  
  39. <script language="javascript">
  40. function getMensajes() {
  41.     peticion = crearObjeto();
  42.     peticion.open('GET', 'mensajes.php', true);
  43.     peticion.onreadystatechange = function() {
  44.     if(peticion.readyState == 1){
  45.         document.getElementById('mensajesajax').innerHTML = "Cargando mensajes...";
  46.     }
  47.     else if(peticion.readyState == 4) {
  48.         if(peticion.status == 200) {
  49.             document.getElementById('mensajesajax').innerHTML = peticion.responseText;
  50.                     }
  51.                 }
  52.     peticion.send(null);
  53. }
  54. </script>
  55.  
  56. <div id="mensajesajax"></div>

Saludos!

Pd:. Hay un fichero en la misma carpeta que es este (mensajes.php)

Por cierto: Cuando lo consiga recuerda que tengo que darle Karma a sether y al que termine de ayudarme
  #7 (permalink)  
Antiguo 01/06/2009, 14:45
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 11 meses
Puntos: 44
Respuesta: Recargar consulta cada tres segundos

No te funciona porque no estás usando divs, si no iframes. Con iframes es muy facil hacer la recarga. En este caso debería poner un meta refresh cada 3 seg en el archivo textarea.php
Para hacerlo con Ajax deberías cambiar bastantes cosas.

Ésta es tu estructura (mas o menos, corrigeme si me equivoco):

Iframe id="sendform"(que porcierto, id repetida. >.<) que contiene-> textarea.php -> con un include a -> mensajes.php.

Cambia ésto:
Código HTML:
<iframe id="sendform" frameborder="0" width="720" height="400" src="./textarea.php" scrolling="no">
<!-- Contenido para navegadores que NO soportan los Iframes -->
Este navegador es demasiado antiguo.

</iframe> 
por algo así:

Código HTML:
<div id="mensajesajax"></div> 
luego en los scripts del head:

Código HTML:
window.onload=init;
function init(){
getMensajes();
}
EDIT:
1.Recuerda que mensajes.php debe llamar a la funcion, no sólo definirla
2.No revisaste los corchetes..xD falta uno delante de ->peticion.send(null);
3.No veo el set interval en ningún sitio de tus scripts
4.Los scripts es recomendable ponerlos en el head...

Si quieres mantener tu "estilo", debes hacer que mensajes.php también printe las clases css, recuerdalo eh!

Última edición por SetheR; 01/06/2009 a las 15:45
  #8 (permalink)  
Antiguo 01/06/2009, 15:01
(Desactivado)
 
Fecha de Ingreso: abril-2009
Ubicación: En mi casa
Mensajes: 191
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Recargar consulta cada tres segundos

Jmm... Gracias de nuevo.

Mira la estructura es esta:

--Chat.php

Contiene:

a) --Iframe textarea (mensajes enviados)

Contiene --- Include a la mensajes.php

b) --Iframe sendform (Enviar mensaje)

Esto está en el iframe textarea.php

Código javascript:
Ver original
  1. <html>
  2. <head>
  3. <style type="text/css">
  4.  //CSS QUITADO PARA EVITAR TANTO ESPACIO
  5. </style>
  6.  
  7. <script language="javascript">
  8. function messageon(i){
  9. document.getElementById('messagewrap_' + i).className="messagedivon";
  10. }
  11.  
  12. function messageoff(i,par){
  13.    if(par=="yes"){
  14.    document.getElementById('messagewrap_' + i).className="messagedivpar";
  15.    }else{
  16.    document.getElementById('messagewrap_' + i).className="messagediv";
  17.    }
  18. }
  19.  
  20. //Para los mensajes
  21. function crearObjeto() {
  22.     var req = null;
  23.     var acv = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];
  24.     if(window.XMLHttpRequest) {
  25.         req = new XMLHttpRequest();    
  26.     }
  27.     else if(window.ActiveXObject) {
  28.         for (var i = 0; i < acv.length; i++) {
  29.             try {
  30.                 var actx = new ActiveXObject(acv[i]);
  31.                 req = actx;
  32.             }catch (error) {}
  33.         }
  34.     }
  35.     else {
  36.         alert('Tu navegador no soporta ajax... Bájate uno nuevo');    
  37.     }
  38.     return req;
  39. }  
  40.  
  41. //Ver los mensajes
  42. function getMensajes() {
  43.     peticion = crearObjeto();
  44.     peticion.open('GET', 'mensajes.php', true);
  45.     peticion.onreadystatechange = function() {
  46.     if(peticion.readyState == 1){
  47.         document.getElementById('mensajesajax').innerHTML = "Cargando mensajes...";
  48.     }
  49.     else if(peticion.readyState == 4) {
  50.         if(peticion.status == 200) {
  51.             document.getElementById('mensajesajax').innerHTML = peticion.responseText;
  52.                     }
  53.                 }
  54.     peticion.send(null);
  55. }
  56.  
  57. //ONLOAD
  58. window.onload=init;
  59. function init(){
  60. getMensajes();
  61. }
  62. </script>
  63. <title>CHAT beta</title></head>
  64. <body style="width:700px;">
  65. <div id="mensajesajax"></div>
  66. </body>
  67. </html>

Bueno saludos

Pd:. Porbé el refresh de 3 segundos... pero hace que la página del chat parpadée cada vez que se recarga el iframe y eso molesta

Saludos!
  #9 (permalink)  
Antiguo 01/06/2009, 15:50
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 11 meses
Puntos: 44
Respuesta: Recargar consulta cada tres segundos

Mira el edit de arriba (la hora es tan tarde porque vi tu mensaje cuando refresqué, que me había ido a cenar..):
Ahora ya veo cómo lo haces. Te falta llamar al setInterval, para que se ejecute la funcion de getter de los mensajes cada 3000 milisegundos.
  #10 (permalink)  
Antiguo 02/06/2009, 07:36
(Desactivado)
 
Fecha de Ingreso: abril-2009
Ubicación: En mi casa
Mensajes: 191
Antigüedad: 15 años, 8 meses
Puntos: 0
De acuerdo Recargar función php con ajax cada x tiempo (Solucionado)

Muchas gracias Sether.. Ahora mismo te doy el Karma... auqnue hay unas cosas que te voy a poner...

-He quitado el if que decía "cargando mensajes...", porque hacía parpadear (sale el texto de cargando y de nuevo los mensajes). Ahora en vez de salir "cargando mensajes...", se quedan puestos los mensajes viejos, hasta que llegan los nuevos.

-El estilo no ha sido necesario ponerlo en el php, porque lo que hace es devolver un html, e insertarlo en el div ajaxmensajes.... y ahí ya coge los estilos.

Por lo demás muchísimas gracias

Ver el chat en beta (Faltan cosas, pero ya no parpadea)

Por cierto, he cambiado el título para que sea más accseible desde google cuando alguien lo busque
  #11 (permalink)  
Antiguo 02/06/2009, 08:39
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 11 meses
Puntos: 44
Respuesta: Recargar consulta cada tres segundos

De nada, me alegro de que te funcione.
Ahora, sólo te falta acabar con los iframes y hacerlo completamente en Ajax xD.

Busca por el foro cómo pasar datos POST por Ajax, es facil (es siempre lo mismo, muy mecánico), y te quedará un chat aun mas flexible.

PD:Lo del parpadeo no debería ocurrir, ya que solo lo muestra cuando el readyState es 1..Comprueba las llaves, corchetes y demás cosas, que al escribirlo directamente aqui, me habré comido algo.

pd2:quita el setInterval la primera vez que llames al metodo (en el init), ya que si no, tarda 3 segundos en aparecer los mensajes.
haz algo así:

Código HTML:
window.onload=init;
function init(){
getMensajes();
setInterval("getMensajes()",3000);
}
Un saludo
  #12 (permalink)  
Antiguo 02/06/2009, 09:07
(Desactivado)
 
Fecha de Ingreso: abril-2009
Ubicación: En mi casa
Mensajes: 191
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Recargar consulta cada tres segundos

Gracias de nuevo .... por lo de los tres segundos.

El parpadeo ya está solucion ado también

Y... ahora me han pedido smilies... he creado un tema aquí sobre ello.

Última petición:

-Un manual ajax que no sea muy difícil de entender. (Yo sé algo de javascript), pero es que en todos los manuales dan por sabido el httprequest y el try catch de IE y eso, y me lío

Saludos!
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 14:53.