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

detener un script AJAX con setTimeout ejecutandose

Estas en el tema de detener un script AJAX con setTimeout ejecutandose en el foro de Frameworks JS en Foros del Web. Hola, he creado una aplicación en www.bocateca.com , es un diccionario en el cual la gente añade palabras que los usuarios de la página votan ...
  #1 (permalink)  
Antiguo 19/05/2009, 11:01
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
detener un script AJAX con setTimeout ejecutandose

Hola, he creado una aplicación en www.bocateca.com, es un diccionario en el cual la gente añade palabras que los usuarios de la página votan a favor o en contra de que permanezcan en el diccionario.

He creado el proceso de votación de forma bastante tosca con AJAX-PHP (es mi primer script AJAX que consigo hacer funcionar de verdad :) ). Al pinchar en 'Sí' o en 'No', se captura la ip del usuario. Si el usuario no ha votado aún, se contabiliza su voto. Si ya ha votado anteriormente (es decir, si su ip ya está registrada en el campo ip de la tabla palabras), entonces aparece la leyenda 'Ya ha votado durante' tres segundos, tras los cuales, vuelve a aparecer el número de votos.

El problema que tengo es que si el usuario intenta votar en otra palabra antes de que desaparezca la leyenda 'Ya ha votado', entonces el sistema 'se vuelve loco' y la leyenda 'Ya ha votado' aparece en en el sitio anterior a donde se está clickando.

Supongo que el problema puede resolverse deteniendo la ejecución del script cuando se clicka de nuevo, pero no sé como hacerlo, a ver si podéis ayudarme.

Adjunto el javascript:

Código PHP:
var xmlHttp;

function 
votar(str,valor)
{
xmlHttp=GetXmlHttpObject();
if (
xmlHttp==null)
  {
  
alert ("Browser does not support HTTP Request");
  return;
  }
var 
url="/votar.php";
url=url+"?idpal="+str;
url=url+"&vot="+valor;
xmlHttp.onreadystatechange=function(){
var 
respuesta;
var 
respuesta_yahavotado;
if(
xmlHttp.readyState == && xmlHttp.status == 200){
    
respuesta=xmlHttp.responseText;
    
obj=document.getElementById("getDataVotacion-"+str);
    
//Aquí analizo la respuesta, que puede venir con un c0 o un c1 en la cadena. SI viene con un c0 es que ya había votado anteriomente. Si viene con un c1 es que no ha votado pero se ha contabilizado ya su voto
    
if(respuesta.substr(12,2)=='c0'){
        
//Si ya ha votado, entonces nuestro la leyenda 'Ya ha votado' durante 3 segundos y después muestro otra vez los votos
        
respuesta_yahavotado='<div class="yahavotado"><em>Ya ha votado</em></div>';
        
obj.innerHTML respuesta_yahavotado;
        
setTimeout("obj.innerHTML = "+respuesta+""3000);
    }else{
        
//Si no ha votado, muestro los votos con el nuevo voto ya sumado
        
obj.innerHTML respuesta;
    }
}
}
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}


