【发布时间】:2013-06-14 01:44:26
【问题描述】:
假设我们有一个文本字段,它在每个 keydown 事件上执行以下代码:
if( $('#my_input').val() == '' )
$('#my_span').html('my input is blank');
else
$('#my_span').html('My input is not blank');
显然,我们正在执行的代码可能会将某些东西(#my_span 元素)的状态设置为它已经存在的状态,这似乎效率低下。但我很好奇替代方案是什么?添加更多检查,例如:
if ( $('#my_input').val() == '' ){
if ( $('#my_span').html() != 'my input is blank' )
$('#my_span').html('my input is blank');
}
else if ( $('#my_span').html() != 'My input is not blank' )
$('#myspan').html('My input is not blank');
后者更有效吗?在我看来,这似乎更“正确”,但显然它是更多代码,我不确定它比第一个示例效率多少。
我知道前者总是涉及 DOM 操作,这将影响计算相对效率,但我之前在非 DOM 相关代码中遇到过类似的情况,所以想知道在所有情况下最好的方法是什么。在将某项设置为新值之前,是否应该始终对某项的值进行额外检查?
编辑:
我的最终版本实际上使用了此处的答案组合,因此感谢所有人的出色回复。总而言之,我现在:
- 在闭包中缓存 jquery 对象
- 使用状态来确定新状态的分配
顺便说一句,keydown 上的 setTimeout 是一种立即获取输入字段值的好方法。再次感谢。
【问题讨论】:
-
您可以 1) 缓存元素,2) 使用布尔值来存储状态,而不是在不需要时调用
html。 -
SOMESTRING == ""可以替换为!SOMESTRING -
哈。每个答案都基于 cmets 和比较经历了 100 次迭代,现在它们几乎完全相同。真有趣。
-
哈确实 :) 随着答案逐渐变得更好,我总是在接受之间留下差距:P。我觉得这个问题仍然可以有一个更好的标题。一个更通用的?如果有人能想到更好的,请编辑。
-
我认为你在试图概括这一点时应该小心。就目前而言,问题严重依赖于 DOM,它的查询和操作昂贵,因此需要更有效的方法。例如,如果您只是简单地操作字符串,那么您的代码优化可能会非常不同,因为“缓存”和存储“状态”只会增加复杂性并使方法效率降低。
标签: javascript jquery performance