2014-07-08 9 views
14

Używam Bootstrap i paski tabeli, które można filtrować, wybierając niektóre opcje w formularzu. JavaScript interpretuje dane wejściowe formularza i ukrywa wiersze w tabeli, które nie są zgodne z wybranymi kryteriami.Ponownie stosuj tabelę po ukryciu wierszy (Twitter Bootstrap)

Jednak powoduje to rozbicie pasków tabeli na stole w zależności od tego, które rzędy są ukryte (szare rzędy obok szarych rzędów, białe rzędy obok białych rzędów).

Chciałbym ponownie zastosować paski w zależności od tego, które wiersze są widoczne po przefiltrowaniu wyników. Jak mogę to zrobić?

Użycie .remove() w wierszach tabeli nie jest opcją, ponieważ może być konieczne ponowne wyświetlenie, jeśli kryteria filtru ulegną zmianie i staram się unikać używania AJAX do dynamicznej aktualizacji tabeli na podstawie danych wejściowych filtru (Chciałbym pozostać przy ukrywaniu elementów DOM).

Każda pomoc jest doceniana! Mogę wyjaśnić pytanie w razie potrzeby :)

+2

Naprawdę dobry artykuł na ten temat, który oferuje szereg rozwiązań: http://christianheilmann.com/2013/12/12/zebra-tables-using-nth-child-and-hidden-rows/ –

Odpowiedz

4

Tak, jest to zdecydowanie jedna z denerwujących części pasków. Lepsza część męstwo tutaj jest chyba tylko do ponownego zastosowania przeplot z jQuery po każdej aktualizacji:

$("tr:not(.hidden)").each(function (index) { 
    $(this).toggleClass("stripe", !!(index & 1)); 
}); 
+0

Dzięki! Spróbuję tego i skontaktuję się z tobą. – Andrew

+1

Tak, istnieją rozwiązania, w których przenosisz rzędy, gdzie masz naprawdę szalone sztuczki CSS, ale w tym przypadku wiesz, kiedy aktualizacje się dzieje, więc po prostu zrobiłbym to nudne. :) –

5

odpowiedź Anthony nie działa dla mnie. Po pierwsze, nie ukrywa tabeli Bootstrap klasy table-striped, a po drugie, nie ma (lub przynajmniej nie wydaje się być) wbudowanej klasy stripe dla wierszy tabeli.

Oto moje podejście, w którym odfiltrowałem wiersze w tabeli o identyfikatorze "raportów".

Oto wersja użyć jeśli zdefiniowanie klasy „pasek” na <tr> elementów:

// un-stripe table, since bootstrap striping doesn't work for filtered rows 
$("table#reports").removeClass("table-striped"); 

// now add stripes to alternating rows 
$rows.each(function (index) { 
    // but first remove class that may have been added by previous changes 
    $(this).removeClass("stripe"); 
    if (index % 2 == 0) { 
    $(this).addClass("stripe"); 
    } 
}); 

Jeśli jesteś zbyt leniwy, aby zdefiniować klasę CSS „pas”, a następnie oto szybkie & brudna wersja:

// un-stripe table, since bootstrap striping doesn't work for filtered rows 
$("table#reports").removeClass("table-striped"); 

// now add stripes to alternating rows 
$rows.each(function (index) { 
    // but first remove color that may have been added by previous changes: 
    $(this).css("background-color", "inherit"); 
    if (index % 2 == 0) { 
    $(this).css("background-color", "#f9f9f9"); 
    } 
}); 
+0

Powyższe zabije klasę hover, którą można zastosować za pomocą '.table-hover', ponieważ styl wstawiany ma pierwszeństwo. Zdecydowanie zdecydowałbym się na użycie klasy. – Mike

+0

W pierwszym bloku kodu dodajesz drugie wystąpienie klasy '.stripe' do każdego innego wiersza, tak jak dodałeś już to wszystko do 2 wierszy wcześniej. Bardziej wydajnym sposobem robienia tego, a nie rozbijania go, jest usunięcie tego pierwszego '$ (this) .addClass (" stripe ");' przed instrukcją if. W ten sposób dodajesz klasę do tego, czego jej potrzebujesz, zamiast dodawać ją do wszystkiego, a następnie usuwać z tego, co nie jest potrzebne, co, jak sądzę, próbujesz zrobić. – Mike

+0

@mikemike: whoops - ten pierwszy addClass ma na celu usunięcie klasy ...: płukany: – iconoclast