jquery - 可以修改这个 jQuery 以使其运行得更快吗?

标签 jquery performance internet-explorer

以下 jQuery each函数导致 IE8 显示“停止运行脚本?..此页面上的脚本导致您的浏览器运行缓慢..”消息。

$('.expand-collapse-icon').each(function() {
    var dupId = $(this).parent('td').attr('duplicate-id');

    var len = $(".results-table tr")
        .filter(":not(:first)")
        .filter(":has(.hidden-row[duplicate-id='" + dupId + "'])").length;

    if (len <= 0) {
        $(this).hide();
        $(this).parent('td').css('padding-left', '15px');
    }
});

基本上,我有许多可见行(大约 92 行),它们具有关联的隐藏行。这些行通过 duplicate-id 关联每个可见行都有一个 expand-collapse-icon在第一<td> 。如果单击该图标,它将显示隐藏的行。如果可见行没有关联的隐藏行,我不想显示图标。

理想情况下,如果没有关联的行,我可以阻止页面在服务器端显示图标,但代码中潜伏着巨龙。

有什么明显的方法可以加快速度吗?

最佳答案

可以肯定的一件事是在函数开头删除多个 $(this) - “缓存” this 语句值。例如:

var $this = $(this);

现在,您的脚本在每次迭代中都会在 jQuery 中包装同一个对象 3 次 - 困惑!

我想到的其他事情 - 一般来说,.each方法很慢,比简单地迭代 $(".some-选择器示例”)。 编辑:我找到了文章 10 ways to instantly increase jQuery performance ,虽然它现在已经很老了(从 2009 年开始),但大多数(如果不是全部)提示仍然建议使用。特别仔细查看图表,该图表显示了 .each 方法与同一数据集合上的常规循环的性能比较。

最后一件事可能是脚本中最影响性能的问题 - len = $(".results-table tr").filter(":not(:first)")选择。您可以做的就是至少保留该部分选择的结果(将此变量保留在您正在迭代的函数之外):

var cached_trs = $(".results-table tr").filter(":not(:first)");

然后在您使用过滤器进行迭代的函数中,您可以执行以下操作:

var len = cached_trs.filter(":has(.hidden-row[duplicate-id='" + dupId + "'])").length

关于jquery - 可以修改这个 jQuery 以使其运行得更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244662/

相关文章:

javascript - 如何在 IE6 或 7 中淡出一行 (TR)

jquery - 如何避免两个版本的Jquery库之间的冲突?

php - 有效地查找表中不存在的第一个数字?

r - 如何有效地将顺序变量添加到大数据框

PHP 性能注意事项?

javascript - jquery ajax 在 str.replace 后不工作

html - css: column-count property , IE10 显示不像其他浏览器

javascript - 如何通过 Ajax post 接收表单 NAME?

javascript - :not() in various guises isn't working

javascript - 为什么 jQuery 轮播不能与 iframe 一起使用?