2012-06-01 22 views
5

Así que tengo un intervalo que creo para cada una de mis publicaciones, el problema es que cargo nuevas publicaciones y elimino las anteriores, así que obviamente me gustaría detener el intervalo de las publicaciones anteriores. Sin embargo, parece que no puedo entender cómo hacer esto. ¿Podría alguien explicarme cómo hacer esto correctamente? Estoy completamente perdido.JavaScript/jQuery clearInterval en .each

$(".post").each(function(){ 
    myInterval = setInterval("postStats('"+$(this).attr('id')+"')", 500); 
}); 

function postStats(pid) { 
    //do some stuff 
} 

$(".button").click(function(){ 
    clearInterval(myInterval); 
}); 

Respuesta

4

Puede almacenar el ID de intervalo en un atributo de datos:

$(".post").each(function() { 
    var that = this; 
    var myInterval = setInterval(function() { 
     postStats(that.id); 
    }, 500); 
    $(this).data("i", myInterval); 
}); 

y borrar el intervalo específico de cada .post así:

$(".button").click(function() { 

    // assuming the button is inside a post 
    clearInterval($(this).closest(".post").data("i")); 
}); 

y al igual que SiGanteng dijo, usted debe pasar un objeto de función al setInterval en lugar de una cadena, que solo obtiene eval 'd.

+0

+1 yo iba a sugerir el uso de una matriz - pero el 'data' propiedad es perfecta para este – ManseUK

+0

Muchas gracias. – Ian

2

que necesita para mantener un asa para cada intervalo que comience:

var myIntervals = []; 

$(".post").each(function(){ 
    var id = $(this).attr('id'); 
    var handle = window.setInterval(function(){ 
    postStats(id); 
    }, 500); 
    myIntervals.push(handle); 
}); 

function postStats(pid) { 
//do some stuff 
} 

$(".button").click(function(){ 
    $.each(myIntervals, function(i, val){ 
    window.clearInterval(val); 
    }); 
    myIntervals = []; 
}); 
+0

+1 puede usar una matriz asociativa usando el 'id' como clave – ManseUK