jQuery Academy · Lektion

Effektiv event-håndtering og throttling

Implementér throttling og debouncing af events, der udløses ofte, som resizing eller scrolling, for at forhindre for mange funktionskald og forbedre responsiviteten.

Lektion 2 af 312 trin

Effektiv event-håndtering og throttling er en gratis jQuery Academy-lektion på CoddyKit. Dette er lektion 2 af 3. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i jQuery Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. jQuery Academy-kurset indeholder 3 lektioner i alt.

Overbelastning af hændelser: Et ydeevneproblem

Når du bygger interaktive webapplikationer, er du ofte afhængig af hændelser som rulning, ændring af vinduesstørrelse eller indtastning. Disse hændelser udløser funktioner, der opdaterer brugergrænsefladen eller udfører beregninger.

Hvis disse hændelser udløses for ofte, kan de dog føre til flaskehalse i ydeevnen, en langsom brugeroplevelse og endda nedbrud i browseren. Derfor er optimeringsteknikker afgørende.

Problemet: Hurtig udløsning af hændelser

Lad os se, hvor ofte en typisk hændelse som scroll kan udløses uden optimering. Åbn konsollen, eller hold øje med tælleren, mens du ruller.

Bemærk, hvor hurtigt tallet stiger. Det viser, at der foretages mange funktionskald på kort tid. Det kan være meget ineffektivt.

<!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>

Introduktion til throttling

Throttling er en teknik, der begrænser, hvor ofte en funktion kan kaldes i løbet af et tidsrum. Den sikrer, at en funktion højst udføres én gang i et givet tidsinterval.

Forestil dig det som en port, der kun åbner hvert 200. millisekund. Uanset hvor mange gange du prøver at komme igennem, kan du kun passere, når porten er åben.

Throttling i praksis

Her er et enkelt værktøj til throttling. Det sikrer, at vores scroll-håndtering højst kører én gang hvert 200. millisekund. Det reducerer antallet af kald betydeligt under kontinuerlig rulning.

Sammenlign dette med det foregående eksempel. Tælleren opdateres jævnt, men mindre hyppigt, så der spares ressourcer.

<!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>

Introduktion til debouncing

Debouncing er en anden teknik, der udsætter udførelsen af en funktion, indtil der er gået en bestemt tid siden sidste udløsning af hændelsen.

Forestil dig en lampe, der først slukker, når du har holdt op med at bevæge dig i 1 sekund. Hvis du fortsætter med at bevæge dig, nulstilles timeren. Funktionen kører først, når brugeren har afsluttet sin handling i det angivne tidsrum.

Debouncing i praksis

Her anvender vi debouncing på hændelsen keyup for et tekstinput. Statussen opdateres først, når du har holdt op med at skrive i 500 millisekunder.

Det er ideelt til søgefelter, hvor du kun vil udføre en søgning, når brugeren er færdig med at skrive sit søgeord.

<!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 eller debouncing: Vigtige forskelle

Selvom begge teknikker optimerer håndteringen af hændelser, har de forskellige formål:

  • Throttling: Garanterer, at en funktion udføres regelmæssigt over tid, selv hvis hændelsen udløses hurtigt. Det handler om at styre hastigheden.
  • Debouncing: Sikrer, at en funktion først udføres efter en periode uden aktivitet. Det handler om at vente på, at brugeren afslutter en handling.

Valget af den rigtige teknik afhænger af dit konkrete anvendelsestilfælde.

Praktiske anvendelsestilfælde

Her er almindelige scenarier for hver teknik:

  • Throttling:
    - Ændring af vinduesstørrelse
    - Rulning på siden
    - Træk-og-slip-bevægelser
    - Spilopdateringer (f.eks. affyring af et våben)
  • Debouncing:
    - Input i søgefelt (autofuldførelse)
    - Formularvalidering efter brugerinput
    - Lagring af indhold i en teksteditor
    - Udløsning af et API-kald, efter brugeren holder op med at skrive

Integration med jQuery-hændelser

Du kan nemt integrere disse hjælpefunktioner med jQuerys hændelsesmetoder som .on() eller .bind(). Du skal blot angive din throttlede eller debounce-de funktion som hændelseshåndtering.

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

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

Det holder dine hændelseslyttere effektive og din applikation responsiv.

Fordele for ydeevnen

Ved at implementere throttling og debouncing opnår du flere fordele for ydeevnen:

  • Reduceret CPU-forbrug: Færre funktionskald betyder mindre arbejde for browseren.
  • Jævnere brugergrænseflade: Forhindrer hakkende animationer eller brugergrænseflader, der ikke reagerer.
  • Bedre brugeroplevelse: Brugerne oplever applikationen som hurtigere og mere flydende.
  • Optimerede API-kald: Forhindrer, at din backend oversvømmes med unødvendige forespørgsler.

Hurtigt tjek af optimering af hændelser

Hvilket af følgende scenarier håndteres bedst ved hjælp af debouncing?

Opsamling og næste trin

Godt gået! Du har lært om to effektive teknikker til optimering af håndtering af hændelser:

  • Throttling: Begrænser den hastighed, hvormed en funktion kan kaldes.
  • Debouncing: Udsætter udførelsen af en funktion, indtil der har været en periode uden aktivitet.

Når du behersker disse teknikker, forbedrer du ydeevnen og reaktionsevnen i dine jQuery-applikationer betydeligt. Eksperimentér med forskellige forsinkelser for at finde det bedste punkt til dine specifikke behov!

Gratis at komme i gang

Lær JavaScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
22
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Effektiv event-håndtering og throttling” gratis?

Ja — alle 3 lektioner i læringssporet jQuery Academy, inklusive “Effektiv event-håndtering og throttling”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. jQuery Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Effektiv event-håndtering og throttling”?

Implementér throttling og debouncing af events, der udløses ofte, som resizing eller scrolling, for at forhindre for mange funktionskald og forbedre responsiviteten. Du øver dig i jQuery Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på jQuery Academy?

Der kræves ingen tidligere erfaring. jQuery Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 3.

Hvor lang tid tager lektionen “Effektiv event-håndtering og throttling”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne jQuery Academy-lektion?

Ja. Alle jQuery Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Optimering af DOM-manipulation
  2. Effektiv event-håndtering og throttling
  3. Udnyttelse af caching og Deferred-objekter
← Tilbage til jQuery Academy