La fonction la plus basique de JavaScript dans les pages Web est de surveiller ou de répondre aux actions des utilisateurs, ce qui est très utile. Certaines actions de l'utilisateur sont très fréquentes et d'autres très rares. Certaines fonctions d'écoute s'exécutent à la vitesse de l'éclair, tandis que d'autres sont lourdes et peuvent entraîner la mort du navigateur. Prenons l'exemple de l'événement de redimensionnement de la fenêtre du navigateur. Cet événement sera déclenché une fois pour chaque changement d'échelle de la taille de la fenêtre du navigateur. Si l'écouteur est grand, votre navigateur sera bientôt submergé.
Évidemment, nous ne pouvons pas autoriser la suppression du navigateur, mais nous ne pouvons pas supprimer l'écouteur de suppression. Cependant, nous pouvons limiter la fréquence des appels de fonctions et affaiblir l’impact de l’exécution des fonctions événementielles. Au lieu de déclencher la fonction d'écoute une fois pour chaque changement de taille de la fenêtre, nous pouvons désormais définir l'intervalle minimum de déclenchement de la fonction d'écoute pour qu'il soit supérieur à un certain nombre de millisecondes, afin qu'elle maintienne un canal d'appel raisonnable et garantisse que l'utilisateur l'expérience n'est pas détruite. Il existe une bonne bibliothèque d'outils js appelée Underscore.js, qui dispose d'une méthode simple qui vous permet de créer facilement des écouteurs qui réduisent la fréquence des déclencheurs de fonctions d'événement.
Code JavaScript
Le code de l'écouteur à réduction de fréquence est très simple :
// Met à jour toute la mise en page ici
}, 500); // Exécuter toutes les 500 millisecondes au moins
// Ajouter l'écouteur d'événement
window.addEventListener("resize", updateLayout, false);
...La couche inférieure de ce code Underscore.js utilise en fait un intervalle pour vérifier la fréquence des appels de fonction d'événement :
// Renvoie une fonction qui, tant qu'elle continue à être invoquée, ne le sera pas
// être déclenché. La fonction sera appelée après avoir cessé d'être appelée
// N millisecondes. Si `immediate` est passé, déclenchez la fonction sur le
.
// bord d'attaque, au lieu du bord de fin.
_.debounce = function(func, attendre, immédiat) {
var délai d'attente ;
return function() {
var contexte = ceci, args = arguments;
var plus tard = function() {
délai d'attente = nul ;
If (!immediate) func.apply(context, args);
};
var callNow = immédiat && !timeout;
clearTimeout(timeout);
timeout = setTimeout(plus tard, attendez);
if (callNow) func.apply(context, args);
};
};
// Utilisez-le !
window.addEvent("resize", myFn.debounce(500));