Powiedzmy, że mam 4 elementy div z klasą .navlink
, które po kliknięciu służą .data()
do ustawiania wywoływanego klucza 'selected'
na wartość true
:
$('.navlink')click(function() { $(this).data('selected', true); })
Za każdym razem, gdy .navlink
kliknięto nowy , chciałbym zapisać poprzednio wybrany navlink
do późniejszej manipulacji. Czy istnieje szybki i łatwy sposób na wybranie elementu na podstawie tego, co zostało zapisane przy użyciu .data()
?
Wygląda na to, że nie ma żadnych filtrów jQuery : pasujących do rachunku i próbowałem wykonać następujące czynności (w ramach tego samego zdarzenia kliknięcia), ale z jakiegoś powodu to nie działa:
var $previous = $('.navlink').filter(
function() { $(this).data("selected") == true }
);
Wiem, że są inne sposoby, aby to osiągnąć, ale w tej chwili jestem po prostu ciekawy, czy można to zrobić za pomocą .data()
.
$("*").filter(function() { return $(this).data("DATA IDENTIFIER HERE") == DATA VALUE HERE; });
Tylko dla porządku, to można filtrować dane z jQuery (to pytanie jest dość stary i jQuery ewoluowała od tego czasu, więc jest to prawo do pisania tego rozwiązania, jak również):
lub lepiej (dla wydajności):
lub jeśli chcesz otrzymać wszystkie elementy z
data-selected
set:Zauważ, że ta metoda będzie działać tylko z danymi, które zostały ustawione za pomocą atrybutów html. Jeśli ustawisz lub zmienisz dane za pomocą
.data()
wywołania, ta metoda nie będzie już działać.źródło
.data()
metody zamiastdata-
atrybutu. Zobacz to skrzypce: jsfiddle.net/bryandowning/tySWC - również.find()
metoda wyszukuje elementy podrzędne poprzedniego selektora. W podanym przykładziedata-selected
jest atrybutem.navlink
, a nie dzieckiem.navlink
. Ponadto$('div p')
i$('div').find('p')
są zasadniczo równoważne. Używanie.find()
wydaje się być wolniejsze ze względu na dodatkowe wywołanie funkcji (chociaż nie jestem co do tego przekonany). Proszę mnie poprawić, jeśli się mylę w którymkolwiek z tych punktów (naprawdę chciałbym, żeby ta metoda zadziałała)..data()
, ponieważ jQuery przeszukuje DOM, wysłałem go dla tych (takich jak ja), którzy dostali się do tego pytania z innych powodów; 2) poprawne,.find()
przeszukuje dzieci, więc w tym przykładzie jest źle; 3) mylisz się, nie są one równoważne, ponieważ jQuery wyszukuje od prawej do lewej, patrz jonraasch.com/blog/…$('[data-selected]')
pomogło mi w czymś takim jak$('ul.categories a[data-categories_id]').click(......);
Możemy łatwo stworzyć wtyczkę:
Użycie (sprawdzanie przycisku radiowego):
źródło
Zauważyłem dwie rzeczy (mogą to być jednak błędy z czasu, gdy to zapisałeś).
$('.navlink').click
)return $(this).data("selected")==true
)źródło
Brzmi jak więcej pracy niż jej wartość.
1) Dlaczego nie mieć tylko jednej zmiennej JavaScript, która przechowuje odniesienie do aktualnie wybranego elementu \ jQuery obiektu.
2) Dlaczego nie dodać klasy do aktualnie wybranego elementu. Następnie możesz zapytać DOM o klasę „.active” lub coś w tym stylu.
źródło