Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/05/2009, 11:01
Avatar de mrgubu
mrgubu
 
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 10 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.