We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于节流的实现,有两种主流的实现方式,一种是使用时间戳,一种是设置定时器,第一种事件会立刻执行,第二种事件会在 n 秒后第一次执行,第一种事件停止触发后没有办法再执行事件,第二种事件停止触发后依然会再执行一次事件
<div class="box"></div> var box = document.getElementsByClassName("box")[0]; var WAIT_TIME = 500; var throttle1 = function (func, time){ var previous = 0, _this, args; return function (){ var now = +new Date(); //使用时间搓 _this = this; args = arguments; if(now - previous > time){ func.apply(_this, args); previous = now; } } } var throttle2 = function (func, time){ var _this, timeout, args; return function (){ _this = this; args = arguments; if(!timeout){ timeout = setTimeout(function (){ func.apply(_this, args); timeout = null; }, time); } } } var throttle3 = function (func, time){//时间戳与定时器的结合 var previous = 0, _this, timeout, args; var later = function (){ previous = +new Date(); timeout = null; func.apply(_this, args); } return function (){ var now = +new Date(); var remaining = time - (now - previous); //下次执行func剩余的时间 _this = this; args = arguments; if(remaining < 0 || remaining > time){ if(timeout){ clearTimeout(timeout); timeout = null; } previous = now; func.apply(_this, args); }else if(!timeout) { timeout = setTimeout(later, remaining); } } } var throttle4 = function (func, time, options){//时间戳与定时器的结合 var previous = 0, _this, timeout, args; if (!options) options = {}; var later = function (){ previous = options.leading === false ? 0 : new Date().getTime(); timeout = null; func.apply(_this, args); if (!timeout) _this = args = null; } return function (){ var now = +new Date(); if(!previous && options.leading === false) previous = now; var remaining = time - (now - previous); //下次执行func剩余的时间 _this = this; args = arguments; if(remaining < 0 || remaining > time){ if(timeout){ clearTimeout(timeout); timeout = null; } previous = now; func.apply(_this, args); if (!timeout) _this = args = null; }else if(!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } } } var getUserAction = function (){ console.log(this); console.log(arguments); } // box.onmousemove = throttle1(getUserAction, 1000); // box.onmousemove = throttle2(getUserAction, 1000); // box.onmousemove = throttle3(getUserAction, 1000); // box.onmousemove = throttle4(getUserAction, 1000,{ // leading:false 表示禁用第一次执行 trailing: false 表示禁用停止触发的回调 // }); box.onmousemove = throttle4(getUserAction, 1000,{ trailing: false });
The text was updated successfully, but these errors were encountered:
No branches or pull requests
关于节流的实现,有两种主流的实现方式,一种是使用时间戳,一种是设置定时器,第一种事件会立刻执行,第二种事件会在 n 秒后第一次执行,第一种事件停止触发后没有办法再执行事件,第二种事件停止触发后依然会再执行一次事件
The text was updated successfully, but these errors were encountered: