Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pamieć przeglądarki - setInterval
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
rulespl
Witam

Mam problem z cyklicznie (setInterval) wywoływaną funkcją.
Jej zadaniem jest m.in. podmiana atrybytu src dla <img>:

  1. function assign_image() {
  2. ('#element').attr('src', nowa_sciezka);
  3. }


Przy każdym wywołaniu tej funkcji zwiększa się zużycie pamięci przez przeglądarkę.
Jak to zwalczyć?
zegarek84
po pierwsze nie jestem pewien, czy podałeś cały dokładny kontekst czy tylko fragment tego co zamierzasz uzyskać...

po drugie każdy z tych obrazków może być buforowanych w danej przeglądarce...

po trzecie skoro wiesz, w którym obrazku zmieniasz ścieżkę to znacznie szybciej by to działało jeśli byś zbuforował gdzieś albo obiekt jQuery z wyszukanym elementem DOM albo sam surowy element drzewa DOM...

najlepiej daj przykład live...
rulespl
Kod jest trochę zawiły i jest tam kilka innych dodatkowych funkcji dlatego nie zamieszczałem całego.

Cytat
po drugie każdy z tych obrazków może być buforowanych w danej przeglądarce...

Jak usunąć w takim razie poprzednie obrazki?

Cytat
po trzecie skoro wiesz, w którym obrazku zmieniasz ścieżkę to znacznie szybciej by to działało jeśli byś zbuforował gdzieś albo obiekt jQuery z wyszukanym elementem DOM albo sam surowy element drzewa DOM...


Jak zbuforować taki obiekt DOM? Jakiś przykład, gdzie można to w dokumentacji znaleźć?
kamil4u
Cytat
Jak zbuforować taki obiekt DOM? Jakiś przykład, gdzie można to w dokumentacji znaleźć?

Zmienną globalną smile.gif
[JAVASCRIPT] pobierz, plaintext
  1. var zmienna = document.getElementById('id'); //$('#id');
  2. function test(){
  3. zmienna.operacje(); //dzięki temu przeglądarka nie będzie za każdym razem wyszukiwać elementu zmienna
  4. }
[JAVASCRIPT] pobierz, plaintext


Opisz co chcesz osiągnąć, może jest na to jakiś inny lepszy sposób. Co do cache, to może być problem smile.gif I daj wreszcie przykład 'live'.
rulespl
Cytat(kamil4u @ 5.09.2011, 15:57:06 ) *
Opisz co chcesz osiągnąć, może jest na to jakiś inny lepszy sposób. Co do cache, to może być problem smile.gif I daj wreszcie przykład 'live'.


Przykład 'live', kod odpowiedzialny za problem wygląda tak:
[JAVASCRIPT] pobierz, plaintext
  1. function check_image(img,id) {
  2. if (!img.complete) {
  3. return false;
  4. }
  5. if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
  6. return false;
  7. }
  8. timestamp = timestamp + 1;
  9. loading[id] = 'complete';
  10. return true;
  11. }
  12.  
  13. function assign_image(x) {
  14. switch(x) {
  15. case 0: {
  16. if (loading[x] == 'empty') {
  17. image0 = new Image();
  18. var dateNow = new Date();
  19. image0.src = image_output[x] + '&timestamp='+timestamp+'&rand='+dateNow.valueOf();
  20. loading[x] = 'progress';
  21. }
  22. else if (loading[x] == 'progress') {
  23. check_image(image0,x);
  24. }
  25. else if (loading[x] == 'complete') {
  26. $('#img_src').attr('src',image_output[x] + '&timestamp='+timestamp);
  27. loading[x] = 'empty';
  28. }
  29. break;
  30. }
  31. }
  32. }
  33. function animate() {
  34. interval_id = setInterval(function() {
  35. if (mode == "picture") {
  36. $(counter).html(timestamp);
  37. //zmiana obrazka
  38. assign_image(0);
  39. }
  40. }, interval/2);
  41.  
  42. }
  43.  
[JAVASCRIPT] pobierz, plaintext

