jquery event loop zatrzymywanie kodu

0

Witam, posiadam na stronie zaimplementowany skrypt JavaScript, który tworzy animacje ruchomych zdjęć działa to całkowicie dobrze, ale jest jeden problem kiedy przejdę na inna zakładkę i przeglądam tam inną stronę internetową mój skrypt jakby się "usypia", a po wróceniu próbuje nadrobić wszystkie dane, które go ominęły (z tym, że nie zawsze się mu to udaje ponieważ treść jest dostarczana metodą AJAX i jest zbyt wiele akcji do wykonania).

Czy można jakoś wymusić wykonywanie skryptu nawet gdy nie jesteśmy na stronie ?

0

Inne podstrony są ładowane dynamicznie, bez przeładowania, czy z przeładowaniem ?
Możesz podać link do strony ?

0

Twój kod używa setInterval/setTimeout w połączeniu z requestAnimationFrame (które się nie wykonuje, gdy strona nie jest widoczna).

Opcja 1:
nie wykonuj kolejnego setTimeout/setInterval dopóki nie wykona się zaplanowana w requestAnimationFrame animacja - najlepsza

Opcja 2:
nie używaj requestAnimationFrame

Generalnie to wklej kod/link do strony, wtedy możemy konkretnie działać

0

Niestety mam ją w chwili obecnej tylko na localhost, a przełączanie jest tylko dynamiczne - nie następuje żadne przeładowanie na nowo.

W samym kodzie jest użyty setInterval, który odbiera dane od serwera co 4 sekundy.
Na podstawie zwróconej akcji do odpowiedniego kontenera dodaje dane.
Dane są dodawane w lewej kolumnie, prawej oraz górnej środkowej gdzie są różne loga, loga działają jak karuzela (sam kod jQuery do karuzeli jest na zasadzie takiej jak tutaj: http://programowanie.opole.pl/archives/2221 oraz efekt jest ten sam, z tym, że animacji nie ma akcji "pause").

Może warto dodać, że w samym kodzie użyta jest funkcja setTimeout, którą manipuluje prędkość "karuzeli" (zmieniam w niej zmienna odpowiedzialną za prędkość wykonywania animacji).

/////////////

Ps. Wydaje mi się, że błądzę w swoich rozwiązaniach kiedy potrzebuje odpytywać serwer o odpowiedź np. co 4 sekundy, ale de-facto poprzez AJAX to działa, a jakie rozwiązanie byłoby bardziej optymalne ?

0

Strzelam, że używasz wersji jQuery między (bodajże) 1.5.2 a 1.6.1, które to używały requestAnimationFrame do animate, ale się z tego wycofali właśnie z powodu opisanego w poście. Jak tak, to tylko zmień wersję jQuery.

0

Troszkę zamętu wprowadziłem poprzez brak strony w sieci, a więc po kolei.

  1. Używana wersja jQuery:

http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js

  1. Odbieranie danych od serwera (tutaj według Waszych odpowiedzi następuje korzystanie z rAF):
    var interval = setInterval(function () {
          $.get("Notice.php?id="+idNotice, function(data) {
                // parsowanie json
                var obj = JSON.parse(data);
               // wykonaj wszystkie akcje
               for (var i = 0; i < obj.length; i++) {
                    if (obj[i]['notice'] == 1) {
                              jakasFunkcja();
                    }
                    else if (obj[i]['notice'] == 2) {
                              jakasFunkcja2();
                    }
          }
    }, 4000);

ale jak wykonać skrypt co jakiś czas bez użycia setInterval/setTimeout ?

Można by zrobić funkcje sleep:

function sleep(ms) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + ms) {}
}

ale to wydaje się najmniej optymalne rozwiązanie ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1