2012-06-01 25 views
5

Mam okres, który utworzę dla każdego z moich wpisów, problem polega na tym, że ładuję nowe posty i usuwam stare, więc oczywiście chciałbym zatrzymać interwał dla poprzednie posty. Jednak nie mogę wymyślić, jak to zrobić. Czy ktoś mógłby mi wytłumaczyć, jak właściwie to robić? Jestem całkowicie zagubiony.JavaScript/jQuery clearInterval jest ustawiany w .each

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

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

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

Odpowiedz

4

można przechowywać interwał identyfikator w atrybucie danych:

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

i wyczyścić przedział specyficzne dla każdego .post tak:

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

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

i jak SiGanteng powiedział, zalecana przekazać obiekt funkcji do setInterval zamiast ciągu, który otrzymuje tylko eval 'd.

+0

+1 miałem zamiar zaproponować za pomocą tablicy - ale 'data' nieruchomość jest idealna do tego – ManseUK

+0

Dziękuję bardzo. – Ian

2

Trzeba zachować jeden uchwyt dla każdego przedziału, który uruchamia się:

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 można użyć asocjacyjnej tablicy używając 'id' jako klucza – ManseUK