加快列表的 jQuery 操作
Speed up jQuery manipulation of a list
我的应用程序有一长串对象,其宽度需要通过jQuery修改。目前我正在使用这样的代码:
$('#my_list div.text_field').each(function() {
// Cache objects we're going to use multiple times.
var $textField = $(this);
var $listContents = $textField.closest('div.list_contents');
// Find widths.
var contentsWidth = $listContents.outerWidth();
var avatarsWidth = $listContents.find('div.avatars').outerWidth();
var tagsWidth = $listContents.find('div.tags').outerWidth();
var textLeft = $textField.position().left;
// Update the width.
var newTextWidth = contentsWidth - textLeft - avatarsWidth - tagsWidth;
$textField.css({ width: newTextWidth });
});
但是,当有数百个对象要操作时,需要一段时间(> 1 秒(。知道我怎样才能让它更快吗?我应该完全避开jQuery并使用本机JS吗?
好的,通过一系列改进,我能够将运行此代码所需的时间(在Chrome 18上对一系列~600个项目(从3000多毫秒减少到70毫秒。
最剧烈的改进来自于在原始HTML元素上使用offsetWidth,而不是jQuery的outerWidth((语句。仅此一项就减少了超过50%的时间:
avatarsWidth = $listContents.find('div.avatars')[0].offsetWidth;
第二个最剧烈的变化来自减少我所做的 DOM 修改的数量。在上面的代码中,我遍历元素,计算它们的宽度,然后立即将这些宽度应用于 DOM。在改进的代码中,我仍然循环计算宽度,但是我随后存储这些宽度,从 DOM 中分离元素,应用存储的宽度,然后重新附加它们。感谢@muffel这个想法。这减少了总时间的 30% 以上:
$('#my_list div.text_field').each(function() {
var $textField = $(this);
// ...
var newTextWidth = contentsWidth - textLeft - avatarsWidth - tagsWidth;
$textField.attr('data-width', newTextWidth);
});
$('#my_list')
.detach()
.find('div.text_field')
.each(function() {
$(this).css({ width: $(this).attr('data-width') });
})
.end()
.appendTo('#container');
第三大改进来自减少我遍历DOM的次数。我没有每次通过循环选择元素,而是预先选择了它们,然后引用了循环中的索引。这构成了其余改进的大部分:
var $avatars = $('#my_list .avatars');
// ...
$('#my_list div.text_field').each(function(i) {
// ...
avatarsWidth = $avatars.eq(i).offsetWidth;
// ...
});
希望这对某人有所帮助!
对于初学者来说,你不需要用$(this(来包装它...除非我错过了什么(我可能是(,否则您应该能够在每个$textfield上下文中使用"this"......这将为您节省函数调用和 var 创建。还要将 var 声明移出函数...这也将节省更多的周期。让我知道这是否加快了速度。
相关文章:
- 是否可以使用Jquery操作窗体的目标窗口
- 如何使用jquery操作iframe对象
- JavaScript:将所见即所得编辑器对实时站点的更改转换为jQuery操作
- jquery操作与匹配项在替换
- JQuery 操作取决于选择的单选按钮 - if/else
- 将jQuery操作应用于特定控件
- 使用jquery操作html的部分内容
- 使用jquery操作::选择
- 如何删除绑定到单击事件的任何jQuery操作
- AngularJS在HTML渲染后使用JQuery操作DOM
- 如何在chrome中使用jquery操作剪贴板数据,IE 8&9
- 防止jQuery操作在滚动时再次发生
- 使用Jquery操作窗体的复选框
- 使用 jQuery 操作 DOM 对象
- 使用 jQuery 操作“选择”中的“删除项”
- 尝试使用 jQuery 操作 CSS 样式
- 无法在 pjax 请求上使用 jQuery 操作 HTML 元素
- 使用 jquery 操作 JSON 数组
- 是否可以对 React.js DOM 树执行所有这些 jQuery 操作
- 如何将链接绑定到我可以使用 Jquery 操作的按钮