1

我注意到这条线

    $('#opp-tabs input[type=text]:not(#newActionText), #opp-tabs textarea').live('keyup', function() {
        onFormChanged();
    });

在 IE8 中运行速度极慢,它在 firefox 和 chrom 中运行良好,但在 IE 中却不行,老实说,它是“not”这个词的 cos,它如何定义这种在 IE 中以正常速度运行的不同?

4

2 回答 2

4

您确实应该确保选择器尽可能轻量级,尤其是.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 引擎

于 2012-10-09T10:30:55.530 回答
1

添加到@jAndy 的答案中,您可以将其表示为

$('#opp-tabs input[type=text], #opp-tabs textarea').live('keyup', function() {
    if(this.id != "newActionText") onFormChanged();
});
于 2012-10-09T10:33:00.770 回答