有没有更好的方法来使用jQuery按类查找单个元素?

时间:2011-07-30 01:06:45

标签: jquery performance

我经常发现自己通过抓取模板,克隆它,将其设置为变量,并使用find('。class')来查找其下的元素,然后为它们分配唯一ID,来构建列表项行或其他内容。否则在将列表项附加到我正在做的任何列表之前使用它们。

例如,如果我有一个项目列表,所有这些项目都是从模板设置的,并且包含由类指定的子项目,我会做这样的事情(没有经过测试,只是一个流程示例):

// Create my list item.
$ListItem = $('#list_item_template').clone();

// Set the id for the first field so I can work with it directly later.
$ListItem.find('.field_one).attr('id', 'field_one_'+ListItemID).val('field one value for this list item');

// Set the id for the second field so I can work with it directly later.
$ListItem.find('.field_two).attr('id', 'field_two_'+ListItemID).val('field two value for this list item');

// Add the item to the list
$ListItem.appendTo($List);

现在,我可以访问第X个列表项的第一个“字段”,如$('#field_one_ [ListItemID]。

问题是,即使我正在指定$ ListItem,我知道当我使用find('。field_one')来查找要添加id的字段时,它遍历模板中的每个元素以查找该类。这不是一个性能损失,但如果它是一个长列表,或一个长模板,它会加起来。

有更有效的方法吗?你可以从一个名为.findOnce()的函数中得到一些东西......?

谢谢!

3 个答案:

答案 0 :(得分:4)

这取决于您的DOM设置方式。 children()find()快,例如parent()parents()更快。

示例:$ListItem.children('.field_one')

答案 1 :(得分:2)

您可以使用:first selector

http://api.jquery.com/first-selector/

$ListItem.find('.field_one:first') ....

就个人而言,我没有把$作为js变量的前缀。它会与来自jquery的$混淆。

只需使用var ListItem

答案 2 :(得分:0)

我不确定您是否需要为其分配ID。您可以通过$ListItem.find('.field').index(0)引用该项目,或使用第n个子选择器$ListItem.find('.field:nth-child(1)')