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

由于连续进行过多的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

时间: 2024-08-10 04:05:41

咦?浏览器又崩了?再试试这个呢!的相关文章

IE11浏览器:请不要再叫我IE,谢谢

这篇对自已挺有用的,特mark一下,纯转载. 转载自:nczonline 微软在上周刚刚发布了用于Windows 8.1上 的首个Internet Explorer 11的预览版.我们已经确认Internet Explorer 11中的一些新特性,包括对WebGL的支持.预抓取.预渲染.flexbox.mutation observers以及其他一些Web标准的支持.但是更有趣的是,虽然被叫为Internet Explorer 11,但它已经不再是IE了. 这也是首次微软真正移除了Interne

vue elementui 使用tabs浏览器卡崩问题

记录这条问题完全因为太气人了 使用tabs一定要注意:要用<el-row> <el-col :span="数字"></el-col> </el-row>  包裹起来 <el-row> <el-col :span=''24''> <el-tabs v-model="activeName" @tab-click="handleClick"></ </ &l

微信内置浏览器的JsAPI(WeixinJSBridge续)_Alien的笔记

微信内置浏览器的JsAPI(WeixinJSBridge续)_Alien的笔记 微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript API(Javascript Interface)的文章,不过随着微信官方的调整,部分API已经不能直接使用,比如类似直接分享到朋友圈 WeixinJSBridge.invoke('shareTimeline',data,callback) 这样的功能,直接调用,会得到

微信jsApI及微信分享对应在手机浏览器的调用总结。

摘录自别人的博客: 第一篇:微信内置浏览器的JsAPI(WeixinJSBridge续) 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript API(Javascript Interface)的文章,不过随着微信官方的调整,部分API已经不能直接使用,比如类似直接分享到朋友圈 WeixinJSBridge.invoke('shareTimeline',data,callback) 这样的功能,直接调用,会得到一个访问拒绝的response.后来重新调研了下,整理出来了

chrome浏览器tab页内存占用变大,网站变慢为哪般?

问题概述: 公司做的是BS应用. 之前我们的后台服务器程序是带状态的,用ehcache存储登录状态:这两天被我改成了redis存储,应用本身不再存储登录状态. 然后自测,我在测试某个很耗时间的网页操作的时候,发现第一次请求的时候还比较快(这个请求会开200个iframe出来,每个iframe内部还有2个ajax请求)(期间浏览器会向服务器发送了大概600个请求),耗时1分钟内: 然后第二次请求的时候,发现很多请求一直处于pending状态(chrome的开发者工具可以看),等待很久也出不来页面,

微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏

之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript API(Javascript Interface)的文章,不过随着微信官方的调整,部分API已经不能直接使用,比如类似直接分享到朋友圈 WeixinJSBridge.invoke('shareTimeline',data,callback) 这样的功能,直接调用,会得到一个访问拒绝的response.后来重新调研了下,整理出来了一个WeixinAPI的Javascript类库,分享出来,如果你对微信公众平台开发感兴趣

微信浏览器下提供的分享回调

<script type="text/javascript">         // 所有功能必须包含在 WeixinApi.ready 中进行 WeixinApi.ready(function(Api) {             // 隐藏右上角popup菜单入口             //Api.hideOptionMenu();             // 隐藏浏览器下方的工具栏             //Api.hideToolbar();         

LoadRunner录制过程中,打不开IE浏览器,如何解决?

新手上路,问题连连啊,安装完LoadRunner 11后,发现LoadRunner录制过程中,打不开IE浏览器,于是我又开始一顿百度搜索原因: 大致的搜索结果如下,供各位看官浏览: 1,可能安装了多个浏览器,解决方法打开IE选项---高级--去掉"启用第三方浏览器扩展(需要重启动)"的勾选后,重启IE 2,点击我的电脑->属性->高级->性能下的设置按钮->数据执行保护-> 选中"仅为基本 Windows程序和服务启用DEP(T)"单选

360浏览器兼容模式 不能$.post (不是a 连接 onclick的问题!!)

最近发现一个360浏览器很蛋疼的事情,在兼容模式下 代码: <a href="#" onclick='doAudit(1)'>审核</a> 点击没有任何效果,试了所有浏览器都不会 于是以为是兼容模式会变成IE6 于是改成各种写法 <a href="javascript:void(0)" onclick='doAudit(1); return false;'>审核</a> 等等 发现没有任何作用 后来慢慢静下心,一段段注