Erläuterung zu JavaScript-Anti-Shake und -Throttling

Erläuterung zu JavaScript-Anti-Shake und -Throttling

Stabilisierung

Die automatische Tür erkennt jemanden, öffnet die Tür und startet einen 5-Sekunden-Countdown. Wenn sich innerhalb von 5 Sekunden eine weitere Person der Tür nähert, erkennt die Tür jemanden und startet erneut einen 5-Sekunden-Countdown.

Wenn ein Ereignis ausgelöst wird, wird eine Verzögerung eingestellt. Wenn das Ereignis innerhalb dieser Zeitspanne erneut ausgelöst wird, wird die Verzögerung zurückgesetzt, bis die Verzögerung endet und die Aktion ausgeführt wird (um mehrfaches Auslösen zu verhindern).

In der Webanwendung

  • Statistiken zur Änderung der Seitengröße
  • Statistik der Scroll-Seitenposition
  • Steuern Sie die Anzahl der Anforderungen für kontinuierliche Eingaben im Eingabefeld

Klicken Sie zu Beginn auf die Schaltfläche console.log('pay money')

<Text>
  <button id="btn">Klick</button>
</body>
<Skript>
  const btn = document.getElementById('btn')
  Funktion zahleGeld() {
    console.log('Geld bezahlen');
  }
  btn.addEventListener('klicken', Geld bezahlen)
</Skript>

Definieren von Entprellung

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
}
Funktion Entprellung(Funktion) {
  //Gibt die Funktion in der Funktion zurück, gibt die Funktion nur zurück, wenn geklickt wird return function () {
    Funktion()
  }
}
btn.addEventListener('klicken', entprellen(Geld bezahlen))

Einstellen der Verzögerung

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
}
Funktion Entprellung(Funktion, Verzögerung) {
  Rückgabefunktion () {
    setTimeout(_ => func(), Verzögerung)
  }
}
btn.addEventListener('klicken', entprellen(Geld zahlen, 1000))

Verzögerung löschen: Ausführung fehlgeschlagen

Grund

Bei jedem Klick wird der Inhalt der Return-Funktion ausgeführt

Die Ausführungsfunktion jedes Klicks ist unabhängig und stört sich nicht gegenseitig.

Da zwischen ihnen keine Verbindung besteht, funktioniert die Löschverzögerung hier überhaupt nicht

Um diese unabhängigen Ausführungsfunktionen zu verbinden, müssen wir Bereichsketten (Closures) verwenden.

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
}
Funktion Entprellung(Funktion, Verzögerung) {
  Rückgabefunktion () {
    Timer einschalten
    Intervall löschen(Timer)
    Timer = setTimeout(_ => func(), Verzögerung)
  }
}
btn.addEventListener('klicken', entprellen(Geld zahlen, 1000))

Platzieren Sie den Timer außerhalb der Rückgabefunktion, sodass timer gleichzeitig mit dem Abhörereignis definiert wird.

Aufgrund der Gültigkeitsbereichskette können alle unabhängigen Ausführungsfunktionen auf diese Timervariable zugreifen.

Und jetzt wird diese Timervariable nur einmal erstellt. Es ist eindeutig. Wir weisen dem Timer einfach weiterhin Werte zu, um ihn zu verzögern.

Bei jeder Löschverzögerung wird die zuletzt definierte Verzögerung gelöscht. Dies entspricht mehreren Funktionen, die dieselbe externe Variable gemeinsam nutzen.

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
}
Funktion Entprellung(Funktion, Verzögerung) {
  Timer einschalten
  Rückgabefunktion () {
    Intervall löschen(Timer)
    Timer = setTimeout(_ => func(), Verzögerung)
  }
}
btn.addEventListener('klicken', entprellen(Geld zahlen, 1000))

Bezieht sich dies in diesem Code auf das Fenster?

Durch den Rückruf ist die Laufzeit bereits unter Windows

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
  konsole.log(dies);
}
Funktion Entprellung(Funktion, Verzögerung) {
  Timer einschalten
  Rückgabefunktion () {
    Intervall löschen(Timer)
    Timer = setTimeout(_ => func(), Verzögerung)
  }
}
btn.addEventListener('klicken', entprellen(Geld zahlen, 1000))

Lösung

