


Explication détaillée de la fonction de limitation JavaScript Throttle
Dans les événements DOM du navigateur, certains événements seront déclenchés en continu avec les opérations de l'utilisateur. Par exemple : redimensionnez la fenêtre du navigateur (resize), faites défiler la page du navigateur (scroll) et déplacez la souris (mousemove). C'est-à-dire que lorsque l'utilisateur déclenche ces opérations du navigateur, si la méthode de traitement des événements correspondante est liée au script, cette méthode sera déclenchée en continu.
Ce n'est pas ce que nous voulons, car parfois si la méthode de traitement des événements est relativement volumineuse, le fonctionnement du DOM est compliqué et de tels événements sont déclenchés en continu, cela entraînera des pertes de performances et réduira l'expérience utilisateur (réponse de l'interface utilisateur est lent, le navigateur se bloque, etc.). De manière générale, nous ajouterons une logique d’exécution différée à l’événement correspondant.
Habituellement, nous utilisons le code suivant pour implémenter cette fonction :
var COUNT = 0; function testFn() { console.log(COUNT++); } // 浏览器resize的时候 // 1. 清除之前的计时器 // 2. 添加一个计时器让真正的函数testFn延后100毫秒触发 window.onresize = function () { var timer = null; clearTimeout(timer); timer = setTimeout(function() { testFn(); }, 100); };
Les étudiants attentifs découvriront que le code ci-dessus est en fait faux. C'est un problème que les novices se poseront : La valeur de retour. de la fonction setTimeout doit être stockée dans une variable globale relative, sinon un nouveau timer sera généré à chaque redimensionnement, ce qui n'obtiendra pas l'effet que nous avons envoyé
Nous avons donc modifié le code :
var timer = null; window.onresize = function () { clearTimeout(timer); timer = setTimeout(function() { testFn(); }, 100); };
À l'heure actuelle, le code est normal, mais il y a un nouveau problème : une minuterie variable globale est générée. C'est ce que nous ne voulons pas voir. Si cette page a d'autres fonctions également appelées minuterie, différents codes entreront en conflit auparavant. Afin de résoudre ce problème, nous devons utiliser une fonctionnalité du langage JavaScript : fermeture fermetures. Les lecteurs ayant des connaissances pertinentes peuvent se rendre sur MDN pour en savoir plus. Le code modifié est le suivant :
/** * 函数节流方法 * @param Function fn 延时调用函数 * @param Number delay 延迟多长时间 * @return Function 延迟执行的方法 */ var throttle = function (fn, delay) { var timer = null; return function () { clearTimeout(timer); timer = setTimeout(function() { fn(); }, delay); } }; window.onresize = throttle(testFn, 200, 1000);
Nous utilisons une fonction de fermeture (throttle throttling) pour mettre la minuterie à l'intérieur et renvoyer la fonction de traitement du retard, de sorte que la variable timer est invisible pour le monde extérieur, mais la variable timer est également accessible lorsque la fonction de retard interne est déclenchée.
Bien sûr, cette façon d'écrire est difficile à comprendre pour les novices. On peut changer la façon d'écrire pour la comprendre :
var throttle = function (fn, delay) { var timer = null; return function () { clearTimeout(timer); timer = setTimeout(function() { fn(); }, delay); } }; var f = throttle(testFn, 200); window.onresize = function () { f(); };
La principale chose à comprendre ici est : <🎜. >Throttle est La fonction renvoyée après l'appel est la vraie fonction qui doit être appelée lorsque onresize est déclenché
Maintenant, il semble que cette méthode soit proche de la perfection, mais ce n'est pas le cas en réalité utiliser. Par exemple :Si l'utilisateurDonc nous un autre une fonction doit être ajoutée : lorsque l'utilisateur déclenche le redimensionnement, il doitredimensionne continuellement la fenêtre du navigateur, alors la fonction de traitement différé ne sera pas exécutée une seule fois
se déclencher au moins une fois dans un certain laps de temps Puisque c'est dans un certain laps de temps, alors cette condition de jugement peut prendre l'heure actuelle. millisecondes, à chaque fois Cet appel de fonction soustrait l'heure actuelle de l'heure du dernier appel, puis détermine si la différence est supérieure à une certaine période de temps , elle sera déclenchée directement. Sinon, la logique de retard de. le délai d'attente sera toujours utilisé.
Ce qu'il faut souligner dans le code suivant est :- Le rôle de la variable précédente est similaire à celui du timer. Elles enregistrent toutes deux la dernière identification et. doit être une variable globale relative
- Si le flux logique suit la logique de "déclencher au moins une fois", alors l'appel de fonction doit être réinitialisé à l'heure actuelle, ce qui signifie simplement : par rapport à l'heure précédente de la prochaine fois En fait, c'est la pratique actuelle
/** * 函数节流方法 * @param Function fn 延时调用函数 * @param Number delay 延迟多长时间 * @param Number atleast 至少多长时间触发一次 * @return Function 延迟执行的方法 */ var throttle = function (fn, delay, atleast) { var timer = null; var previous = null; return function () { var now = +new Date(); if ( !previous ) previous = now; if ( now - previous > atleast ) { fn(); // 重置上一次开始时间为本次结束时间 previous = now; } else { clearTimeout(timer); timer = setTimeout(function() { fn(); }, delay); } } };
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>throttle</title> </head> <body> <p style="height:5000px"> <p id="demo" style="position:fixed;"></p> </p> <script> var COUNT = 0, demo = document.getElementById('demo'); function testFn() {demo.innerHTML += 'testFN 被调用了 ' + ++COUNT + '次<br>';} var throttle = function (fn, delay, atleast) { var timer = null; var previous = null; return function () { var now = +new Date(); if ( !previous ) previous = now; if ( atleast && now - previous > atleast ) { fn(); // 重置上一次开始时间为本次结束时间 previous = now; clearTimeout(timer); } else { clearTimeout(timer); timer = setTimeout(function() { fn(); previous = null; }, delay); } } }; window.onscroll = throttle(testFn, 200); // window.onscroll = throttle(testFn, 500, 1000); </script> </body> </html>
// case 1 window.onscroll = throttle(testFn, 200); // case 2 window.onscroll = throttle(testFn, 200, 500);
cas 1 se comporte comme suit : testFN ne sera pas appelé pendant le processus de défilement de la page (ne peut pas être arrêté), jusqu'à ce qu'il soit arrêté une fois, c'est-à-dire que le dernier setTimeout dans la manette est exécuté. la figure (voir le gif original) :
cas 2 se comporte comme suit : pendant le processus de défilement de la page (ne peut pas être arrêté), testFN sera exécuté avec un délai de 500 ms pour la première fois (à partir d'au moins la logique de retard), puis exécuté au moins toutes les 500 ms. L'effet est comme indiqué sur la figure
- Code de test http://jsbin.com/tanuxegija/edit
- Code de la version complète http:/ /jsbin.com/jigozuvuko
- Debounce VS throttle https://github.com/dcorb/debounce-throttle
Ce qui précède est une explication détaillée de la fonction de limitation JavaScript Throttle. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

Introduction à la méthode d'obtention du code d'état HTTP en JavaScript : Dans le développement front-end, nous devons souvent gérer l'interaction avec l'interface back-end, et le code d'état HTTP en est une partie très importante. Comprendre et obtenir les codes d'état HTTP nous aide à mieux gérer les données renvoyées par l'interface. Cet article explique comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournit des exemples de code spécifiques. 1. Qu'est-ce que le code d'état HTTP ? Le code d'état HTTP signifie que lorsque le navigateur lance une requête au serveur, le service
