javascript - 循环中的 jQuery 性能问题

标签 javascript jquery html asp.net

我有以下 Javascript 在我的弹出窗口中运行,它使用 jQuery 从父窗口中选择选中的复选框,然后对于每个复选框,它再次使用 jQuery 从隐藏字段(也从父窗口)中选择关联的数据。

var chked = $('[name^="mycheckbox_"]:checked', opener.frmMain);
var hdn;
var fieldId;
var data = {};
$.each(chked, function (key, field) {

    hdn = field.id.replace('chk_', 'hdn_');

    data[hdn + 'id'] = $('[name="' + hdn + 'id"]', opener.frmMain).val();
    data[hdn + 'name'] = $('[name="' + hdn + 'name"]', opener.frmMain).val();
});

我遇到的问题是,当有超过一千个复选框时,执行 $.each 循环可能需要一分钟多的时间。如果我在 $.each 循环中注释掉以下几行,那么性能会显着提高:

data[hdn + 'id'] = $('[name="' + hdn + 'id"]', opener.frmMain).val();
data[hdn + 'name'] = $('[name="' + hdn + 'name"]', opener.frmMain).val();

我正在尝试找出如何提高性能,同时仍然加载关联的隐藏字段。一种选择是在循环执行之前使用 jQuery 预先查询隐藏字段,然后在循环中此查询返回的数组中执行查找。但是,我不确定在 $.each 循环中执行数组查找是否会比现有的 jQuery 调用更快。如有任何意见,我们将不胜感激。

最佳答案

我建议使用 Ends With Selector并缓存它返回的元素。这应该消除大部分冗余 DOM 遍历,因为您将能够使用更小的列表进行过滤:

// Retrieve all possible matches from the DOM at once
var $endsInId = $("[name$='id']", opener.frmMain);
var $endsInName = $("[name$='name']", opener.frmMain);

$.each(chked, function (key, field) {

    hdn = field.id.replace('chk_', 'hdn_');

    data[hdn + 'id'] = $endsInId.filter('[name="' + hdn + 'id"]').val();
    data[hdn + 'name'] = $endsInName.filter('[name="' + hdn + 'name"]').val();
});

关于javascript - 循环中的 jQuery 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35492108/

相关文章:

javascript - webpack解析模块 `blueimp-load-image`失败

javascript - 如何判断单击时是否按住了键

javascript - 填充两个 DIV 元素之间的空白区域

javascript - HTML 文本输入 - 阻止 Windows 8 触摸键盘?

javascript - 仅在 IE 中的 JS 数组推送错误

javascript - 如何从 componentDidMount 调用成员函数

javascript - Jquery 悬停在 div 上,在祖 parent 上添加样式

javascript - Web 字体加载的事件处理程序?

javascript - 突出显示 Li 中 , 之后的搜索文本

php - 在 php 中,如何获取 XMLHttpRequest 的 send() 方法的文本/纯文本值