Speichern Sie dies vor setTimeout. Diesmal zeigt dies auf die Schaltfläche.

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
  konsole.log(dies);
}
Funktion Entprellung(Funktion, Verzögerung) {
  Timer einschalten
  // Diese Funktion wird nur zurückgegeben, wenn sie angeklickt wird. Dies ist also die Rückgabefunktion (), die auf die Schaltfläche { zeigt.
    lass Kontext = dies
    Intervall löschen(Timer)
    Timer = setzeTimeout(_ => {
      Funktion.apply(Kontext)
    }, Verzögerung)
  }
}
btn.addEventListener('klicken', entprellen(Geld zahlen, 1000))

Betrachten Sie das Parameterproblem und fügen Sie arg hinzu

const btn = document.getElementById('btn')
Funktion zahleGeld() {
  console.log('Geld bezahlen');
  konsole.log(dies);
}
Funktion Entprellung(Funktion, Verzögerung) {
  Timer einschalten
  Rückgabefunktion () {
    lass Kontext = dies
    let args = Argumente
    Intervall löschen(Timer)
    Timer = setzeTimeout(_ => {
      Funktion.apply(Kontext)
      Konsole.log(Kontext, Argumente);
    }, Verzögerung)
  }
}
btn.addEventListener('klicken', entprellen(Geld zahlen, 1000))

Drosselung

Nach einmaligem Auslösen mehrere Auslösungen in Zukunft verhindern

Scrolling-Bildschirm: Zählen Sie das Scrolling-Verhalten des Benutzers, um entsprechende Reaktionen auf die Webseite zu ermöglichen

Wenn Benutzer weiter scrollen, werden weiterhin Anfragen generiert und die Anzahl der Anfragen steigt weiter an, was leicht zu einer Überlastung des Netzwerks führen kann.

Wir können die Aufgabe sofort ausführen , wenn das Ereignis ausgelöst wird , und dann ein Zeitintervalllimit festlegen. Während dieser Zeit wird der Vorgang ignoriert, unabhängig davon, wie der Benutzer scrollt.

Wenn nach Ablauf der Zeit ein Scroll-Verhalten des Benutzers erkannt wird, wird die Aufgabe erneut ausgeführt. Und stellen Sie das Zeitintervall ein

Schreiben Sie zunächst einen Code , der die Seitengröße und die Hintergrundfarbe der Seite ändert

Funktion Färbung() {
  sei r = Math.floor(Math.random() * 255)
  sei g = Math.floor(Math.random() * 255)
  sei b = Math.floor(Math.random() * 255)
  Dokument.Body.Style.Background = `rgb(${r}, ${g}, ${b})`
}
window.addEventListener('Größe ändern', Färbung)
Funktion Drosselklappe(Funktion, Verzögerung) {
  Timer einschalten
  Rückgabefunktion () {
    Timer = setzeTimeout(_ => {
      Funktion()
    }, Verzögerung)
  }
}
window.addEventListener('Größe ändern', Drosselung(Färbung, 2000))

Ermitteln Sie, ob das ausgelöste Ereignis innerhalb des Zeitintervalls liegt

  • Nicht in: Triggerereignis
  • In: Es wird kein Ereignis ausgelöst
Funktion Drosselklappe(Funktion, Verzögerung) {
  Timer einschalten
  Rückgabefunktion () {
    // Dem Timer wird ein Wert zugewiesen. Gib ihn direkt zurück, d. h. führe die Aufgabe nicht aus, wenn (Timer) {
      zurückkehren
    }
    // Zu diesem Zeitpunkt wurde dem Timer noch kein Wert zugewiesen oder der Timer wurde ausgeführt // Weisen Sie dem Timer einen Wert für die verzögerte Ausführung zu timer = setTimeout(_ => {
      Funktion()
      // Nach der Verzögerungsausführung müssen wir den Wert des Timers löschen timer = null
    }, Verzögerung)
  }
}
window.addEventListener('Größe ändern', Drosselung(Färbung, 2000))

Lösen Sie diesen Punkt (obwohl das aktuelle Beispiel unter Windows ist)

