2013-06-24 108 views
0

我有这个代码,它操纵asp.net treeview html代码。提高jquery选择速度

此代码运行频繁,所以它的重要性在于尽可能快地运行。

我想了解更多关于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(); 
       } 
      } 
     } 
    } 
} 
+0

http://jsperf.com/ – epascarello

+0

@epascarello:我甚至不知道如何使用它,因为这是来自Microsoft专用Microsoft SharePoint环境中的asp.net解决方案。 – omega

+0

确保缓存对象尽可能多,如'var sect = $(sectionNodes [i]);' – mplungjan

回答

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'); 

然后,我do't知道,如果你有不同的方式做到这一点,但如果你能删除“在一个循环中循环”,这将是巨大的。

之后,而不是使用上下文选择($('selector', $element)),使用查找。上下文使用find,所以它会减少函数调用的次数。走这条线,例如:

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

你正在创建2 jQuery对象时,你可以做同样不需要额外的对象,并可以使用.find()

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

基本上,使用.find()而不是背景下,避免创建不需要的jQuery对象。希望这会有所帮助。

+0

这可以使用:'itemTag = curItem.find('td:nth-​​child(3)');'或者我应该使用'.eq(2)'?感觉就像我使用'eq',那么它会得到所有的对象,然后从中得到第n个对象。但是如果我使用了n-child,那么我只会得到1个元素。 – omega

+0

这是一个有趣的问题。我做了一个jsperf(http://jsperf.com/nth-child-vs-eq-56),结果发现'eq'更快。我的猜测是''nth-child'使用条件背后的代码计算子位置(循环jquery对象中的每个元素),而'。eq()'直接进入索引(​​无循环)。 –