Les exemples de cet article décrivent le concept et l'utilisation de la limitation des fonctions JavaScript. Partagez-le avec tout le monde pour référence, les détails sont les suivants :
Récemment, lorsque je créais une page Web, j'ai eu besoin de modifier la taille de certains éléments de la page lorsque la fenêtre du navigateur changeait, donc naturellement J'ai pensé au redimensionnement de la fenêtre. Événement, alors je l'ai écrit comme ceci
<!DOCTYPE html> <html> <head> <title>Throttle</title> </head> <body> <script type="text/javascript"> n=0; function resizehandler(){ console.log(new Date().getTime()); console.log(++n); } window.onresize=resizehandler; </script> </body> </html>
La fonction a été implémentée, mais quand j'ai changé la taille de la fenêtre du navigateur en faisant glisser, j'ai regardé la console
Oui, un simple glisser-déposer a fait exécuter ma méthode resizeHandler() 52 fois. Ce n'est pas du tout l'effet que je souhaite. En fait, le code de ma méthode resizeHandler() est très compliqué et utilise même ajax pour envoyer une requête. au serveur. Si c'était simple Changer la taille de la fenêtre une fois nécessite de l'appeler 52 fois, ce qui est correct
Limitation des fonctions
En fait, mon intention initiale est simplement d'apporter quelques ajustements au serveur. page après le redimensionnement de la fenêtre, et l'événement de redimensionnement de la fenêtre ne se déclenche pas une fois le redimensionnement terminé. Je ne connais pas la fréquence spécifique, mais il est appelé en continu jusqu'à ce que la taille de la fenêtre ne change plus. En fait, un mécanisme similaire est le mousemove, qui est déclenché à plusieurs reprises sur une courte période de temps.
Dans "JavaScript Advanced Programming", il existe une fonction spéciale de limitation pour résoudre ce problème
function throttle(method,context){ clearTimeout(method.tId); method.tId=setTimeout(function(){ method.call(context); },500); }
Le principe est très simple : utilisez une minuterie pour retarder l'exécution de la fonction de 500 millisecondes. une fonction est à nouveau appelée au sein de la fonction, le dernier appel sera supprimé, et cet appel sera exécuté 500 millisecondes plus tard, et ainsi de suite. De cette façon, le code que je viens de créer peut être modifié en
<script type="text/javascript"> n=0; function resizehandler(){ console.log(new Date().getTime()); console.log(++n); } function throttle(method,context){ clearTimeout(method.tId); method.tId=setTimeout(function(){ method.call(context); },500); } window.onresize=function(){ throttle(resizehandler,window); }; </script>
Faites-le glisser et essayez-le. Bien sûr, il n'est exécuté qu'une seule fois. >
Il y a aussi une section de fonctions sur le schéma de streaming Internet, voici ce qu'elle faitAppelez-la et essayez-la, le même effet
function throttle(method,delay){ var timer=null; return function(){ var context=this, args=arguments; clearTimeout(timer); timer=setTimeout(function(){ method.apply(context,args); },delay); } }
<script type="text/javascript"> n=0; function resizehandler(){ console.log(new Date().getTime()); console.log(++n); } function throttle(method,delay){ var timer=null; return function(){ var context=this, args=arguments; clearTimeout(timer); timer=setTimeout(function(){ method.apply(context,args); },delay); } } window.onresize=throttle(resizehandler,500);//因为返回函数句柄,不用包装函数了 </script>
Comparer
Les deux méthodes utilisent setTimeout, mais la différence est que la fonction ajoutée dans la deuxième méthode retarde le temps d'exécution. Cette fonction peut facilement être utilisée dans la première solution, simplement en ajoutant. un paramètre. Mais la première solution définit tId comme variable de la fonction et l'enregistre, tandis que la deuxième solution crée une fermeture pour la stocker. Personnellement, je ne pense pas que la différence soit grande. J’aime beaucoup le premier, qui est simple et efficace. Nouvelles exigencesUn jour, j'ai créé quelque chose de similaire, tout comme l'invite automatique de saisie sur la page d'accueil de Baidu, j'ai lié l'événement keyup au texte, chaque fois que le clavier apparaît, il s'affiche automatiquement. , mais je ne veux pas demander si fréquemment, j'ai donc utilisé la méthode ci-dessus, mais c'est une tragédie. Elle ne demande qu'après avoir arrêté la saisie pendant 500 millisecondes. Il n'y a aucune invite pendant le processus de saisie. J'ai regardé le code et j'ai découvert que ce n'était pas vrai. Tant que l'utilisateur peut toucher et appuyer sur le clavier dans les 500 millisecondes, la fonction d'invite sera continuellement retardée, de sorte que l'invite ne se produira que lorsqu'elle s'arrêtera, ce qui est le cas. sans signification. Peut-il être exécuté à un intervalle fixe en fonction de la limitation des fonctions ? Petits changementsAprès une recherche sur Internet, nous pouvons apporter quelques modifications basées sur la deuxième façon d'écrire (la première façon de développer plusieurs variables pour une fonction semble un peu mauvaise) et ajouter un paramètre comme Intervalles fixes doit être exécutéafin que chaque fois que nous jugeons la durée de l'intervalle, s'il dépasse le temps défini, il sera exécuté immédiatement. Essayez l'effet avec l'exemple de tout à l'heure.
function throttle(method,delay,duration){ var timer=null, begin=new Date(); return function(){ var context=this, args=arguments, current=new Date();; clearTimeout(timer); if(current-begin>=duration){ method.apply(context,args); begin=current; }else{ timer=setTimeout(function(){ method.apply(context,args); },delay); } } }
window.onresize=throttle(resizehandler,100,200);
Effectivement, il n'est ni exécuté fréquemment ni exécuté en dernier
J'espère que cet article sera utile à tout le monde dans la programmation JavaScript. Pour des explications plus détaillées sur les concepts de limitation des fonctions JavaScript et des exemples d'utilisation, veuillez prêter attention au site Web PHP chinois !