fancybox i setInterval

0

Witam mam problem z setInterval, wykorzystując pluginy typu greybox, w moim przypadku fancybox, przy kazdym otworzeniu box'a dodaje mi się nowy setInterval, przez co np po otwarciu 10 razy okna bez przeładowania, działa mi 10razy czesciej fukcja niż powinna, jak to ograniczyć?

2

Funkcja setInterval zwraca pewien identyfikator. Zapamiętaj go sobie w zmiennej. Gdy będziesz chciał wyczyścić działanie danego wywołania funkcji setInterval, użyj funkcji clearInterval, przekazując jej za jedyny parametr wspomniany identyfikator.

Dość często stosuje się wzorzec podobny do poniższego, aby uniknąć nachodzących na siebie wywołań setInterval:

var intervalId = null;

// to tylko przykład
$('#fancybox .cośtam').click(function() {
  ...
  if (intervalId !== null) {
    clearInterval(intervalId);
  }
  intervalId = setInterval(function() {
    ...
  }, ...);
});

W tym kodzie zawsze przed odpaleniem kolejnego setInterval sprawdzamy, czy nie jest aktywne jakieś inne wywołanie setInterval. Gdyby było, to w naszej zmiennej intervalId byłoby coś innego niż null. Jeśli jakieś setInterval sobie działa, to je czyścimy. Następnie, odpalamy nowe setInterval i zapamiętujemy to wywołanie w zmiennej intervalId.

Są też inne sposoby. Prawdopodobnie lepszym byłoby wywołanie clearInterval np. gdy ktoś zamknie fancyboxa, czy coś w tym stylu. Bo tak, jak jest teraz, to jedno setInterval sobie chodzi aż do momentu gdy zostanie wywołane drugie. Wtedy to pierwsze jest kasowane, a to drugie jest ustawiane. Dałoby się to usprawnić, ale nie mając dodatkowych informacji o Twoim przypadku ciężko by mi to było zrobić bez utraty ogólności. Generalnie -- kombinuj z clearInterval.

0

Ten drugi pomysł jest lepszy, że przy zamknięciu wywołać clearInterval. Tylko nie wiem jak przechwycić zdarzenie onclosed. Bo to musze przechwycić w oknie a nie w głownym dokumencie, ponieważ setInterval wywołuje w oknie

Mam coś takiego:

var reID = setInterval(UpdateBusy,1000);
    
$.fancybox.close = function() {
    
    clearInterval(reID);
    $.fancybox.close;
}; 

i teraz tak, tu chyba chodzi o asynchroniczność nie jestem pewien, ale jak dam tak to sie okno zamyka a Interval dalej pracuje, ale jeśli wywale ostatnią linie

    $.fancybox.close; 

to Interval kończy działać, ale znowu okno się nie zamyka

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