2011-04-20 9 views
51

Zwykle, gdy używam klasy jako selektora, próbuję użyć selektora "id", aby nie przeszukiwać całej strony, ale tylko obszaru, w którym klasa byłaby.Wiele łańcuchów selektora w jQuery?

Jednak mam częściowy widok z kodem w nim. Ten częściowy widok (wspólny kod) zostaje zawijany wokół znacznika formularza.

mam:

<form id="Create"> 
// load common code in from partial view 
</form> 

<form id="Edit"> 
// load common code in from partial view 
</form> 

Teraz w tym wspólnym kodem muszę podłączyć wtyczkę do wielu dziedzinach tak zrobiłbym

$('#Create .myClass').plugin({ options here}); 

$('#Edit .myClass').plugin({options here}); 

Więc to dość dużo ten sam kod. Zastanawiam się, czy istnieje sposób, aby sprawić, by wyglądał na jeden z identyfikatorów?

Edit

mam problemy z nim, kiedy mam zmienne dla moich selektorów

my.selectors = 
    { 
     A: '#Create', 
     B: '#Edit', 
     Plugin: ' .Plugin' 
    }; 

$(selector.A+ selectors.Plugin, selector.B+ selectors.Plugin) 

nie wydaje się działać.

Odpowiedz

71

Można połączyć kilka selektorów z przecinkiem:

$('#Create .myClass,#Edit .myClass').plugin({options here}); 

Lub jeśli masz zamiar mieć kilka z nich, można dodać klasę do wszystkich elementów formularza, a następnie wyszukać w ramach tej klasy. To nie daje ci rzekomych oszczędności prędkości ograniczających wyszukiwanie, ale szczerze mówiąc, nie martwiłbym się tym zbytnio, gdybym był tobą. Przeglądarki robią wiele ciekawych rzeczy, aby zoptymalizować typowe operacje za plecami - prosty selektor klasy może być szybszy.

6

lubię:

$('#Create .myClass, #Edit .myClass').plugin({ 
    options: here 
}); 

Można określić dowolną liczbę selektorów połączyć w jeden wyniku. Ten kombinator wielu kombinacji jest skutecznym sposobem na wybór różnych elementów. Zamówienie elementów DOM w zwróconym obiekcie jQuery może nie być identyczne, ponieważ są one w porządku dokumentu. Alternatywą dla tego kombinatora jest metoda .add().

37

$("#Create").find(".myClass").add("#Edit .myClass").plugin({});

użytkowania $.fn.add celu połączenia dwóch zestawów.

8

Myślę można zobaczyć nieco lepszą wydajność robiąc to w ten sposób:

$("#Create, #Edit").find(".myClass").plugin(){ 
    // Options 
}); 
0

Istnieją już bardzo dobre odpowiedzi tutaj, ale w niektórych innych przypadkach (nie w szczególności) używanie mapy może być rozwiązaniem "jedynym".

Szczególnie, gdy chcemy używać wyrażeń regularnych innych niż standardowe.

W tym przypadku będzie to wyglądać tak:

$('.myClass').filter(function(index, elem) { 
    var jElem = $(elem); 

    return jElem.closest('#Create').length > 0 || 
      jElem.closest('#Edit').length > 0; 

}).plugin(...); 

Jak powiedziałem wcześniej, tutaj to rozwiązanie może być bezużyteczny, ale do dalszych problemów, jest bardzo dobrym rozwiązaniem

Powiązane problemy