0Pricing
jQuery Academy · Lekcja

Efektywna obsługa zdarzeń i throttling

Proszę implementować throttling i debouncing dla często wywoływanych zdarzeń, takich jak zmiana rozmiaru okna czy przewijanie, aby zapobiegać nadmiernej liczbie wywołań funkcji i poprawiać responsywność.

Efektywna obsługa zdarzeń i throttling to bezpłatna lekcja jQuery Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej jQuery Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs jQuery Academy zawiera 3 lekcji w sumie.

Przeciążenie zdarzeń: problem z wydajnością

Podczas tworzenia interaktywnych aplikacji internetowych często korzystamy ze zdarzeń, takich jak przewijanie, zmiana rozmiaru okna czy wpisywanie tekstu. Zdarzenia te wywołują funkcje, które aktualizują interfejs użytkownika lub wykonują obliczenia.

Jeśli jednak zdarzenia są wywoływane zbyt często, może to prowadzić do wąskich gardeł wydajnościowych, powolnego działania aplikacji, a nawet awarii przeglądarki. Właśnie dlatego techniki optymalizacji są tak ważne.

Problem: częste wywoływanie zdarzeń

Sprawdźmy, jak często typowe zdarzenie, takie jak scroll, może być wywoływane bez żadnej optymalizacji. Otwórz konsolę lub obserwuj licznik podczas przewijania.

Zwróć uwagę, jak szybko rośnie licznik, wskazując na wiele wywołań funkcji w krótkim czasie. Może to być bardzo nieefektywne.

<!DOCTYPE html>
<html>
<head>
<title>Rapid Event Demo</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
  body { height: 200vh; font-family: sans-serif; margin: 0; }
  #status { position: fixed; top: 10px; left: 10px; background: #ffe0b2; padding: 8px; border-radius: 4px; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
  p { margin-top: 50px; padding: 10px; }
</style>
</head>
<body>
  <div id="status">Scroll Count: 0</div>
  <p>Scroll down to see the event fire rapidly.</p>
  <script>
    $(document).ready(function() {
      let count = 0;
      $(window).on('scroll', function() {
        count++;
        $('#status').text('Scroll Count: ' + count);
      });
    });
  </script>
</body>
</html>

Wprowadzenie do throttlingu

Throttling to technika ograniczająca częstotliwość wywoływania funkcji w określonym czasie. Gwarantuje, że funkcja zostanie wykonana najwyżej raz w danym przedziale czasu.

Można to porównać do bramki, która otwiera się tylko co 200 milisekund. Niezależnie od tego, ile razy spróbujesz przez nią przejść, uda Ci się to tylko wtedy, gdy bramka będzie otwarta.

Throttling w praktyce

Oto proste narzędzie do throttlingu. Gwarantuje ono, że handler przewijania zostanie wykonany najwyżej raz na 200 milisekund. Znacznie zmniejsza to liczbę wywołań podczas ciągłego przewijania.

Porównaj to z poprzednim przykładem. Licznik aktualizuje się płynnie, ale rzadziej, dzięki czemu oszczędzane są zasoby.

<!DOCTYPE html>
<html>
<head>
<title>Throttling Demo</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
  body { height: 200vh; font-family: sans-serif; margin: 0; }
  #status { position: fixed; top: 10px; left: 10px; background: #c8e6c9; padding: 8px; border-radius: 4px; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
  p { margin-top: 50px; padding: 10px; }
</style>
</head>
<body>
  <div id="status">Throttled Scroll Count: 0</div>
  <p>Scroll down. The count updates less frequently.</p>
  <script>
    // A simple throttling utility function
    function throttle(func, delay) {
      let canRun = true;
      return function(...args) {
        if (canRun) {
          func.apply(this, args);
          canRun = false;
          setTimeout(() => canRun = true, delay);
        }
      };
    }

    $(document).ready(function() {
      let count = 0;
      const throttledScroll = throttle(function() {
        count++;
        $('#status').text('Throttled Scroll Count: ' + count);
      }, 200); // Update at most every 200ms

      $(window).on('scroll', throttledScroll);
    });
  </script>
</body>
</html>

Wprowadzenie do debouncingu

Debouncing to technika, która opóźnia wykonanie funkcji do momentu, aż upłynie określony czas od ostatniego wywołania zdarzenia.

Wyobraź sobie światło, które wyłącza się dopiero po upływie 1 sekundy od zakończenia ruchu. Jeśli nadal się poruszasz, licznik jest resetowany. Funkcja zostanie wykonana dopiero wtedy, gdy użytkownik przestanie wykonywać daną czynność na określony czas.

Debouncing w praktyce

W tym przykładzie stosujemy debouncing do zdarzenia keyup pola tekstowego. Status jest aktualizowany dopiero po zakończeniu pisania na 500 milisekund.

To idealne rozwiązanie w przypadku pól wyszukiwania, gdy zapytanie powinno zostać wykonane dopiero po wpisaniu przez użytkownika całej frazy.