Funktion Drosselklappe(Funktion, Verzögerung) {
  Timer einschalten
  Rückgabefunktion () {
    lass Kontext = dies
    let args = Argumente
    // Dem Timer wird ein Wert zugewiesen. Gib ihn direkt zurück, d. h. führe die Aufgabe nicht aus, wenn (Timer) {
      zurückkehren
    }
    // Zu diesem Zeitpunkt wurde dem Timer noch kein Wert zugewiesen oder der Timer wurde ausgeführt // Weisen Sie dem Timer einen Wert für die verzögerte Ausführung zu timer = setTimeout(_ => {
      func.apply(Kontext, Argumente)
      // Nach der Verzögerungsausführung müssen wir den Wert des Timers löschen timer = null
    }, Verzögerung)
  }
}
window.addEventListener('Größe ändern', Drosselung(Färbung, 1000))

Drosselung des Kerns: Ereignisintervall Ein weiteres gängiges Zeitintervall ist die Verwendung des Date-Objekts

Funktion Drosselklappe(Funktion, Verzögerung) {
  // Wir müssen mit dem vorherigen Zeitpunkt vergleichen, um festzustellen, ob das Zeitintervall abgelaufen ist. // Außerhalb der Rückgabefunktion, um eine automatische Änderung bei jeder Ausführung zu vermeiden. let pre = 0
  Rückgabefunktion () {
    //Speichern Sie die Zeit, zu der die Funktion ausgeführt wird let now = new Date()
    // Zu Beginn wird es auf jeden Fall ausgeführt, wenn (now - pre > delay) {
      // Das Zeitintervall ist abgelaufen und die Funktion kann ausgeführt werden func()
      // Nach der Ausführung den Intervallpunkt zurücksetzen pre = now
    }
  }
}
window.addEventListener('Größe ändern', Drosselung(Färbung, 1000))

Parameterprobleme lösen

Funktion Drosselklappe(Funktion, Verzögerung) {
  sei pre = 0
  Rückgabefunktion () {
    lass Kontext = dies
    let args = Argumente
    lass jetzt = neues Datum()
    wenn (jetzt - vor > Verzögerung) {
      func.apply(Kontext, Argumente)
      vor = jetzt
    }
  }
}
window.addEventListener('Größe ändern', Drosselung(Färbung, 1000))

Zusammenfassen

Dieser Artikel endet hier. Ich hoffe, er kann Ihnen helfen. Ich hoffe auch, dass Sie mehr Inhalten auf 123WORDPRESS.COM mehr Aufmerksamkeit schenken können!

Das könnte Sie auch interessieren:
  • Analyse der Anti-Shake-Drosselungsfunktion von JavaScript
  • Was ist JavaScript Anti-Shake und Throttling
  • Eine kurze Diskussion über JavaScript-Drosselung und Anti-Shake
  • Detaillierte Erklärung zu JavaScript Anti-Shake und Throttling
  • Kennen Sie die Anti-Shake- und Throttling-Funktionen von JavaScript?

<<:  Der Prozess zum Erstellen eines Jenkins-Projekts unter Linux (am Beispiel von CentOS 7)

>>:  MySQL-Lernaufzeichnung: Blutiger Vorfall durch KEY-Partition verursacht

Artikel empfehlen

Vorteile und Nachteile von JSON sowie Einführung in die Verwendung

Inhaltsverzeichnis 1. Was ist JSON 1.1 Array-Lite...

Verwenden Sie momentJs, um eine Countdown-Komponente zu erstellen (Beispielcode)

Heute möchte ich einen Countdown von Vue und Mome...

js, um ein Wasserfall-Flusslayout zu erreichen (unendliches Laden)

In diesem Artikelbeispiel wird der spezifische Co...

js um das Schlangenspiel mit Kommentaren zu implementieren

In diesem Artikelbeispiel wird der spezifische Co...

MySQL-Grundlagen - Kurzanleitung - Wissenszusammenfassung (mit Mindmap)

Inhaltsverzeichnis Vorwort 1. Grundkenntnisse der...

Java-Beispielcode zum Generieren von zufälligen Zeichen

Beispielcode: importiere java.util.Random; import...

CSS3 realisiert die Animation des Shuttle-Sternenhimmels

Ergebnis: html <canvas id="Sternenfeld&qu...

Bietet hilfreiche Vorschläge zur Verbesserung des Website-Designs

<br />Gestalten Sie Ihre Website wissenschaf...