关于性能,最好的方法是什么:setInterval()或body上的全局事件
What is a best approach regarding performance: setInterval() or a global event on body?
我在处理当前项目时遇到了这个问题。
我有一个表,里面有一堆可以由用户修改的数据。根据执行的修改,一系列框会更新它们显示的信息(预算计算、估计价格等)。
我想了两种方法来解决这个问题。
一种是使用setInterval
函数。每隔半秒,读取表中所有数据以更新框的函数就会被触发。
第二种方法是将事件设置为整个页面:
$(document.body).on("keyup paste", function() {calculate();});
我想知道考虑到性能,这两种方法中哪一种是最好的方法。到目前为止,我会说第二个,因为不知何故,我对反复触发的函数的使用有偏见,但我对这件事的理解有点初级,我可能采取了错误的方法。
根据计算函数的复杂性,我认为第二个选项(关键事件触发器)可能很好。如果有很多计算在进行,那么你甚至可能想考虑混合使用密钥触发器和setTimeout,如下所示:
var keyTimeoutDelay;
$('body').on('keyup paste', function(){
// Check if a timeout is set, and clear it if so...
if(keyTimeoutDelay) clearTimeout( keyTimeoutDelay );
// Set a timeout to delay the processing by 500ms.
keyTimeoutDelay = setTimeout(function(){
calculate();
}, 500);
});
function calculate(){
// Complex calculation stuff
}
此代码将在keyup事件和"粘贴"时运行,但仅当按键之间有500ms的延迟时才会调用calculate()函数。你可以通过用手指在键盘上的所有键上移动来尝试它-calculate()方法只有在你停止"键入"时才会被调用
您可以尝试使用javascript debounce函数。http://davidwalsh.name/javascript-debounce-function
$(document.body).on("keyup paste", debounce(function() {calculate();}, 100) );
您应该使用事件处理程序/侦听器。当数据没有更改时,没有必要重新计算数据——这是浏览器正在做的不必要的工作。但它当然不一定要在整个身体上。您可以根据用户与特定元素(您所指的框)的交互方式触发事件,而不是根据用户与整个页面的交互方式来触发事件。
例如,我假设您使用<input>
字段:您可以使用jQuery将"input"事件绑定到每个字段,并在每次触发时运行计算函数。有关更多详细信息,请参阅此处的各种问题答案。
在某些情况下,将事件处理程序附加到主体可能很有用,但对于您的情况,这似乎只会增加不必要的开销。
MDN在现代浏览器中有一个关于事件侦听器的页面——jQuery也不是绝对必要的。
- node.js:setInterval()正在跳过调用
- setInterval和clearInterval javascript无法按需工作
- 不同页面背景的body标记上的角度ng样式
- Don'我不明白为什么我的setInterval+jQuery;不起作用
- contentWindow.document.body is null
- setInterval游戏循环的范围问题
- JavaScript setInterval problems
- 在jQuery中使用$('body').html('')意味着什么
- 如何在Javascript中延迟setInterval
- 如何执行相同的setInterval()
- SetInterval在javascript对象中表现怪异
- 从setInterval方法移动到带有sprite的requestAnimationFrame
- 如何在悬停时暂停setInterval
- 如果在iframe中查看页面,如何在Wordpress中添加body类
- '这'内部'body'标签
- node js post request.body undefined
- jQuery body onChange具有多个元素和多个函数
- 可以't获取setInterval函数以使用javascript中的this.function_name调用另一
- 关于性能,最好的方法是什么:setInterval()或body上的全局事件
- body标签是否可以保存multiply onload= setInterval()