<!DOCTYPE html>
<html>
<head>
<title>Debouncing Demo</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
  body { font-family: sans-serif; margin: 0; padding: 20px; }
  input { padding: 8px; font-size: 16px; border: 1px solid #ccc; border-radius: 4px; width: 100%; max-width: 300px; }
  #status { background: #bbdefb; padding: 8px; margin-top: 15px; border-radius: 4px; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
</style>
</head>
<body>
  <p>Type into the box. The status updates only after you pause.</p>
  <input type="text" id="myInput" placeholder="Start typing...">
  <div id="status">Last typed: (none)</div>
  <script>
    // A simple debouncing utility function
    function debounce(func, delay) {
      let timeoutId;
      return function(...args) {
        const context = this;
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => {
          func.apply(context, args);
        }, delay);
      };
    }

    $(document).ready(function() {
      const debouncedLog = debounce(function(event) {
        $('#status').text('Last typed: ' + $(event.target).val());
      }, 500); // Wait 500ms after typing stops

      $('#myInput').on('keyup', debouncedLog);
    });
  </script>
</body>
</html>

Throttling a debouncing: najważniejsze różnice

Obie techniki optymalizują obsługę zdarzeń, ale służą do różnych celów:

  • Throttling: Gwarantuje regularne wykonywanie funkcji w czasie, nawet jeśli zdarzenie jest wywoływane bardzo często. Chodzi o kontrolowanie częstotliwości.
  • Debouncing: Gwarantuje, że funkcja zostanie wykonana dopiero po upływie czasu bezczynności. Chodzi o oczekiwanie, aż użytkownik skończy wykonywać daną czynność.

Wybór odpowiedniej techniki zależy od konkretnego przypadku użycia.

Praktyczne zastosowania

Oto typowe zastosowania każdej z technik:

  • Throttling:
    - Zmiana rozmiaru okna
    - Przewijanie strony
    - Przeciąganie i upuszczanie elementów
    - Aktualizacje w grze (np. wystrzał z broni)
  • Debouncing:
    - Wpisywanie tekstu w pasku wyszukiwania (autouzupełnianie)
    - Walidacja formularza po wprowadzeniu danych
    - Zapisywanie treści w edytorze tekstu
    - Wywołanie API po zakończeniu pisania przez użytkownika

Integracja ze zdarzeniami jQuery

Możesz łatwo zintegrować te funkcje narzędziowe z metodami zdarzeń jQuery, takimi jak .on() lub .bind(). Wystarczy przekazać funkcję z throttlingiem lub debouncingiem jako handler zdarzenia.

$(window).on('resize', throttle(myResizeHandler, 250));

$('#search-input').on('keyup', debounce(searchFunction, 300));

Dzięki temu listenery zdarzeń działają wydajnie, a aplikacja pozostaje responsywna.

Korzyści dla wydajności

Wdrożenie throttlingu i debouncingu zapewnia kilka korzyści związanych z wydajnością:

  • Mniejsze użycie procesora: Mniej wywołań funkcji oznacza mniej pracy dla przeglądarki.
  • Płynniejszy interfejs: Zapobiega zacinaniu się animacji i brakowi reakcji interfejsu.
  • Lepsze doświadczenia użytkownika: Użytkownicy odbierają aplikację jako szybszą i płynniej działającą.
  • Zoptymalizowane wywołania API: Zapobiega zasypywaniu backendu niepotrzebnymi żądaniami.

Szybkie sprawdzenie optymalizacji zdarzeń

W którym z poniższych przypadków najlepiej zastosować debouncing?

Podsumowanie i dalsze kroki

Świetnie! Poznałeś(-aś) dwie skuteczne techniki optymalizacji obsługi zdarzeń:

  • Throttling: Ogranicza częstotliwość wywoływania funkcji.
  • Debouncing: Opóźnia wykonanie funkcji do momentu upływu czasu bezczynności.

Opanowanie tych technik znacznie poprawi wydajność i responsywność Twoich aplikacji jQuery. Eksperymentuj z różnymi opóźnieniami, aby znaleźć optymalne ustawienie dla swoich potrzeb!

Często zadawane pytania

Czy lekcja „Efektywna obsługa zdarzeń i throttling” jest bezpłatna?

Tak — pełny tekst „Efektywna obsługa zdarzeń i throttling” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu jQuery Academy, przejdź na CoddyKit PRO. Kurs jQuery Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Efektywna obsługa zdarzeń i throttling”?

Proszę implementować throttling i debouncing dla często wywoływanych zdarzeń, takich jak zmiana rozmiaru okna czy przewijanie, aby zapobiegać nadmiernej liczbie wywołań funkcji i poprawiać responsywn… Ćwiczysz jQuery Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć jQuery Academy?

Nie wymagamy żadnego doświadczenia. jQuery Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.

Ile czasu zajmuje lekcja „Efektywna obsługa zdarzeń i throttling”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji jQuery Academy?

Tak. Każda lekcja jQuery Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Optymalizacja operacji na DOM
  2. Efektywna obsługa zdarzeń i throttling
  3. Wykorzystanie buforowania i obiektów Deferred
← Powrót do jQuery Academy