由于连续进行过多的dom操作,有时候会导致浏览器运行崩溃,尤其是在ie中使用onrise事件处理的程序中有dom操作,高频的修改可能会导致浏览器崩溃,为了绕开这个问题,可以用定时器对函数进行节流。
当别人问你,同学说一下函数节流吧? 你可以告诉他,某些代码不可以在没有间断的情况连续重复执行。第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码,当第二次调用该函数时,他会清除第一次的定时器并设置另一个。如果前一个定时器已经执行过了,这个操作就没有任何意义。然而如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。目的是只有在执行函数的请求停止了一段时间之后才执行。
let processor = { timeoutId:null, //实际进行处理的方法 performPrcessing:function() { //实际执行的代码 }, //初始处理调用的方法 process:function() { clearTimeout(this.timeoutId); let that = this; this.timeoutId = setTimeout(function() { that.performPrcessing(); },100) } }
在这里创建一个processor对象,对象还有两个方法process和performProcessing(),前者是初始化任何处理所必须调用的,后者则是实际进行应完成的处理。当调用了process();第一步是清除存好的timeoutId,来阻止之前的调用被执行。然后创建一个新的定时器调用performProcessing(),由于setTimeout中用到的函数环境总是window,所以有必要保存this的引用方便用。
时间间隔100ms,表示最后一次调用process(),至少100ms后才会调用performProcessing(),所以如果100ms之内调用了process()共20次,performProcessing()仍只会被调用一次。
以后可以调用下面这个函数做到,定时器的自动设置和清除
function throttle(method,context) { clearTimeout(method.tid); method.tId = setTimeout(function(){ method.call(context); },100) }
如又一个div需要保持它的宽度始终等于高度:
window.onresize = function() { let div = document.getElementById('myDiv'); div.style.height = div.offsetWidth + 'px'; }
首先计算offsetwidth属性,css复杂的话,计算量会很大 其次高度的变化,会造成页面的reflow,这又会造成大计算量。 这时就可用throttle函数
function resizeDiv() { let div = document.getElementById('myDiv'); div.style.height = div.offsetWidth + 'px' } window.onresize = function() { throttle(resizeDiv) }
注意传入的的是resizeDiv不是resizeDiv(),多数情况下,用户是感受不到变化的,但是浏览器会节省大量运算。
扫码加群,每日更新一篇前端技术文章一起成长。
来源:https://www.cnblogs.com/bbqq1314/p/12545458.html