• 咦?浏览器又崩了?再试试这个呢!


    由于连续进行过多的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(),多数情况下,用户是感受不到变化的,但是浏览器会节省大量运算。

    扫码加群,每日更新一篇前端技术文章一起成长。
    

  • 相关阅读:
    架构师的成长之路初片~ntp时间同步
    架构师的成长之路初片~水晶头的颜色排序
    架构师的成长之路初片~Python-邮件(smtplib)、requests模块、API接口调用
    架构师成长之路之~调优思维
    架构师的成长之路初片~python~调整背景及滚轮+各种快捷键
    架构师成长之路之~Node.js安装篇
    微服务技术栈
    C#资源释放(托管资源、非托管资源)
    Beyond Compare 4 密匙
    MySql批量导入 .netcore命名空间完全相同问题
  • 原文地址:https://www.cnblogs.com/bbqq1314/p/12545458.html
Copyright © 2020-2023  润新知