2013-06-24 8 views
6

Mam kilka elementów listy z atrybutem. Chcę wybrać tylko dwa lub trzy z nich naraz. Obecnie jestem split ing listę oddzielonych przecinkami identyfikatorów następnie tworząc tablicę dla selektorów jQuery powrót:selektor atrybutu jQuery, gdzie wartość zawiera wartość w tablicy

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

To wydaje się być dość kosztowne podejście do Firefoksa. Czy istnieje sposób na zoptymalizowanie tego, abym mógł wybrać dowolny li z atrybutem id danych zawierającym dowolny identyfikator?

Coś podobnego do poniższego, ale wybierając jedną z wartości?

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

[edytuj]

Dzięki komentarzu @Alnitak „s I zmieniły moje pętle do:

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]+'"]'); 
} 

Ten wydał duża poprawa, ale jest tam jeszcze mogę zrobić?

+3

nie używać 'dla ... in' na tablicach - to na wyliczanie _object keys_ nie _array indices_. – Alnitak

+0

Dzięki. Zmieniłem 'for ... in' dla' for (var i = 0; i

Odpowiedz

9

Jak o:

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/

+0

To dało mi najlepszą poprawę wydajności. Zmieniono selektor tak, aby zawierał klasę div i ul klasę: 'var selector = '.container ul.class li [data-id ="'; $ (selector + ids.join ('")' + selector) + ""]). addClass ("aktywny"); ' –

+1

@ RichardParnaby-King _ To dało mi najlepszą poprawę wydajności. Nie sądzę, na podstawie jakiego kryterium? – undefined

4
var ids = $(this).text().split(','); 

$.each(ids, function(k, v){ 
    $('.container ul.class li[data-id="' + v + '"]').addClass('active'); 
}); 
+0

Próbowałem tego. To działa, ale staram się zoptymalizować ten skrypt, aby wykonać jak najmniej wywołań/aktualizacji w domenie (nie wyjaśniono tego w pytaniu, ale powinno być). Dlatego tworzę tablicę selektorów i wykonuję aktualizację jednej domeny na końcu pętli. –

8

Można użyć filter metody:

$('.container ul.class li').filter(function() { 
    return ids.indexOf($(this).data('id')) > -1; 
}).addClass('active'); 
+0

+1 nawet ja wiem, że jego nadmiarowa, ale starsza wersja IE nie obsługuje metody indexOf dla tablic –

+0

@roasted Tak, to prawda, dla _IE_ można użyć zamiast niej '$ .inArray' jQuery. – undefined

1

Należy bardziej wydajnych, aby zaznaczyć wszystkie elementy z atrybutem data-id raz, a następnie filtrować tę listę na podstawie wartości atrybutu:

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 
+0

Tablica identyfikatorów ids jest konwertowana na łańcuchy '[" 1 "," 13 "," 27 "]' i myślę, że '$ .inArray' jest również sprawdzane podczas rzutowania, więc zawsze zwraca -1. –

+0

@ RichardParnaby-King: Zwracaną wartością 'getAttribute' jest ciąg znaków, podobnie jak wartości w' ids'. Nie rozumiem, dlaczego to powrócił -1. – Jon

0

myślę, że to będzie bardziej zoptymalizowany podejście:

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'); 
Powiązane problemy