【问题标题】:Improving jquery select speed提高 jquery 选择速度
【发布时间】:2013-06-24 18:00:52
【问题描述】:

我有这段代码可以操作 asp.net treeview html 代码。

此代码经常运行,因此尽可能快地运行很重要。

我想了解更多关于 jquery 选择器和提高其速度的信息。到目前为止,我能够自己获取此代码。

有些事情我不确定是如果你想要第三个子元素,我应该使用[2].eq(2) 还是:nth-child(2)?另外,如果我使用$ 从一组选定的东西中选择一些东西,这是必要的,还是已经选择了?

有人知道我可以做些什么来提高我的 jquery 选择效率吗?

谢谢。

function showResultsOnTreeview(treeviewID, filenameDictionary) {
    var sectionNodes = $("#" + treeviewID + " > table");
    var numOfSections = sectionNodes.length;
    var i, j, sectionName, divContainer, itemNodes, numOfItems, itemName, itemTag, itemPath;

    for (i = 0; i < numOfSections; i += 1) {
        sectionName = $(sectionNodes[i]).text();
        divContainer = $(sectionNodes[i]).next('div');
        divContainer.hide();
        itemNodes = $('table', divContainer);
        numOfItems = itemNodes.length;
        for (j = 0; j < numOfItems; j += 1) {
            itemTag = $('td', $(itemNodes[j])).eq(2);
            itemTag.removeClass('treeViewResult');
            itemName = getNameFromItem($(itemNodes[j]).text());
            itemPath = filenameDictionary[itemName];
            if (itemPath != null) {
                if (itemPath.indexOf(sectionName + "/" + itemName) != -1) {
                    itemTag.addClass('treeViewResult');
                    divContainer.show();
                }
            }
        }
    }
}

【问题讨论】:

  • @epascarello:我什至不知道如何使用它,因为它来自私有 Microsoft 共享点环境中的 asp.net 解决方案。
  • 一定要尽量缓存对象,比如var sect = $(sectionNodes[i]);
  • 所以如果我这样做 $(X),并且这给了我一个大小为 5 的数组,我需要这样做 $(X[0]) 还是已经选择了 X[0] ?
  • 你不知道如何制作不同选择器的简单测试用例?添加一些 HTML 并测试,看看哪个选项运行得最快!

标签: javascript jquery html performance cpu-speed


【解决方案1】:

您可以进行一些优化。第一个肯定是使用.eq() 而不是[]。就像这里一样,你正在创建一个 jQuery 对象:

var sectionNodes = $("#" + treeviewID + " > table");

但后来,你这样做:

sectionName = $(sectionNodes[i]).text();
divContainer = $(sectionNodes[i]).next('div');

在这里,您正在创建另外 2 个不需要的 jquery 对象,您可以这样做:

sectionName = sectionNodes.eq(i).text();
divContainer = sectionName.next('div');

那么,我不知道您是否有其他方法可以做到这一点,但是如果您可以删除“循环中的循环”,那就太好了。

之后,不要使用上下文选择器 ($('selector', $element)),而是使用 find。上下文使用 find 所以它会减少函数调用的数量。以这一行为例:

 $('td', $(itemNodes[j])).eq(2)

当您可以在没有额外对象的情况下执行相同操作并且可以使用 .find() 时,您正在创建 2 个 jQuery 对象:

itemTag = itemNodes.eq(j).find('td').eq(2);

基本上,使用.find() 代替上下文并避免创建不需要的jQuery 对象。希望这会有所帮助。

【讨论】:

  • 可以使用:itemTag = curItem.find('td:nth-child(3)'); 还是应该使用.eq(2)?感觉就像如果我使用eq,那么它将获取所有对象,然后从中获取第 n 个对象。但是如果我使用 nth-child,那么我只会得到 1 个元素。
  • 这是一个有趣的问题。我做了一个 jsperf (jsperf.com/nth-child-vs-eq-56),结果证明eq 更快。我的猜测是 nth-child 在代码后面使用条件来计算子位置(循环遍历 jquery 对象中的每个元素),而 .eq() 直接进入索引(​​无循环)。
猜你喜欢
  • 2011-12-22
  • 2018-05-17
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多