当类似用户改变浏览器窗口大小的事件,有可能会连续触发多次。有的页面需要做到联动处理,在多次触发中可能会卡死,尤其是在性能低下的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" /> <input id="end" value="使用延时" onclick="endevent();" type="button" /> <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,同理,都可以用这个方法来解决,具体还可以看这里的例子,方法本质上都是一样的。
相关推荐
解决了在使用FileSystemWatcher控件的Changed事件时,当文件更改时,多触发多次事件的问题
主要介绍了中文输入法不触发onkeyup事件的解决办法,需要的朋友可以参考下
自动化控制、事件触发机制研究,动态事件触发,静态事件触发,自适应事件触发,相对静态事件触发。事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理...
全部都是关于js的一些触发事件,其中有很多详细的事件说明
对事件触发控制进行仿真,并使其最终结果达到稳定
主要介绍了jQuery实现长按按钮触发事件的方法,可应用于手机端应用程序的开发中,非常具有实用价值,需要的朋友可以参考下
事件触发相关程序,最优控制相关内容,可运行
自己写的,将wpf中button触发时间效果都整理了一下
在web页面开发时,我们经常会遇到下列情况: 1.一个标签仅仅是要触发onclick行为; 2.表现上要有鼠标的pointer指针显示,或者其他类似a标签的视觉效果。 比如执行删除操作时,为了避免误操作,我们要弹出对话框让用户...
VB 按下键盘时触发的KeyPress事件
gridview中的DoubleClick事件可能无法正常响应,这里列举了三种方法触发双击列表行事件
触发事件应用实例以及课件Ppt,希望能给你带来帮助!
然后假设系统存在外部干扰,采用DOBC的方法来估计实际扰动,在控制协议中增加干扰补偿项来消除干扰的影响. 接下来,将上述复合式控制协议设计为带有最小采样粒度的事件触发机制,运用现代控制理论和矩阵论等工具...
在页面加载完成时候 ‘.add_project’ 元素是可以触发click时间的,当动态添加 ‘.add_project’ 时候,新添加的元素却触发不了click事件,类似下面的写法: $(".add_project").on('click', function(){ alert(...
JavaScript触发事件列表 JavaScript编程重要参考资料
web前端小问题,select 选择事件,当选择select同一值触发onchange事件
DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件代码
9个鼠标触发事件
WindowsService定时触发事件,默认是触发webservices