我注意到这条线
$('#opp-tabs input[type=text]:not(#newActionText), #opp-tabs textarea').live('keyup', function() {
onFormChanged();
});
在 IE8 中运行速度极慢,它在 firefox 和 chrom 中运行良好,但在 IE 中却不行,老实说,它是“not”这个词的 cos,它如何定义这种在 IE 中以正常速度运行的不同?
我注意到这条线
$('#opp-tabs input[type=text]:not(#newActionText), #opp-tabs textarea').live('keyup', function() {
onFormChanged();
});
在 IE8 中运行速度极慢,它在 firefox 和 chrom 中运行良好,但在 IE 中却不行,老实说,它是“not”这个词的 cos,它如何定义这种在 IE 中以正常速度运行的不同?
您确实应该确保选择器尽可能轻量级,尤其是在.live()
方法中使用时。发生的情况是,事件实际上被绑定到document.body
并且它需要在那里检查给定事件是否与您的原始选择器字符串匹配。该过程可能非常昂贵,在您的情况下,它还需要调用Sizzle **,这使得它变得更慢。
最佳案例解决方案,使用.on()
或.delegate()
限制必要的 DOM 冒泡。这意味着,您不会将事件处理程序绑定到body
,而是绑定到最近的共享父节点,这会提高整体性能。其次,更重要的是,改进选择器!
使用类名之类的查询你需要的节点,其实不会比当前状态差多少。
要优化当前表单,请尝试如下:
$('#opp-tabs input:text, #opp-tabs textarea').not('#newActionText').on('keyup', 'closest shared parent selector', function() {});
参考:.delegate(),.on()
** Sizzle 是 jQuery 的 javascript css-selector 引擎
添加到@jAndy 的答案中,您可以将其表示为
$('#opp-tabs input[type=text], #opp-tabs textarea').live('keyup', function() {
if(this.id != "newActionText") onFormChanged();
});