为 IE 优化 jQuery

Posted

技术标签:

【中文标题】为 IE 优化 jQuery【英文标题】:optimization jQuery for IE 【发布时间】:2011-12-18 14:06:05 【问题描述】:

我有功能:

function doBlamingItem($cell, showEditMark) 
    $cell.hover(function () 
        $cell.toggleClass('clickable-cell', showEditMark).toggleClass('editing-cell', !showEditMark);
    , function() 
        $cell.removeClass('clickable-cell editing-cell');
 );;

在 $(document).ready() 中,我将此函数应用于表中的某些单元格(~500),当我将鼠标移到它上面时 - 在 FF 或 Chrome 中一切正常,但 IE7-9 开始滞后并且我不知道如何解决它:(

以及来自 $(document).ready() 的代码:

var i = firstRowOnPage();
while (table.GetRow(i) != null) 
    if (condition) 
        var row = table.GetRow(i);
        var elementInCellId = column.fieldName + '_' + rowKey;
        var $cell = $(row.cells[realIndex]).attr('id',elementInCellId);
        doBlamingItem($cell, true);
        setClickable(editInfo, $cell);
    
i++;

我对每个单元格都使用 doBlamingItem,因为其中一些为 showEditMark=true,而另一些为 showEditMark=false

【问题讨论】:

对不起,我帮不上忙,但我想说的是,至少在这个问题上,你的英语看起来并不糟糕 :) 你确定没有对每个元素应用 500 个事件处理程序吗?! 请显示调用此函数的代码。 意识到 IE 仍然比竞争对手慢一点。此外,表格在 html-dom 世界中非常特殊。 this jsperf test case 是一个很好的例子(在 jsperf 上的大量其他案例中) 【参考方案1】:

您的代码基本上 (1) 找到了大约 500 个元素,(2) 将它们迭代到 (3) 分配悬停事件(由 mouseenter 和 mouseleave 组成)。你听说过delegated events吗?

设置时间几乎为零(仅注册了 2 个事件处理程序,而不是 1000 个)。没有选择和遍历任何元素。

(function($, undefined)
  // if you want it global
  var showEditMark = true;
  // otherwise save that state to some element's data()

  $(function()
    $(document.body).delegate('.your-table-selector td', 
      mousenter: function(e)
        $(this)
          .toggleClass('clickable-cell', showEditMark)
          .toggleClass('editing-cell', !showEditMark);
      ,
      mouseleave: function(e)
        $(this).removeClass('clickable-cell editing-cell');
      
    );
  );
)(jQuery);

【讨论】:

我对每个单元格都使用doBlamingItem,因为其中一些单元格为showEditMark=true,其他单元格为showEditMark=false 您可能仍然对它们使用相同的事件处理程序,并且该事件处理程序必须检查给定单元格的showEditMarktrue 还是false 我将代码更改为使用委托并创建了全局数组:window.flags[cellID] = showEditMark;但现在我的页面开始滞后了:( 我必须查看代码才能告诉您您做错了什么……我想知道您为什么要使用全局变量而不是 $.fn.data() 或简单的类。跨度> 因为使用全局数组,这段代码比 $.data() 运行得更快【参考方案2】:

感谢所有回答我问题的人,但当我意识到问题不在 javascript 中时...我的页面有很大的 DOM-tree 元素和许多 CSS 样式,因此 IE 在渲染它时存在问题

【讨论】:

以上是关于为 IE 优化 jQuery的主要内容,如果未能解决你的问题,请参考以下文章

jQuery基础——样式篇

为手机/平板电脑优化的 jQuery 主题?

jQuery代码优化:事件委托

在 IE 的 jQuery Ajax 成功函数中无法识别选择器

使用 RequireJS 优化器 r.js 缩小后,Jquery 对象转换为普通变量

win7 IE8无法加载jquery的js问题?