• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzanie pozycji scrolla - wydajność

Object Storage Arubacloud
0 głosów
260 wizyt
pytanie zadane 9 września 2018 w JavaScript przez bulit000 Początkujący (460 p.)

Witam.

Mój kod sprawdza, czy użytkownik przekroczył określoną wartość wysokości w px i robi pewne rzeczy.

Problemem jest tutaj wydajność - przy logowaniu do konsoli zauważyłem, że skrypt odświeża się milion razy na minutę :) I czuć po przewijaniu, że szybkość działania strony spada. 
Oczywiście powód to trzy ostatnie linijki. 

Jak to ugryźć, żeby było lepiej?

 

let size_of_svg = 500;


                  function update() {
                   if ($(window).scrollTop() > (size_of_svg-50)) {
                       $('.svg_body').addClass('active');
                       $('.show_map').addClass('active');
                       $('.small_map').addClass('active');
                       $(svgDOM).appendTo(small_map[0]);
                       svgDOM.style.width = "400px";
                       svgDOM.style.height = "400px";
                       minimalize.disabled = true;
                       zoom_in.disabled = true;
                       zoom_out.disabled = true;
                       maximize.disabled = true;
                   } else {
                       $('.svg_body').removeClass('active');
                       $('.show_map').removeClass('active');
                       $('.small_map').removeClass('active');
                       $(svgDOM).appendTo('.svg_body');
                       svgDOM.style.width = size_of_svg+"px";
                       svgDOM.style.height = size_of_svg+"px";
                       minimalize.disabled = false;
                       zoom_in.disabled = false;
                       zoom_out.disabled = false;
                       maximize.disabled = false;
                     }
                    }

                    $(window).scroll(function () {
                        update();
                    });

 

3 odpowiedzi

+1 głos
odpowiedź 9 września 2018 przez thryndl Nałogowiec (30,470 p.)
wybrane 9 września 2018 przez bulit000
 
Najlepsza
Ja bym dał jakaś instrukcje warunkowa w listenerze, żeby nie wywoływać funkcji za każdym razem jak użytkownik będzie scrollowal, a tylko wtedy jak warunek zostanie spełniony. Dodatkowo jeśli funkcja ma się wywołać tylko raz, to można by zadeklarować zmienna, która zostanie zainkrementowana wraz z wywołaniem funkcji i sprawdzać jej wartość przed wywołaniem funkcji.
komentarz 9 września 2018 przez bulit000 Początkujący (460 p.)

Dodałem ifki do kodu i podczas przewijania odświeżają się tylko one, jest znacznie lepiej.

Ale czy może być jeszcze lepiej? smiley

 

let size_of_svg = 500;

let count = 1;
            
function update() {
    if ($(window).scrollTop() > (size_of_svg-50)) {
        if (count === 1)
        {
            $('.svg_body').addClass('active');
            $('.show_map').addClass('active');
            $('.small_map').addClass('active');
            $(svgDOM).appendTo(small_map[0]);
            svgDOM.style.width = "400px";
            svgDOM.style.height = "400px";
            minimalize.disabled = true;
            zoom_in.disabled = true;
            zoom_out.disabled = true;
            maximize.disabled = true;
        }
        if (count != 0)
        {
            count = 0;
        }

    } else {
        if (count === 0)
        {
            $('.svg_body').removeClass('active');
            $('.show_map').removeClass('active');
            $('.small_map').removeClass('active');
            $(svgDOM).appendTo('.svg_body');
            svgDOM.style.width = size_of_svg+"px";
            svgDOM.style.height = size_of_svg+"px";
            minimalize.disabled = false;
            zoom_in.disabled = false;
            zoom_out.disabled = false;
            maximize.disabled = false;
        }
        if (count != 1)
        {
            count = 1;
        }
    }
}
$(window).scroll(function () {
   update();
});

 

komentarz 9 września 2018 przez thryndl Nałogowiec (30,470 p.)
Można by podzielić cała funkcje update na dwie oddzielne, coś w stylu add i remove. Cała logikę instrukcji warunkowych przenieść do funkcji anonimowej i tylko funkcje add i remove wywoływać tylko wtedy, gdy sprawdza się warunki w funkcji anonimowej w scrollu.

Teraz jest lepiej, ale wciąż za każdym zdarzeniem scroll wywoływana jest funkcja update, a tak wywoływana byłaby tylko w określonych warunkach.

Nie mam dostępu do komputera, żeby dać jakiś przykład, ale mam nadzieje, ze rozumiesz o co chodzi.
komentarz 9 września 2018 przez bulit000 Początkujący (460 p.)
Racja, dobrze wykombinowane! Cofnę to wszystko jeszcze poziom wyżej, dzięki za pomoc.
komentarz 9 września 2018 przez thryndl Nałogowiec (30,470 p.)
Spoko, po to jest to forum ;)
1
komentarz 9 września 2018 przez bulit000 Początkujący (460 p.)

@thryndl, efekt:

 

let size_of_svg = 500;

let isScrolled = 0;

function scrolledUp()
{
    $('.svg_body').removeClass('active');
    $('.show_map').removeClass('active');
    $('.small_map').removeClass('active');
    $(svgDOM).appendTo('.svg_body');
    svgDOM.style.width = size_of_svg+"px";
    svgDOM.style.height = size_of_svg+"px";
    ZoomButtons.style.display = "inline-flex";
    isScrolled = 0;
}

function scrolledDown()
{
    $('.svg_body').addClass('active');
    $('.show_map').addClass('active');
    $('.small_map').addClass('active');
    $(svgDOM).appendTo(small_map[0]);
    ZoomButtons.style.display = "none";
    isScrolled = 1;
}


$(window).scroll(function () {
    if ($(window).scrollTop() > (size_of_svg-50)) {
        if (isScrolled === 0)
        {
            scrolledDown();
        }
    }
    else
    {
        if (isScrolled === 1)
        {
            scrolledUp();
        }
    }
});

 

komentarz 9 września 2018 przez thryndl Nałogowiec (30,470 p.)

Dokładnie o to chodziło yes

+2 głosów
odpowiedź 9 września 2018 przez Comandeer Guru (601,590 p.)

A nie lepiej zastosować Intersection Observer?

komentarz 9 września 2018 przez Tomek Sochacki Ekspert (227,510 p.)
Nie wspierane na IE6, więc odpada :P
2
komentarz 9 września 2018 przez Comandeer Guru (601,590 p.)
Jak mnie takie podejście wkurza, serio. Co proponuje się gdzieś nowsze rozwiązanie "no a IE?". No a IE jest martwe i oglądanie się na niego nie przyczyni się do jakiegokolwiek rozwoju Sieci. Tyle w temacie. A z IO wgl nie ma problemu, bo to API proste do stworzenia polyfilla.
0 głosów
odpowiedź 10 września 2018 przez zgrybus Pasjonat (24,860 p.)

Przy okazji do zoptymalizowania możesz użyć tego dekoratora

Podobne pytania

0 głosów
1 odpowiedź 511 wizyt
pytanie zadane 30 października 2017 w JavaScript przez Adrian1999 Nałogowiec (34,570 p.)
0 głosów
1 odpowiedź 340 wizyt
pytanie zadane 8 lipca 2015 w JavaScript przez aspoka Mądrala (5,290 p.)
0 głosów
1 odpowiedź 449 wizyt
pytanie zadane 12 maja 2021 w JavaScript przez poldeeek Mądrala (5,980 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...