`

Web中连续触发事件影响性能的解决办法

阅读更多

        当类似用户改变浏览器窗口大小的事件,有可能会连续触发多次。有的页面需要做到联动处理,在多次触发中可能会卡死,尤其是在性能低下的IE上若每次触发都执行一些图形渲染更是个大问题。

 

        以下代码就解决了这个问题。绑定了window的resize事件,但是每次触发后会延迟500毫秒,给每次触发这个事件进行了tag标识,只处理连续触发后的最后一次的触发行为。

 

$(function(){
			var tag = 0;
			var coverChartWidth  = function(t){
				if(t != tag){return;}
				var w = $(document).width() || 0;
				if(w < 1150){
					$('#chartTable').width(1150);
				}
			};
			$(window).bind('resize',function(){
				tag++;
				(function(t){
					setTimeout(function(){
						coverChartWidth(t);
					},500);
				})(tag);
			});
		});
		

 

用tag标识的方法确实太麻烦了,借鉴网友的更好的方法代码如下:

//可进一步扩展为支持可传参的fn
var onFooEndFunc = function(fn) {
    var delay = 50; // 根据实际情况可调整延时时间
    var executionTimer;
    return function() {
        if (!!executionTimer) {
            clearTimeout(executionTimer);
        }
        //这里延时执行你的函数
        executionTimer = setTimeout(function() {
            //alert('123');
            fn();
        }, delay);
    };
};

在使用的时候直接调用这个 onFooEndFunc 函数,把你需要的处理函数传进去即可。 

下面以document.onmousemove为例,自己试试运行的效果,使用延时处理前,移动鼠标,会发现事件触发非常频繁,使用延时处理后,移动鼠标,事件就没那么频繁了。

测试代码:(在线测试:http://pgkk.github.io/testDelayEvent.html

<html>
<head>
<script type="text/javascript">
var count = 0;
         var myfn = function() {
             document.getElementById("TextArea1").value = "Executed " + (++count) + " times.";
         }
         var normalevent = function() {
             count = 0;
             document.getElementById("TextArea1").value = "Executed 0 times.";
             document.onmousemove = myfn;
         };
         var endevent = function() {
             count = 0;
             document.getElementById("TextArea1").value = "Executed 0 times.";
             document.onmousemove = onFooEndFunc(myfn);
         };
</script>
</head>
<body>
<input id="normal" value="恢复正常" onclick="normalevent()" type="button" />&nbsp;
<input id="end" value="使用延时" onclick="endevent();" type="button" />&nbsp;

<textarea id="TextArea1" style="height: 40px; width: 200px; color: #ff0000; clip: rect(auto, auto, auto, auto);"></textarea>
</body>
</html>

 

上面只是以 document.onmousemove为例,还有很多其他DOM事件存在相同问题,例如onScroll, onMouseMove, onResize,同理,都可以用这个方法来解决,具体还可以看这里的例子,方法本质上都是一样的。

1
0
分享到:
评论
2 楼 mfkvfn 2014-03-05  
mfkvfn 写道
直接用clearTimeout不就行了。
    $(function(){   
                $(window).bind('resize',function(){  
                    window.xxxTimer && clearTimeout(window.xxxTimer);  
                    window.xxxTimer= setTimeout(function(){  
                            coverChartWidth(t);  
                        },500);  
                    };  
                });  
      });  



写错了。应该是
$(function(){   
                $(window).bind('resize',function(){  
                    window.xxxTimer && clearTimeout(window.xxxTimer);  
                    window.xxxTimer= setTimeout(function(){  
                            //window的resize监听处理;  
                     },500);   
                });  
});  


1 楼 mfkvfn 2014-03-05  
直接用clearTimeout不就行了。
    $(function(){   
                $(window).bind('resize',function(){  
                    window.xxxTimer && clearTimeout(window.xxxTimer);  
                    window.xxxTimer= setTimeout(function(){  
                            coverChartWidth(t);  
                        },500);  
                    };  
                });  
      });  

相关推荐

    jQuery 防止相同的事件快速重复触发方法

    在Web开发中,防止用户在短时间内重复触发相同的事件是一个常见需求。例如,在提交表单或者发送Ajax请求时,用户可能会因为点击事件没有即时响应而多次点击按钮,导致数据重复提交。这种现象不仅影响用户体验,还...

    JS冒泡事件与事件捕获实例详解

    冒泡事件和事件捕获是JavaScript中...总之,冒泡事件与事件捕获是JavaScript中事件处理的核心概念,它们提供了一种机制来控制事件在DOM结构中的传播方式,对于实现复杂的交互逻辑、提高Web应用性能和用户体验至关重要。

    HTML4.0 参考手册 HTML事件资料大全

    这不仅涉及基本的交互设计,还关系到网页性能优化,因为不当的事件处理可能会导致页面响应缓慢或消耗过多资源。同时,随着Web技术的发展,HTML5引入了更多新的事件和特性,但HTML4.0仍然是许多现有网站的基础,因此...

    touch 移动端web手势滑动完成轮播图切换效果

    2. **touchmove**:在手指滑动过程中,浏览器会连续触发`touchmove`事件。我们需要在每次`touchmove`事件中更新触摸点的位置,并计算出手指滑动的距离。为了防止过度平滑,通常我们会设置一个阈值,只有当滑动距离...

    WEB服务监视器 1.0

    【WEB服务监视器 1.0】是一款专用于监测WEB服务运行状态的工具,它能够实时监控Web应用程序的性能和稳定性,确保网站和服务的高效、可靠运行。此工具的使用对于IT管理员来说至关重要,因为它可以帮助他们及时发现并...

    JQ 合成事件

    4. 对于连续快速触发的事件,考虑使用合成事件来优化性能。 总之,jQuery的合成事件是其优化事件处理的一个重要特性,它能够提高页面性能,减少资源消耗。理解和正确使用合成事件,对于提升Web应用的响应速度和用户...

    Spark应用程序WebUI详解.docx

    ### Spark Web UI 详解 #### 一、Spark Web UI 概览 Spark Web UI 是一个图形化的用户界面,用于监控正在运行的 Spark 应用程序的状态。它提供了丰富的信息,帮助用户了解应用程序的运行情况、性能瓶颈以及资源...

    web360全景项目

    【web360全景项目】是一个利用JavaScript技术实现的创新性Web应用,旨在为用户提供全方位、立体化的视觉体验。在互联网领域,360度全景技术广泛应用在虚拟现实(VR)、旅游、房地产、室内设计等多个场景,使得用户...

    基于中间件的Web数据库服务模型研究(全文).docx

    - 专用的Web服务器捆绑数据库服务,如Oracle Web Server与Oracle数据库的紧密集成,提供了高性能的解决方案,但可能不兼容其他数据库系统。 Web_DB技术产品通常会扩展HTML标准,支持服务器端程序或脚本,并允许...

    WEB特有测试项.ppt

    - **重复提交测试**:确保在网络延迟或用户快速连续操作时不会触发重复请求。 - **导航测试**:验证整个网站的导航结构是否连贯,链接跳转是否正常。 - **链接测试**:确认所有链接都能指向正确的目标,无死链。 ...

    javascript阻止scroll事件多次执行的思路及实现

    例如,将500毫秒作为延迟时间,表面上看可以减少事件的触发频率,但如果用户在500毫秒内再次滚动,延迟的函数仍然会被加入到事件队列中并依次执行,这不能完全解决连续触发的问题。 一个更为合理的方法是利用条件...

    Array SPX 产品WebUI手册 V8.2.2

    Array SPX是一款高性能的分布式存储系统,其WebUI(Web用户界面)是管理员进行系统管理、监控和配置的主要工具。本手册V8.2.2版本详细介绍了如何使用WebUI来操作和管理Array SPX产品。 一、Array SPX产品概述 Array...

    jquery web页面 api

    6. **链式操作(Chaining)**:jQuery对象返回的是jQuery实例,所以可以连续调用多个方法,如`$('p').css('color', 'red').hide().fadeIn(1000);` 7. **插件(Plugins)**:jQuery拥有庞大的插件生态系统,如...

    HBase性能深度分析

    以随机值的Rowkey(长度设定为2000字节)与固定值的Value(长度设定为4000字节)为例,测试采用连续插入500行Row并统计一次耗时的方法,旨在准确测量单次操作的时间消耗。这一设计考虑到HBase对Rowkey的排序处理,...

    C#中WebBrowser.DocumentCompleted事件多次调用问题解决方法

    然而,在实际使用过程中,可能会遇到`WebBrowser.DocumentCompleted`事件被多次调用的问题,这可能导致程序逻辑错误或者性能问题。本文将详细解析这个问题的原因,并提供相应的解决方案。 `DocumentCompleted`事件...

    IIS自动停止,iis自动关闭等解决办法

    但在实际使用过程中,有时会出现IIS无故自动关闭停止的情况,这不仅会给维护人员带来困扰,还会影响到用户体验和服务的连续性。 #### 二、IIS自动停止的原因及解决办法 本文主要针对IIS应用程序池出现问题进行分析...

    javaScript函数节流与防抖之区别

    这意味着,即使事件在短时间内连续触发,节流函数也会按照预定的周期执行。例如,用于页面滚动的监听,每滚动一定距离执行一次更新布局的函数,即使用户快速滚动,也不会因为频繁调用而导致性能下降。 防抖和节流的...

    javascript重复绑定事件造成的后果说明.docx

    1. **性能问题**:每个额外绑定的事件都会增加内存消耗,尤其是在高频率触发的事件如鼠标移动(`mousemove`)、键盘按键(`keydown`)等场景下,多次绑定同一事件可能会显著降低应用性能。 2. **行为异常**:对于...

    AlloyFinger超级小的web手势库

    这个库的核心目标是提供一个高效且易于集成的解决方案,让开发者能够轻松地在网页应用中实现对滑动、双击、长按等常见手势的支持。 ### 一、手势识别 AlloyFinger 支持多种常见的触摸手势,包括但不限于: 1. **...

    Event for ONVIF[中文]

    而Notification Streaming Interface(在section 9.3中介绍)则提供了连续的数据流传输,适用于高频率或连续的事件情况,如视频流。 在ONVIF事件处理中,事件不仅仅是简单的触发信号,它们携带了丰富的信息,包括...

Global site tag (gtag.js) - Google Analytics