zegarek84
przede wszystkim to nie jest przykład 'live' (co znaczy, że miałeś podać linka do strony internetowej z działającym całym kodem)...

poza tym kod który podałeś nie trzyma się kupy... rozumiem, iż start jest od animate(), potem zawsze wykonujesz kod assign_image(0) [no warunkowo ale...]...

w funkcji assign_image(x) niby tworzysz tymczasowy obiekt obrazka do pobrania ale nie wiem po co skoro po załadowaniu nigdzie go nie wyświetlasz...[PRZECZYTAJ CAŁOŚĆ - WIEM, CHCESZ GO WYŚWIETLIĆ ;P] poza tym gdy już nie potrzebny jest obiekt Image mógłbyś go usunąć gdyż przechowuje wiele danych - a ponieważ jest on przypisany do zmiennej lokalnej to nie zadziała delete i tej zmiennej lokalnej musisz przypisać NULL - różnie to bywa z czyszczeniem zmiennych lokalnych, a ponieważ obiekt i tak przekazujesz dalej przez referencję to nie zostawiaj niepotrzebnych referencji...

następna sprawa samo sprawdzanie czy obrazek załadowany - po co aż tyle sprawdzeń skoro masz zdarzenia dla tego obiektu .onload i .onerror do których możesz przypisać funkcję... ale mniejsza o to...

to co mnie dalej zastanawia, to przy sprawdzeniu, czy obrazek został załadowany zwiększasz zmienną timestap i ustawiasz loading na zakończony - i patrzmy dalej gdy loading zakończony... podmieniasz atrybut src jakiegoś obrazka w DOM'ie ale!!! z nowym timestapem!!! TO PO CO WCZYTYWAŁEŚ DO BUFORU WCZEŚNIEJSZY OBRAZEK SKORO NAWET Z NIEGO NIE SKORZYSTAŁEŚquestionmark.gif?

następny przebieg dla tego samego obrazka będzie o tyle szybszy, że choć buforujesz to znowu nie potrzebnie gdyż ten obrazek jest już wcześniej wczytywany do przeglądarki do drzewa DOM przez obiekt $('#img_src') - no do następnego przebiegu nie zwiększasz timestap... i dalej się dzieje to co pisałem od początku...


DAJ PRZYKŁAD LIVE TO PRĘDZEJ KTOŚ POMOŻE ;]
rulespl
Chyba do końca nie wiedziałem o co chodzi z tym live wink.gif.
Niestety nie jest możliwe pokazanie tego live, gdyż działa to tylko na lokalu.
Spróbowałem rozwiązać trochę inaczej funkcje assign_image :

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. function assign_image(x) {
  3. var image_url = null;
  4. var img_content = null;
  5. var dateNow = null;
  6. switch(x) {
  7. case 0: {
  8. dateNow = new Date();
  9. image_url = image_output[x] + '&timestamp='+timestamp+'&rand='+dateNow.valueOf();
  10. //alert(image_url);
  11. $.ajax({
  12. url: image_url,
  13. cache: false,
  14. success: function(){
  15. img_content = '<img id="img_src" src="' + image_url+ '" >';
  16. $(img_content).bind("load", function () {
  17. $('#img_src').replaceWith(img_content);
  18. });
  19. }
  20. });
  21. break;
  22. }
  23. }
  24. }
  25.  
[JAVASCRIPT] pobierz, plaintext


Zauważyłem, ze nawet jeśli w odpowiedzi ajax nie będzie obrazka z każdym nowym żądaniem rośnie zużycie pamięci przeglądarki.
Czy jest tak, że po uzyskaniu odpowiedzi z serwera obiekt XMLHttpRequest zajmuje pamięć. Czy można usunąć go ręcznie?

Skrypt działa tak, że np co 500 ms pobierany jest nowy obrazek, który zastępuje poprzedni. Czy usunięcie poprzedniego obrazka z drzewa DOM spowoduje usunięcie go z pamięci przeglądarki?

Jakieś pomysły?
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.