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 == 4 && 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.