Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jquery]Problem z setInterval :/
Forum PHP.pl > Forum > Przedszkole
robos85
Otóż chcę zrobić takie coś:
W bazie trzymam sponsorów (id,nazwa,czas,kolejnosc).
Po otwarciu strony chcę zrobić rotację wspomnianych sponsorów. Wszelkie dane chcę pobierać AJAXem.
Czas pomiędzy pobraniem nowego zapisuje w ukrytym DIVie.
Niestety nie mogę sobie poradzić z tym, żeby się wszystko zgrało i działało.
Mam taki kod póki co i nie wiem co mogę jeszcze tam wymyślec:/

Kod
$(document).ready(function(){
    function updateSponsors(){
        $.ajax({
            type: "post",
            url : "/update_sponsor",
            data: "akcja=sponsorzy&id="+a_sponsor,
            dataType : "html",
            success: function(msg){
                $('#towait').html(msg);
                alert('OK');
            }
        });
    }
    var towait = parseInt($('#towait').html());
    clearInterval(interval_in);
    interval_in = setInterval(function(){updateSponsors();}, towait);
});

Niestety to nie działa:/
Proszę o pomoc.
erix
Daj gdzieś ten kod na żywo.

W konsoli błędów nic nie ma?
robos85
Robię to na localu. Błędów brak:/

Może można to jakoś inaczej rozwiązać? pół dnia nad tym siedzę i efekty marne:/
singles
Firebuga odpalałeś?

1. Przy wywołaniu clearInterval wywala bład, bo nie ma takiej zmiennej jak interval_in. Przypisujesz ją dopiero potem.
2. Nie wiem jak wygląda element o id #towait, upewnij się że to co zapisujesz do zmiennej "towait" to jest czysta wartość liczbowa w milisekundach. I w tym wypadku chyba lepiej pobierać zawartość za pomocą text(). Masz pewność że nie będzie żadnych znaczników HTML.
3. HINT: W setInterval nie musisz robić funkcji i w niej odpalać updateSponsors. Równie dobrze możesz jako parametr podać nazwę funkcji, nawet bez "" albo ''.

EDIT: @robos85 - ciekawe, też zrobiłem na lokalu uwzględniając powyższe wskazówki (zamieniłem tylko ajaxowe żądanie na alerta) i odpala mi się jak trzeba winksmiley.jpg
robos85
OK, kod teraz wygląda tak:
Kod
$(document).ready(function(){
    function updateSponsors(){
        $.ajax({
            type: "post",
            url : "/update_sponsor",
            //data: "akcja=sponsorzy&id="+a_sponsor,
            data: "akcja=sponsorzy&id=1",
            dataType : "html",
            success: function(msg){
                alert('OK');
            }
        });
    }
    interval_in = setInterval(function(){updateSponsors();}, 4000);
});


Działa - odświeża się co 4 sek. Ja natomiast potrzebuję to zrobić tak, że po żądaniu AJAXa długość Interval się zmienia czyli nie jest już 4000ms.
I tutaj proszę o pomoc.

Miałem coś w FireBug źle ustawione, już mi errory pokazuje.

EDIT: wartość długości mam zamiar trzymać w ukrytym divie. Będzie to liczba ms. Pobierał będę ją $('#towait').html() i podobnie zmieniał podczas AJAXowego żądania
singles
Jedno setInterval jest Ci potrzebne na początku. W succes po żadaniu ajaxowym robisz 2 rzeczy. Dajesz clearInterval i robisz znowu setInterval na funkcję updateSponsors ale już z nową wartością pobraną z AJAXa. Nie musisz już wpisywać tego do ukrytego diva.
W ogóle ten ukryty div nie jest potrzebny. Za pierwszym razem startujesz ze stałą wartością, tak jak masz w obecnym kodzie. A potem to już AJAX ustawia kiedy akcja ma się znowu odpalić.

BTW. Albo mi się wydaje, albo setTimeout tutaj bardziej pasuje.
robos85
takie szybkie pytanko i biorę się do roboty: na początku czyli gdzie? W funkcji, przed funkcjami?...
erix
A po co, w takim razie, setInterval? Nie lepiej setTimeout?
singles
Cytat(robos85 @ 4.07.2009, 20:42:11 ) *
takie szybkie pytanko i biorę się do roboty: na początku czyli gdzie? W funkcji, przed funkcjami?...


Po DOM ready, poza funkcją updateSponsors().
robos85
Takie coś mi wyszło, niestety wykonuje sie tylko 1 raz:
Kod
$(document).ready(function(){
    function updateSponsors(){
        $.ajax({
            type: "post",
            url : "/update_sponsor",
            data: "akcja=sponsorzy&id=1",
            dataType : "html",
            success: function(msg){
                calosc = calosc + 'OK ';
                document.write(calosc);
                clearTimeout(interval_in);
                interval_in = setTimeout(function(){updateSponsors();}, 4000);
            }
        });
    }
    var calosc = '';
    var interval_in = setTimeout(function(){updateSponsors();}, 4000);
});
singles
Serio, masz Firebuga zainstalowanego?

Kolejna podpowiedź:
Kod
$(document).ready(function(){
    function updateSponsors() {
        interval_in = setTimeout(updateSponsors, 4000);
        alert("hello");
    }
    var interval_in = setTimeout(updateSponsors, 4000);
});
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.