Postawiłem przed sobą dość proste zadanie dodania nowego ‚ficzeru’ do pewnej wewnętrznej ministronki w firmie. Ot, taka mała lista obsługiwanych aplikacji. Z biegiem czasu ‚mutacji’ produktu powstało wiele, dlatego lista stała się dość pokaźna i znalezienie czegoś w niej stało się trudne.
Szczerze mówiąc nie szukałem gotowych rozwiązań problemu, czyli dynamicznej wyszukiwarki (wpisujemy np „Apli” i mamy wyświetlone linki zawierające w anchorze część „Apli”), na pewno bym coś takiego znalazł, jednak czasami fajnie jest napisać coś samemu.
Doszedłem do momentu, w którym pomyślałem „kurde, gdyby w js było linq…” – jest. linq.js to darmowa biblioteczka, która daje nam praktycznie wszystko co najlepsze ze znanego nam dobrze LINQ w .net
Powiedzmy, że mamy taki oto html:
1 2 3 4 5 6 7 8 | < input type = "text" id = "search" /> < ul id = "list" > < li >< a href = "#" >A</ a ></ li > < li >< a href = "#" >AB</ a ></ li > < li >< a href = "#" >ABC</ a ></ li > < li >< a href = "#" >ABC</ a ></ li > < li >< a href = "#" >D</ a ></ li > </ ul > |
teraz chcemy uzyskać listę linków, które w anchorze będą zawierać tekst wpisany w #search
1 2 3 4 5 6 | var text = $( '#search' ).val().toLowerCase(); var links = $( '#list li a' ); var result = Enumerable.From(links ) .Where( function (x) { return $(x).text().toLowerCase().indexOf(text)>-1; }) .OrderBy( function (x) { return $(x).text() }) .ToArray(); |
jak widać, możemy korzystać z metod znanych nam z .net + korzystać także z innych bibliotek js, takich jak popularne jQuery
Działający przykład zamieszczam na jsfiddle: http://jsfiddle.net/HGey5/1/ (nie znam na tyle js, ale jeżeli nie robię $(result).clone(), to przy $(‚div’).append(e) kasuje mi elementy z wejściowej listy ul… Nie wiem dlaczego. Z clone() działa )