11

我有一堆带有属性的列表项。我想一次只选择其中的两个或三个。目前我正在split使用逗号分隔的 id 列表,然后为 jQuery 创建一个选择器数组以返回:

var ids = $(this).text().split(','); //e.g. text = 1,13,27
var selectors = [];
for (var index in ids)
{
    selectors.push('.container ul.class li[data-id="'+ids[index]+'"]');
}
$(selectors.join(',')).addClass('active');

对于 Firefox,这似乎是一种相当昂贵的方法。有没有办法优化这个,所以我可以选择任何 li 具有包含任何 id 的 data-id 属性?

类似于以下内容,但选择任何值?

var ids = $(this).text().split(','); //e.g. text = 1,13,27
$('.container ul.class li[data-id~="' + ids + '"]').addClass('active');

[编辑]

感谢@Alnitak的评论,我已将循环更改为:

var ids= $(this).text().split(',');
var length = ids.length;
for (var i=0; i<length;i++)
{
    selectors.push('.container ul.class li[data-id="'+ids[i]+'"]');
}

这带来了很大的进步,但我还能做些什么吗?

4

5 回答 5

15

怎么样:

var ids = "21,5,6,7,10".split(",");

// selector produced: [data-id='21'],[data-id='5'],[data-id='6'],[data-id='7'],[data-id='10']
$("[data-id='" + ids.join("'],[data-id='") + "']").addClass("active");

http://jsfiddle.net/3MNDy/

于 2013-06-24T11:28:57.663 回答
9

您可以使用filter方法:

$('.container ul.class li').filter(function() {
     return ids.indexOf($(this).data('id')) > -1;
}).addClass('active');
于 2013-06-24T11:26:56.140 回答
4
var ids = $(this).text().split(',');

$.each(ids, function(k, v){
   $('.container ul.class li[data-id="' + v + '"]').addClass('active');
});
于 2013-06-24T11:26:15.410 回答
1

一次选择具有data-id属性的所有元素,然后根据属性的值过滤该列表应该会更高效:

var $matches = $('.container ul.class li[data-id]').filter(function() {
    return $.inArray(this.getAttribute("data-id"), ids);
});

$matches.addClass('active'); // or whatever else you want to do
于 2013-06-24T11:27:04.463 回答
0

我认为这将是更优化的方法:

var ids = $(this).text().split(','); //e.g. text = 1,13,27
var lis = $('.container ul.class li');
lis.filter(function() {
   return $.inArray($(this).data('id'), ids);
}).addClass('active');
于 2013-06-24T11:30:22.640 回答