function 
GetXmlHttpObject(){
    var 
xmlHttp=null;
    try  {
      
// Firefox, Opera 8.0+, Safari
      
xmlHttp=new XMLHttpRequest();
      }
        catch (
e) {
          
//Internet Explorer
          
try    {
            
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }
          catch (
e) {
            
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
          }
    return 
xmlHttp;

Gracias.
  #2 (permalink)  
Antiguo 20/05/2009, 10:09
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: detener un script AJAX con setTimeout ejecutandose

Buenas mrgubu

Prueba esto,

Código javascript:
Ver original
  1. var xmlHttp;
  2.  
  3. function votar(str,valor)
  4. {
  5. if(document.getElementById('yahavotado')){
  6.     alert('debe esperar unos segundos');
  7.     return false;
  8. }
  9. xmlHttp=GetXmlHttpObject();
  10. if (xmlHttp==null)
  11.   {
  12.   alert ("Browser does not support HTTP Request");
  13.   return;
  14.   }
  15. var url="/votar.php";
  16. url=url+"?idpal="+str;
  17. url=url+"&vot="+valor;
  18. xmlHttp.onreadystatechange=function(){
  19. var respuesta;
  20. var respuesta_yahavotado;
  21. if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
  22.     respuesta=xmlHttp.responseText;
  23.     obj=document.getElementById("getDataVotacion-"+str);
  24.     //Aquí analizo la respuesta, que puede venir con un c0 o un c1 en la cadena. SI viene con un c0 es que ya había votado anteriomente. Si viene con un c1 es que no ha votado pero se ha contabilizado ya su voto
  25.     if(respuesta.substr(12,2)=='c0'){
  26.         //Si ya ha votado, entonces nuestro la leyenda 'Ya ha votado' durante 3 segundos y después muestro otra vez los votos
  27.         respuesta_yahavotado='<div class="yahavotado" id="yahavotado"><em>Ya ha votado</em></div>';
  28.         obj.innerHTML = respuesta_yahavotado;
  29.         setTimeout("obj.innerHTML = "+respuesta+"", 3000);
  30.     }else{
  31.         //Si no ha votado, muestro los votos con el nuevo voto ya sumado
  32.         obj.innerHTML = respuesta;
  33.     }
  34. }
  35. }
  36. xmlHttp.open("GET",url,true);
  37. xmlHttp.send(null);
  38. }
  39.  
  40.  
  41. function GetXmlHttpObject(){
  42.     var xmlHttp=null;
  43.     try  {
  44.       // Firefox, Opera 8.0+, Safari
  45.       xmlHttp=new XMLHttpRequest();
  46.       }
  47.         catch (e) {
  48.           //Internet Explorer
  49.           try    {
  50.             xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  51.             }
  52.           catch (e) {
  53.             xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  54.             }
  55.           }
  56.     return xmlHttp;
  57. }

Ya dirás,saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #3 (permalink)  
Antiguo 20/05/2009, 12:40
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Respuesta: detener un script AJAX con setTimeout ejecutandose

ok matak muchas gracias por tu interés y ayuda,

tu propuesta soluciona efectivamente el problema pero haciendo uso del -en mi opinión- siempre molesto alert().

me gustaría encontrar otra solución que detuviera el script sin tener que hacer uso del alert().

gracias, saludos,
  #4 (permalink)  
Antiguo 25/05/2009, 03:54
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: detener un script AJAX con setTimeout ejecutandose

Ok, si el problema es únicamente el molesto alert puedes quitarlo perfectamente, lo puse para informar al cliente que su votación no se había efectuado. Ya que el título del tema es "detener un script AJAX con setTimeout ejecutandose" y se detiene algo que el usuario a realizado lo correcto -en mi opinion- es informarlo. Pero ya he dicho, puedes quitarlo y se seguirá detiniendo el proceso.

Ahora bien otra solución podría ser encolar, por asi decirlo, los diferentes procesos ajax. Es decir: si el usuario ha votado, o lo que es lo mismo, si la capa yahavotado existe en vez de detener la ejecución se trataría de por medio de setTimeout volver a llamar a la función, generando de esta forma como una especie de cola de espera. Si te agrada esta solución y quieres intentar implementarla sería algo asi:

Código javascript:
Ver original
  1. if(document.getElementById('yahavotado')){
  2.     setTimeout("votar('"+srt+"','"+valor+"')",3000)
  3.     //alert('debe esperar unos segundos');
  4.     return false;
  5. }

Si lo pruebas ya comentarás y si tienes algun problema y puedo ayudarte aqui estaré,

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #5 (permalink)  
Antiguo 25/05/2009, 10:26
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Respuesta: detener un script AJAX con setTimeout ejecutandose

ok gracias de nuevo matak.

Soy tan torpe con JS que no se me había ocurrido eliminar el alert a ver qué pasaba. Al eliminarlo efectivamente todo funciona 'bien', aunque como tú dices no se informa al usuario. La verdad es que lo prefiero así.

Para mí la solución ideal sería, como en urbandictionary.com, paralizar un proceso de voto cuando se hace click en otro. Es decir, creo que no habría necesidad de encolar los procesos AJAX, bastaría con detenerlos completamente e iniciar el último en el que se ha clickado.

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 10:21.