Maison > Article > interface Web > Sujet JavaScript 4 : Limitation
Contenu
(recommandation d'apprentissage gratuite : tutoriel vidéo javascript )
Préface
Parlons de la limitation - une autre idée d'optimisation des fonctions. Prenons l'événement mobile comme exemplenbsp;html> <meta> <meta> <meta> <title>Document</title> <style> #wrapper { width: 100%; height: 140px; background: rgba(0, 0, 0, 0.8); color: #fff; font-size: 30px; font-weight: bold; line-height: 140px; text-align: center; } </style> <p></p> <script> var count = 1; function moveAction () { oWrapper.innerHTML = count++; } var oWrapper = document.querySelector('#wrapper'); oWrapper.onmousemove = moveAction; </script>L'effet est le suivant :
1. mise en œuvre
Le principe du throttling est simple :Si vous déclenchez un événement en continu, il ne sera exécuté qu'une seule fois dans un intervalle de temps spécifique.
Concernant la mise en œuvre de la limitation, il existe deux méthodes de mise en œuvre courantes :
now
prev
S'il est grand , prouver Une fois la maintenance de l'intervalle de temps terminée, exécutez l'événement spécifié et mettez à jour now - prev > wait
Selon cette idée, nous pouvons implémenter la première version du code : prev
oWrapper.onmousemove = throttle(moveAction, 1000);function throttle(func, wait) { var _this, arg; var prev = 0; // 上一次触发的时间,第一次默认为0 return function () { var now = Date.now(); // 触发时的时间 _this = this; if (now - prev > wait) { func.apply(_this, arg); // 允许传入参数,并修正this prev = now; // 更新上一次触发的时间 } }}Jetons un coup d'oeil et utilisons-le, quel est l'effet :
Nous pouvons voir :
Lorsque la souris entre, l'événement
est exécuté immédiatement;
timer
; encore une fois après l'heure, et la minuterie sera effacée de l'appareil ;
function throttle(func, wait) { var _this, arg; var timer; // 初始化 return function () { _this = this; // 记录this arg = arguments; // 记录参数数组 if (timer) return; // 时候未到 timer = setTimeout(() => { func.apply(_this, arg); // 允许传入参数,并修正this timer = null; }, wait); }}
wait
Lorsque la souris est déplacé, l'événement ne sera pas exécuté immédiatement ;
Une fois la souris personnaliséeil sera exécuté une fois après un intervalle
wait
时间戳 | 定时器 | |
---|---|---|
“起点” | 立即执行 | n 秒后执行 |
“终点” | 停止后不会执行 | 停止会再执行一次 |
// 第三版function throttle(func, wait) { var timeout, context, args, result; var previous = 0; var later = function() { previous = +new Date(); timeout = null; func.apply(context, args) }; var throttled = function() { var now = +new Date(); //下次触发 func 剩余的时间 var remaining = wait - (now - previous); context = this; args = arguments; // 如果没有剩余的时间了或者你改了系统时间 if (remaining wait) { if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; func.apply(context, args); } else if (!timeout) { timeout = setTimeout(later, remaining); } }; return throttled;}
L'effet est démontré comme suit :
Quand je regardais le code, j'ai dû imprimer les données à plusieurs reprises avant de comprendre pourquoi cela a été fait. ensemble~Recommandations d'apprentissage gratuites associées :
javascriptCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!