To, co chcę osiągnąć, to ilekroć <select>
lista rozwijana jest zmieniana. Chcę wartość listy rozwijanej przed zmianą. Korzystam z jQuery w wersji 1.3.2 i używam przy zdarzeniu zmiany, ale wartość, którą tam otrzymuję, jest po zmianie.
<select name="test">
<option value="stack">Stack</option>
<option value="overflow">Overflow</option>
<option value="my">My</option>
<option value="question">Question</option>
</select>
Powiedzmy, że obecnie opcja My jest wybrana teraz, kiedy zmieniam ją na stos w zdarzeniu onchange (tj. Kiedy zmieniłem ją na stos) Chcę, aby była to poprzednia wartość, tj. Moja oczekiwana w tym przypadku.
Jak można to osiągnąć?
Edycja: W moim przypadku mam wiele pól wyboru na tej samej stronie i chcę, aby wszystkie te same elementy były stosowane. Również wszystkie moje zaznaczenia są wstawiane po załadowaniu strony przez ajax.
javascript
jquery
jquery-events
Alpesh
źródło
źródło
Odpowiedzi:
Połącz zdarzenie skupienia ze zdarzeniem zmiany , aby osiągnąć to, co chcesz:
Przykład roboczy: http://jsfiddle.net/x5PKf/766
źródło
$(this).blur();
na końcu funkcji zmianynie używaj do tego globalnego var - zapisz poprzednią wartość w danych tutaj jest przykład: http://jsbin.com/uqupu3/2/edit
kod referencyjny:
właśnie zobaczyłem, że masz wiele wyborów na stronie - to podejście również zadziała, ponieważ dla każdego wyboru zapiszesz poprzednią wartość na danych wybranego
źródło
jQuery.data
tak.select
! Akceptowana odpowiedź zostanie przerwana, ponieważ pasuje do wszystkich,select
ale tylko przechowuje wartość pierwszej.data
jest lepszym sposobem na zrobienie tego. +1 :)Wybieram rozwiązanie Avi Pinto, które wykorzystuje
jquery.data()
Używanie fokusa nie jest prawidłowym rozwiązaniem. Działa przy pierwszej zmianie opcji, ale jeśli pozostaniesz na tym wybranym elemencie i naciśniesz klawisz „w górę” lub „w dół”. Nie przejdzie ponownie przez zdarzenie skupienia.
Tak więc rozwiązanie powinno wyglądać następująco:
źródło
var $selectStatus = $('.my-select'); $selectStatus.on('change', function () { var newStatus = $(this).val(); var oldStatus = $(this).data('pre'); }).data('pre', $selectStatus.val());
$('mySelect').data('pre', $(this).val());
Powinno być tak:$('mySelect').each(function() { $(this).data('pre', $(this).val()); });
Nie mam wystarczającej reputacji, aby edytować odpowiedź: /Śledź wartość ręcznie.
źródło
źródło
Używam zdarzenia „na żywo”, moje rozwiązanie jest w zasadzie podobne do Dimitiar, ale zamiast „skupienia” moja poprzednia wartość jest zapisywana po uruchomieniu „kliknięcia”.
źródło
zachowaj aktualnie wybraną wartość rozwijaną z wybraną jquery w zmiennej globalnej przed zapisaniem rozwijanej funkcji akcji „przy zmianie”. Jeśli chcesz ustawić poprzednią wartość w funkcji, możesz użyć zmiennej globalnej.
źródło
Co powiesz na użycie niestandardowego zdarzenia jQuery z interfejsem typu kątowego;
źródło
Wiem, że to stary wątek, ale pomyślałem, że mogę dodać trochę więcej. W moim przypadku chciałem przekazać tekst, val i kilka innych danych. W takim przypadku lepiej jest przechowywać całą opcję jako wartość poprzednią niż tylko wartość val.
Przykładowy kod poniżej:
EDYTOWAĆ:
Zapomniałem dodać .clone () do elementu. nie robiąc tego, gdy spróbujesz wycofać wartości, w końcu pobierzesz nową kopię zaznaczenia zamiast poprzedniej. Użycie metody clone () przechowuje kopię select zamiast jej instancji.
źródło
Dlaczego nie przechowujesz bieżącej wybranej wartości, a kiedy wybrany element zostanie zmieniony, będziesz mieć zapisaną starą wartość? (i możesz zaktualizować go ponownie, jak chcesz)
źródło
Użyj następującego kodu, przetestowałem go i działa
źródło
źródło
Chciałbym wnieść inną opcję rozwiązania tego problemu; ponieważ zaproponowane powyżej rozwiązania nie rozwiązały mojego scenariusza.
To używa jQuery, więc def. jest tutaj zależnością, ale można ją dostosować do pracy w czystym javascript. (Dodaj detektor do treści, sprawdź, czy pierwotny cel był funkcją select, wykonaj, ...).
Dołączając detektor zmian do treści, możesz być prawie pewien, że uruchomi się on po określonych detektorach dla selekcji, w przeciwnym razie wartość „data-previous” zostanie nadpisana, zanim będziesz w stanie ją odczytać.
Jest to oczywiście założenie, że wolisz używać osobnych detektorów dla poprzedniej wartości i wartości kontrolnej. Pasuje idealnie do wzoru pojedynczej odpowiedzialności.
Uwaga: Dodaje tę „poprzednią” funkcjonalność do wszystkich zaznaczeń, więc w razie potrzeby należy je dostroić.
źródło
To jest poprawa odpowiedzi @thisboris. Dodaje bieżącą wartość do danych, dzięki czemu kod może kontrolować, kiedy zmienna ustawiona na bieżącą wartość jest zmieniana.
źródło
Najlepsze rozwiązanie:
źródło
Istnieje kilka sposobów na osiągnięcie pożądanego rezultatu, to mój skromny sposób:
Niech element zachowa poprzednią wartość, więc dodaj atrybut „previousValue”.
Po zainicjowaniu „previousValue” może być teraz używany jako atrybut. W JS, aby uzyskać dostęp do poprzedniej wartości tego wybierz:
Po zakończeniu korzystania z „previousValue” zaktualizuj atrybut do bieżącej wartości.
źródło
Musiałem ujawnić inny div na podstawie wyboru
W ten sposób możesz to zrobić za pomocą jquery i składni es6
HTML
JS
źródło